python單頁面簡單爬蟲實例--百度風雲榜

最近需要收集百度風雲榜上的數據,手工的方式實在是讓人受不了,自學了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","全部")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章