最近需要收集百度风云榜上的数据,手工的方式实在是让人受不了,自学了python一段时间,就利用python写了一个百度风云榜单的爬虫程序,遇到了各种格式转化的问题,好在一个一个都解决了,能够成功爬取到数据,每天执行一次数据就ok了,本来10分钟的事情,现在2s就解决了。最近越来越喜欢写代码了,之前利用公司框架使用java写爬虫,不够灵活,还有不知为何偏爱python,不仅是代码简单的原因,还有一种原因可能是内心的小阴暗,别个都是用java,我就是不想和你们一样,我就是要用python,哈哈,好吧。
最近一直再使用R,把模型实现了,心情真是超爽,因为心情好,所以利用这个周末分享一下写的python爬虫,发现基本无注释,呃呃,看来代码习惯有些不好,以后慢慢改正。
爬虫的两大利器xpath和正则表达式,由于比较熟悉的是利用xpath,这里选择用xpath,正则表达式还需要再学习一下。
工具:python2.7 ,pyCharm,火狐浏览器,xpath,firebug
代码如下:
#!usr/bin/python
# -*- coding: utf-8 -*-
import sys
import urllib2
from lxml import etree
import codecs
import time
def fetch(url):
request=urllib2.Request(url=url)
response=urllib2.urlopen(request)
status_code = response.getcode()
if status_code != 200:
print "Error : ", status_code
else:
print "Succesful!"
content=response.read()
bd_temp=open('E:\\python_store\\data\\bd_temp.txt','w')
bd_temp.write(content)
bd_temp.close()
def parse(file_path,outfile,type):
f=open(file_path,'r')
content=f.read()
f.close()
tree = etree.HTML(content)
works = tree.xpath("//table[@class='list-table']//tr")
# print works
print len(works)
# out_file = open(outfile,'a')
out_file = codecs.open(outfile, 'a', 'gbk')
for i in range(2,len(works)+2,1):
rankstr="//table//tr["+str(i)+"]//td[1]//span//text()"
namestr="//table//tr["+str(i)+"]//td[2]//a[1]//text()"
indexstr="//table//tr["+str(i)+"]//td[4]//span//text()"
up_downstr="//table//tr["+str(i)+"]//td[4]//span/@class"
rank=tree.xpath(rankstr)
name=tree.xpath(namestr)
index=tree.xpath(indexstr)
up_down=tree.xpath(up_downstr)
date=time.strftime("%Y-%m-%d", time.localtime())
reload(sys)
sys.setdefaultencoding('utf-8')
if(len(rank)==0):
pass
else:
list = str(rank[0]) + ',' + str(name[0]) + "," + str(index[0]) + "," + str(date)+","+str(up_down[0])+","+type+","+"\r\n"
print list
out_file.write(list)
out_file.close()
print "success"
调用并输出到指定文件夹,运行,到指定文件夹下查看结果即可。
fetch('http://top.baidu.com/buzz?b=23&c=5&fr=topbuzz_b447_c5')#获取html内容
parse("E:\\python_store\\data\\bd_temp.txt","E:\\python_store\\data\\bd_20160808.csv","全部")