python3 scrapy模拟登陆豆瓣
2018-02-21 03:17
309 查看
首先感谢知乎,在我遇到问题时提问有人及时帮助解决。问题在下面说。
2,进入dangdang,创建爬虫文件
3,判断是否出现验证码(如果出现验证码,则使用xpath获取验证码地址肯定大于0,否则没有验证码直接登陆),通过浏览器抓包分析,得到登录时的from_password及from_email字段。
打开浏览器豆瓣登陆界面,使用chrome检查下的network,
触发一次登陆后,我们的到所要的字段,这些信息就是我们所要的data信息
编写db.py文件
具体代码如下:
4,
其中下载的验证码
1。遇到的问题
由于程序没有做后续的数据处理,所以没有用到pipelines,只在爬虫文件里编辑,在模拟浏览器时也将也将浏览器header写在db.py文件中,在知乎得到答案,USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36',将之写入settings中就可以正常验证登陆。
2。具体过程
1,进入目录创建scrapy项目scrapy startproject douban
2,进入dangdang,创建爬虫文件
scrapy genspider -t basic db douban.com
3,判断是否出现验证码(如果出现验证码,则使用xpath获取验证码地址肯定大于0,否则没有验证码直接登陆),通过浏览器抓包分析,得到登录时的from_password及from_email字段。
打开浏览器豆瓣登陆界面,使用chrome检查下的network,
触发一次登陆后,我们的到所要的字段,这些信息就是我们所要的data信息
编写db.py文件
具体代码如下:
import scrapy import urllib.request from scrapy import Request class DbSpider(scrapy.Spider): name = 'db' allowed_domains = ['douban.com'] #start_urls = ['http://douban.com/'] def start_requests(self):#该方法必须返回一个可迭代对象。该对象包含了spider用于爬取的第一个Request。当spider启动爬取并且未制定URL时,该方法被调用。meta参数的作用是传递信息给下一个函数,下面start_requests中键‘cookiejar’是一个特殊的键,scrapy在meta中见到此键后,会自动将cookie传递到要callback的函数中。既然是键(key),就需要有值(value)与之对应,例子中给了数字1,也可以是其他值,比如任意一个字符串。可以理解为:再次刷新网页时不丢失登陆信息? return [Request('https://accounts.douban.com/login?',callback=self.parse,meta={'cookiejar':1})] def parse(self, response): capt = response.xpath('//div/img[@id="captcha_image"]/@src').extract()#获取验证码地址 url = 'https://accounts.douban.com/login' print(capt) if len(capt)>0:#判断是否有验证 print('有验证码') local_path = 'capt.jpeg' urllib.request.urlretrieve(capt[0], filename=local_path)#保存验证码到本地 print('查看本地验证码图片并输入') capt_id = response.xpath('//div/input[@name="captcha-id"]/@value').extract() captcha_value = input()#验证码 data = {#均从chrome浏览器检查及查看源码抓包来 'form_email': '********',#邮箱账号 'form_password': '********',#密码 'captcha-solution': captcha_value, 'source':'index_nav', 'captcha-id':capt_id, 'redir': 'https://www.douban.com/people/174174633/'#登陆成功要返回的link,我们返回主页 } else: print('没有验证码') data = { 'form_email':'********',#账号 'form_password':'*********',#密码 'source':'index_nav', 'redir':'https://www.douban.com/people/174174633/' } print('login...') return [#使用Scrapy抓取网页时,如果想要预填充或重写像用户名、用户密码这些表单字段, 可以使用 FormRequest.from_response() 方法实现 scrapy.FormRequest.from_response(response, meta={'cookiejar':response.meta['cookiejar']}, dont_filter=False, formdata=data, callback=self.after_login) ] def after_login(self,response):#要爬的数据 print('logined') summary = response.xpath('//*[@id="intro_display"]/text()').extract()#获取登陆后的简介 print(summary[0])
4,
scrapy crawl db --nolog执行,得到结果为:
其中下载的验证码
相关文章推荐
- Python爬虫笔记-豆瓣模拟登陆
- python 模拟登陆豆瓣
- Python爬虫(二十二)_selenium案例:模拟登陆豆瓣
- 运维学python之爬虫高级篇(六)scrapy模拟登陆GitHub和51cto
- Python爬虫模拟登陆豆瓣
- python3 爬虫 模拟登陆豆瓣修改签名
- 第三百四十三节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy模拟登陆和知乎倒立文字验证码识别
- Python爬虫之模拟登陆豆瓣
- Python使用requests库模拟登陆网站的方式--以豆瓣为例
- python scrapy爬取生物谷之模拟登陆(使用FormRequest)
- Python使用requests库模拟登陆网站的方式--以豆瓣为例
- python日常学习笔记4--模拟登陆知乎
- python CSDN模拟登陆(三种方法)
- python爬虫——模拟登陆教务系统
- python3.3教程之模拟百度登陆代码分享
- 超详细的Python实现百度云盘模拟登陆(模拟登陆进阶)
- python爬虫 scrapy框架 知乎zhihu 模拟登陆
- python实战系列之模拟用户密码登陆系统(一)
- Python网络爬虫之模拟登陆
- python模拟登陆知乎(手工识别验证码)