scrapy的登陆学习
目前极大多数网站的有用信息都是需要登陆获取的,这里先学习下git的普通登陆(学习他人),后续学习知乎的登陆(验证码的处理,学习他人)以及B站的登陆和视频的爬取(自我探索),一些网站的登陆和全网站资源爬取(学习他人+自我探索)。
url = 'https://github.com/login'
步骤:
- 分析网站需要提交的内容
- 找寻隐藏元素
- 学习使用Form_Requests
- 对页面进行处理
步骤一:
打开登陆页面查看页面元素点开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
上述代码的一些解释:
- logging是日志报告文件,是用来在程序运行过程中来查看运行信息的,可以用来做debug的功能当然也可以用print。这里的logging.info的作用是当一切按预期运行时输出的信息为括号中内容。
- 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
)
上述代码的一些解释:
- 这里的login和password就是你的账号密码
- 这里dont_click是不单机任何元素将表单提交
- 这里使用github.com/session 是因为其实在页面的form action里是提交到session里处理,所以我们也将数据传入此页面。
- 这个处理完了后其实页面就会自动转入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)