码迷,mamicode.com
首页 > 编程语言 > 详细

python爬虫之scrapy模拟登录

时间:2018-01-05 15:11:33      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:info   import   模拟登录   use   博客   blog   pytho   for   ide   

背景:

  初来乍到的pythoner,刚开始的时候觉得所有的网站无非就是分析HTML、json数据,但是忽略了很多的一个问题,有很多的网站为了反爬虫,除了需要高可用代理IP地址池外,还需要登录。例如知乎,很多信息都是需要登录以后才能爬取,但是频繁登录后就会出现验证码(有些网站直接就让你输入验证码),这就坑了,毕竟运维同学很辛苦,该反的还得反,那我们怎么办呢?这不说验证码的事儿,你可以自己手动输入验证,或者直接用云打码平台,这里我们介绍一个scrapy的登录用法。

 测试登录地址:http://example.webscraping.com/places/default/user/login

 测试主页:http://example.webscraping.com/user/profile

  1、这里不在叙述如何创建scrapy项目和spider,可以看我前面的博客

  2、快速登录方法。

  我们在这里做了一个简单的介绍,我们都知道scrapy的基本请求流程是start_request方法遍历start_urls列表,然后make_requests_from_url方法,里面执行Request方法,请求start_urls里面的地址,但是这里我们用的不再是GET方法,而用的是POST方法,也就常说的登录。

    1、首先我们改写start_reqeusts方法,直接GET登录页面的HTML信息(有些人说你不是POST登录么,干嘛还GET,别着急,你得先GET到登录页面的登录信息,才知道登录的账户、密码等怎么提交,往哪里提交)

    2、start_request方法GET到数据后,用callback参数,执行拿到response后要接下来执行哪个方法,然后在login方法里面写入登录用户名和密码(还是老样子,一定要用dict),然后只用Request子类scrapy.FormRequest这个方法提交数据,这我一个的是FormRequest.from_response方m_法。

  有些人会问,这个from__response的基本使用是条用是需要传入一个response对象作为第一个参数,这个方法会从页面中form表单中,帮助用户创建FormRequest对象,最最最最重要的是它会帮你把隐藏的input标签中的信息自动跳入表达,使用这个中方法,我们直接写用户名和密码即可,我们在最后面再介绍传统方法。

    3、parse_login方法是提交完表单后callback回调函数指定要执行的方法,为了验证是否成功。这里我们直接在response中搜索Welcome Liu这个字眼就证明登录成功。这个好理解,重点是yield  from super().start_resquests(),这个代表着如果一旦登录成功后,就直接带着登录成功后Cookie值,方法start_urls里面的地址。这样的话登录成功后的response可以直接在parse里面写。

 1 # -*- coding: utf-8 -*-
 2 import scrapy
 3 from scrapy import FormRequest,Request
 4 
 5 
 6 class ExampleLoginSpider(scrapy.Spider):
 7     name = "login_"
 8     allowed_domains = ["example.webscraping.com"]
 9     start_urls = [http://example.webscraping.com/user/profile]
10     login_url = http://example.webscraping.com/places/default/user/login
11 
12     def parse(self, response):
13         print(response.text)
14 
15     def start_requests(self):
16         yield scrapy.Request(self.login_url,callback=self.login)
17 
18     def login(self,response):
19         formdata = {
20             email:liushuo@webscraping.com,password:12345678}
21         yield FormRequest.from_response(response,formdata=formdata,
22                                         callback=self.parse_login)
23     def parse_login(self,response):
24         # print(‘>>>>>>>>‘+response.text)
25         if Welcome Liu in response.text:
26             yield from super().start_requests()

登录成功

 技术分享图片

 

python爬虫之scrapy模拟登录

标签:info   import   模拟登录   use   博客   blog   pytho   for   ide   

原文地址:https://www.cnblogs.com/lei0213/p/8203521.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!