利用scrapy爬取豆瓣《三体》短评

1、首先是利用scrapy startproject Santi建立一个项目,项目每个文件的含义其他的博客中已经很清楚了。

参考:https://cuiqingcai.com/3472.html

需要注意文件名命名的时候:spider文件夹里面的主Python文件不能和项目名重复,例如我的项目名称是Santi,那么Python文件名不可以是三体。否则用scrapy runspider Santi.py爬虫时会报错。

Python文件内的class名称和name属性名称没有这个要求,但是要注意Name需要唯一。

2、在class Santi(scrapy.Spider)中,有一些属性是固有的,例如:allowed_domains,start_urls,name,parse等。各个属性的含义如字面意思。

注意:默认第一个request从start_urls触发,如果给定了start_requests,那么start_urls将被忽略,第一个Request由start_request触发。

3、xpath如何使用可以参考http://www.w3school.com.cn/xpath/index.asp

4、关于验证码:利用urllib2库,适用于Python2.7x,读取验证码的图片,通过os.system('eog captcha.jpg')读取。

关于urllib2参考:http://lovesoo.org/python-urllib2%E5%BA%93%E4%BD%BF%E7%94%A8%E5%B0%8F%E7%BB%93.html

5、代码整体结构参考:http://python.jobbole.com/85125/

代码:

# -*- coding: utf-8 -*-
import scrapy
from Santi.items import SantiItem
import urllib2
import os
item=SantiItem()
class Santi(scrapy.Spider):
    name="Santi"
    allowed_domains=['douban.com']
    email='xxxxxxxx@163.com'
    password='xxxxxxxx'
    def start_requests(self):
        return [scrapy.Request('https://accounts.douban.com/login',
                callback=self.parse,
                meta={"cookiejar":1})]
    def parse(self,response):
        captcha=response.xpath('//img[@id="captcha_image"]/@src').extract()
        captchaurl=response.xpath('//img[@id="captcha_image"]/@src').extract()[0]
        crequest = urllib2.Request(captchaurl, None)  
        cresponse = urllib2.urlopen(crequest)
        if len(captcha)>0:
            print '有验证码'
            with open('captcha.jpg','wb') as f:
                f.write(cresponse.read())
            os.system('eog captcha.jpg')
            captchavalue=raw_input()
            print captchavalue+'-------------------'
            data={"form_email":self.email,
                    "form_password":self.password,
                    "captcha-solution":str(captchavalue),
                    "redir":"https://book.douban.com/subject/2567698/comments/"}
        else:
            print '没有验证码'
            data={"form_email":self.email,
                    "form_password":self.password,
                    "redir":"https://book.douban.com/subject/2567698/comments/"}
        return [scrapy.FormRequest.from_response(response,
                                            meta={"cookiejar":response.meta["cookiejar"]},
                                            formdata=data,
                                            callback=self.next,)]
    def next(self,response):
        for i in range(2,20):
            commenturl='https://book.douban.com/subject/2567698/comments/'+'hot?p='+str(i)
            yield scrapy.Request(commenturl,callback=self.comment)
    def comment(self,response):
        for user in response.xpath('//li[@class="comment-item"]'):
            item['name']=user.xpath('.//span[@class="comment-info"]/a/text()').extract()[0]
            item['date']=user.xpath('.//span[@class="comment-info"]/span[2]/text()').extract()[0]
            item['comments']=user.xpath('.//p[@class="comment-content"]/text()').extract()[0]
            yield item

 

posted @ 2017-12-29 10:44  蔺小渊  阅读(439)  评论(1编辑  收藏  举报