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