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","全部")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章