items.py这个文件,如果不用item的话就可以不用写。
1、自动登录豆瓣,所以要知道豆瓣的网址:https://www.douban.com/
2、要找Post表单,打开源文件,找到method="post",可以看到旁边的action="https://www.douban.com/accounts/login,这个url,在一般情况下,不一定是真正的表单,如果有反爬机制强的话,很有可能就不是,所以尽量抓包分析,推荐用抓包工具fiddler。
3、登录需要账号和密码,分析源文件,可以看到name="form_email",name="form_password"前面第一个name是输入账号的字段,第二个是输入密码的字段。
4、豆瓣有反爬机制,所以要用伪装成浏览器和用户代理。我用了header和start_requests(),另外为了处理验证码的问题,我会把cookie保存起来,否则刷新了网页,就会丢失登录信息,所以要保存登录状态。
5、豆瓣在登录成功后会自动跳转到首页,如果想改变的话,在https://accounts.douban.com/login的源文件里找到‘redir’,这个是用来控制跳转后的页面。
6、实际发送表单时,用到FormRequest,所以要导入from scrapy.http import FormRequest,向服务器发送请求。
7、设置post表单数据,分有没有验证码,没有验证码时,只需要账号和密码就好。
"form_email":"xxxxxx",
"form_password":"xxxxxx",
"redir":"https://www.douban.com/people/xxxxx/",
有验证码时:会多一条验证码信息,去找登陆页面源文件关于验证码字段,‘captcha_img’,我们只需要判断这个属性有没有值,也就是长度是否大于0,大于的话就是存在验证码,那我们在表单数据里就要加一条。
"captcha_solution":captcha_value,
8、验证码的处理方式:
8.1、图片识别
8.2、通过接口处理,打码接口
8.3、半自动,就是获取图片到本地,手动输入,再传过去登录。
import scrapy
from scrapy.http import Request,FormRequest
import urllib.request
class DbSpider(scrapy.Spider):
name = 'db'
allowed_domains = ['douban.com']
# start_urls = ['http://douban.com/']
header={"User-Agent:":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"}
def start_requests(self):
return [Request("https://accounts.douban.com/login",callback=self.parse,headers=self.header,meta={"cookiejar":1})]
def parse(self, response):
captcha=response.xpath("//img[@id='captcha_image']/@src").extract()
url="https://accounts.douban.com/login"
if len(captcha)>0:
print("此时有验证码")
localpath="D:/pythonlianxi/douban/captcha.png"
urllib.request.urlretrieve(captcha[0],filename=localpath)#将验证码图片下载到本地再查看。
print("请查看本地验证码图片并输入验证码")
captcha_value=input()
data = {
"form_email": "xxxxxxxx",
"form_password": "xxxxxxx",
"captcha_solution":captcha_value,
"redir":"https://www.douban.com/people/xxxxxx/",
}
else:
print("此时没有验证码")
data={
"form_email":"xxxxxxx",
"form_password":"xxxxxxxx",
"redir":"https://www.douban.com/people/xxxxxx/",
}
print("登录中")
return[FormRequest.from_response(response,
meta={"cookiejar":response.meta["cookiejar"]},#这是固定的用法。
headers=self.header,
formdata=data,
callback=self.next,
)]
def next(self,response):
print("此时已经登陆完成并爬取个人中心")
title=response.xpath("/html/head/title").extract()
print(title[0])