最近需要收集百度風雲榜上的數據,手工的方式實在是讓人受不了,自學了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","全部")