scrapy的登陆学习——git

版权声明:本文real_Rickys原创文章,未经real_Rickys允许不得转载。 https://blog.csdn.net/real_Rickys/article/details/79950479

scrapy的登陆学习

 目前极大多数网站的有用信息都是需要登陆获取的,这里先学习下git的普通登陆(学习他人),后续学习知乎的登陆(验证码的处理,学习他人)以及B站的登陆和视频的爬取(自我探索),一些网站的登陆和全网站资源爬取(学习他人+自我探索)。

url = 'https://github.com/login'

步骤:

  1. 分析网站需要提交的内容
  2. 找寻隐藏元素
  3. 学习使用Form_Requests
  4. 对页面进行处理

步骤一:

 打开登陆页面查看页面元素点开network并勾选preserve log(用来保存日志,否则只是每次响应的链接)
 随便输入密码和账号,点开出现的session发现有login和password参数,并且发现还有一个名为authenticity_token的东西,点开element看源码发现是个隐藏属性。

<input type="hidden" name="authenticity_token" value="jOSRkax4Q4bUpLWHJeeKbOcJA1g/Veq/QxgIHnEKnFMMSF83JYpIeKIiPp749e2nMvHGeDzRxdaNStz6d2QHsg==">

步骤二:

 首先在setting.py中保证COOKIES_ENABLE = true
 重写start_requests并且在函数中拿到authenticity_token的值

# -*- coding: utf-8 -*-
import scrapy
import logging

class LoginSpider(scrapy.Spider):
    name = 'login'
    #allowed_domains = ['github.com/login']

    def start_requests(self):
        start_urls = ['https://github.com/login/']
        for url in start_urls:
            yield scrapy.Request(url = url, meta={'cookiejar':1}, callback = self.post_login)
    def post_login(self, response):
        authenticity_token = response.xpath('.//input[@name = "authenticity_token"]/@value').extract()[0]
        #print(authenticity_token)
        logging.info('authenticity_token='+authenticity_token)
        pass
    def parse(self, response):
        pass
上述代码的一些解释:
  1. logging是日志报告文件,是用来在程序运行过程中来查看运行信息的,可以用来做debug的功能当然也可以用print。这里的logging.info的作用是当一切按预期运行时输出的信息为括号中内容。
  2. meta是将需要传递的信息赋值给这个叫meta的变量,如果在下一个函数中需要用到上一个函数的某个value只需要取出上一个函数的key即可如response.meta[‘key’]。这里cookiejar是一个特殊的键,scrapy在meta中见到此键后就将cookie传到callback中,它的value可以任何值。

步骤三:

 scrapy使用FormRequest类专门用来做表单的提交

post_headers = {
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
        "Accept-Encoding": "gzip, deflate",
        "Accept-Language": "zh-CN,zh;q=0.8,en;q=0.6",
        "Cache-Control": "no-cache",
        "Connection": "keep-alive",
        "Content-Type": "application/x-www-form-urlencoded",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",
        "Referer": "https://github.com/",
    }
 def post_login(self, response):
        authenticity_token = response.xpath('.//input[@name = "authenticity_token"]/@value').extract()[0]
        logging.info('authenticity_token='+authenticity_token)
        login = '****'
        password = '*******'
        yield scrapy.FormRequest.from_response(response,
                                      url='https://github.com/session',
                                      meta={'cookiejar': response.meta['cookiejar']},
                                      headers=self.post_headers,  # 注意此处的headers
                                      formdata={
                                          'utf8': '✓',
                                          'login': login,
                                          'password': password,
                                          'authenticity_token': authenticity_token
                                      },
                                      callback=self.after_login,
                                      dont_click=True
                                      )
上述代码的一些解释:
  1. 这里的login和password就是你的账号密码
  2. 这里dont_click是不单机任何元素将表单提交
  3. 这里使用github.com/session 是因为其实在页面的form action里是提交到session里处理,所以我们也将数据传入此页面。
  4. 这个处理完了后其实页面就会自动转入github.com中

步骤四:

 在已经成功登陆了以后对页面进行操作定义,我是对我的所有仓库进行输出,这里可以用一下crawSpider的rules也可以不用。

    def after_login(self, response):
        for url in self.start_urls:
            yield Request(url=url + '/' + response.meta['login'], meta={'cookiejar': response.meta['cookiejar']},callback=self.parse)

    def parse(self, response):
        print(response.url)
        ans = response.xpath('.//div[@class = "mt-4"]')
        ans = ans.xpath('.//li')
        for a in ans:
            s = a.xpath('.//a[@class = "text-bold"]/@href').extract()
            if len(s) != 0:
                print(s)
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页