python中lxml+cssselect爬取豆瓣电影Top250

上一篇博客已经说了,本想参考[这篇博客](http://blog.csdn.net/fighting_no1/article/details/50926008)博客爬取豆瓣电影T250的,谁知最后竟是乱码和编码的问题,解决方式呢,上一篇已经说了。我又重新按照自己的学的东西采用lxml和cssselect做了一遍,速度也挺快,效果还行,但是需要注意的是输出文件是csv文件,用excel打开时会是乱码,这时只需要用记事本打开然后另存为ANSI然后再用excel打开就能正常看中文了。代码如下:

#!/usr/bin/python
#-*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf8')
import re
import csv
import lxml.html
import time
import datetime
import codecs
import urllib2
def askURL(url):
    request = urllib2.Request(url)#发送请求
    try:
        response = urllib2.urlopen(request)#取得响应
        html= response.read()#获取网页内容
    except urllib2.URLError, e:
        if hasattr(e,"code"):
            print e.code
        if hasattr(e,"reason"):
            print e.reason
    return html


def main():
    remove=re.compile(r'                            |
|\.*') baseurl = 'https://movie.douban.com/top250?start=' datalist=[] for i in range(0,10): url=baseurl+str(i*25) html=askURL(url) html=html.decode('utf-8').replace(u'\xa0', u' ') tree = lxml.html.fromstring(html) items=tree.cssselect('div.item')#找到每一个影片项 for item in items: data=[] td=item.cssselect('div.hd a span.title')#片名可能只有一个中文名,没有外国名 if(len(td)==2): ctitle=td[0].text_content() data.append(ctitle)#添加中文片名 otitle=td[1].text_content().replace(u'\xa0', u' ') otitle=otitle.replace(" / ","")#去掉无关符号 data.append(otitle)#添加外国片名 else: data.append(td[0].text_content())#添加中文片名 data.append(' ')#留空 rating=item.cssselect('span.rating_num')[0] data.append(rating.text_content())#添加评分 judgeNum=item.cssselect('div.star span')[3] judgeNum=judgeNum.text_content().replace('人评价','') data.append(judgeNum)#添加评论人数 inq=item.cssselect('p.quote') #可能没有概况 if len(inq)!=0: inq=inq[0].text_content().replace("。","").strip()#去掉句号和没用的空格 data.append(inq)#添加概况 else: data.append(' ')#留空 bd=item.cssselect('p')[0] bd=bd.text_content().replace(u'\xa0', u'/') bd=bd.encode('GBK','ignore') bd=bd.decode('GBK') bd=re.sub(remove,"",bd) bd=re.sub('\n',"|",bd)#去掉
bd=re.sub(': ',":",bd)#替换/ bd=re.sub('
',"",bd)#去掉
bd=re.sub('///',"|",bd)#替换/ words=bd.split("|") for s in words: if len(s)!=0 and s.strip()!='': #去掉空白内容 data.append(s) #主演有可能因为导演内容太长而没有 if(len(data)!=10): data.insert(6,' ')#留空 datalist.append(data) return datalist def saveData(datalist,savepath): with open(savepath, 'wb') as fp: fp.write(codecs.BOM_UTF8) writer = csv.writer(fp) writer.writerow(['影片中文名','影片外国名', '评分','评价数','概况','导演','主演','年份','地区','类别']) for i in datalist: writer.writerow(i) fp.close() if __name__ == '__main__': start=datetime.datetime.now() print u"程序开始时间:%s\n" % str(start) savepath=u'我的豆瓣_2.csv' datalist=main() saveData(datalist, savepath) end=datetime.datetime.now() print u"程序结束时间:%s" % str(end) print u"总耗时:%s" % str(end-start)
目测粘贴的代码缩进大体没事,有问题的话可以自己调试一下,注意我是在win32的WingIDE下调试的程序。

你可能感兴趣的:(python)