失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > python全系列之爬虫scrapy_python爬虫scrapy之登录知乎

python全系列之爬虫scrapy_python爬虫scrapy之登录知乎

时间:2020-07-24 03:57:55

相关推荐

python全系列之爬虫scrapy_python爬虫scrapy之登录知乎

下面我们看看用scrapy模拟登录的基本写法:

注意:我们经常调试代码的时候基本都用chrome浏览器,但是我就因为用了谷歌浏览器(它总是登录的时候不提示我用验证码,误导我以为登录时不需要验证码,其实登录时候必须要验证码的),这里你可以多试试几个浏览器,一定要找个提示你输入验证码的浏览器调试。

1、我们登录的时候,提示我们输入验证码,当验证码弹出之前会有个请求,我们打开这个请求,很明显,type是login,验证码无疑了,就算是看请求的因为名,你也应该知道这个就是验证码的请求,或者打开这个验证码的请求url,这。

验证码的图片,悲惨了,这怎么整。别着急。。

2、验证码提示我们要点击倒着写的字体,这。。。,爬虫和反爬虫就是无休止的互相折磨。这明显就是上面那个图片的信息。

3、机智的我,发现验证码的请求参数里面有三个参数,r是一个13位的数字,type是登录用的,lang很可疑,改改它,把cn给他改成en。

代码如下:

import json

import scrapy

import time

from PIL import Image

class ZhihuloginSpider(scrapy.Spider):

name = ‘zhihu_login‘

allowed_domains = [‘‘]

start_urls = [‘/‘]

header = {

‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,‘

‘ like Gecko) Chrome/62.0.3202.94 Safari/537.36‘,

}

def parse(self, response):

#主页爬取的具体内容

print(response.text)

def start_requests(self):

‘‘‘

1、首先构造并抓取登录需要提交的验证码

:return:

‘‘‘

t = str(int(time.time() * 1000))

captcha_url = ‘/captcha.gif?r={0}&type=login&lang=en‘.format(t)

return [scrapy.Request(url=captcha_url, headers=self.header, callback=self.parser_captcha)]

def parser_captcha(self, response):

‘‘‘

1、根据start_requests方法返回的验证码,将它存入本地

2、打开下载下来的验证码

3、这里是需要手动输入的,这里可以接入打码平台

:param response:

:return:

‘‘‘

with open(‘captcha.jpg‘, ‘wb‘) as f:

f.write(response.body)

f.close()

try:

im = Image.open(‘captcha.jpg‘)

im.show()

im.close()

except:

pass

captcha = input("请输入你的验证>")

return scrapy.FormRequest(url=‘/#signin‘, headers=self.header, callback=self.login, meta={

‘captcha‘: captcha

})

def login(self, response):

xsrf = response.xpath("//input[@name=‘_xsrf‘]/@value").extract_first()

if xsrf is None:

return ‘‘

post_url = ‘/login/phone_num‘

post_data = {

"_xsrf": xsrf,

"phone_num": ‘你的账户名称‘,

"password": ‘你的账户密码‘,

"captcha": response.meta[‘captcha‘]

}

return [scrapy.FormRequest(url=post_url, formdata=post_data, headers=self.header, callback=self.check_login)]

# 验证返回是否成功

def check_login(self, response):

js = json.loads(response.text)

print(js)

if ‘msg‘ in js and js[‘msg‘] == ‘登录成功‘:

for url in self.start_urls:

print(url)

yield scrapy.Request(url=url, headers=self.header, dont_filter=True)

else:

print("登录失败,请检查!!!")

如果觉得《python全系列之爬虫scrapy_python爬虫scrapy之登录知乎》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。