Php爬虫伪登陆,爬虫——伪装登陆和获取数据

本文介绍了如何使用Python的requests库模拟登陆知乎的过程,包括获取验证码、反盗链_xsrftoken、登录数据的构造及POST请求。通过Fiddler抓包分析登陆请求,详细阐述了每个步骤的关键信息,如登陆网址、header、验证码获取和手动输入、_xsrftoken的解析。最后,展示了登录成功后的JSON响应数据。
摘要由CSDN通过智能技术生成

首先,我们来获取数据找点感觉。python3中urllib和urllib2合并为了urllib一个库,当然若要考虑兼容,也可以这么写:

try:

​from

urllib2 import request

except:

from urllib import

request

resp =

request.urlopen(r'http://www.google.com.hk/')

print(resp)

当然这段代码通常得不到想要的结果,原因嘛,哈哈。我就是无聊来这么一发而已。

​然后我们也不打算用这个库,毕竟技术需要为项目服务。好了,直接开始。

知乎采用HTTPS协议,但目前似乎并不完全是,那我们就边用边抓好了。

(1)正常登陆,使用fiddler查看浏览器生成的网页数据请求信息:​

a4c26d1e5885305701be709a3d33442f.pngFiddler抓取到的登陆数据

可以看到登陆网址为https://www.zhihu.com/login/phone_num,若使用邮箱登陆则后缀为login/email,登陆请求为post方法,这里的header信息需要以dict传递。然后我们再看webform提交的信息如下:

a4c26d1e5885305701be709a3d33442f.pngwebform表单

这里需要得到两个数据,分别是captcha和_xsrf,也就是验证码和反盗链。其中验证码地址,使用chrome工具查看登陆页面如下:

a4c26d1e5885305701be709a3d33442f.pngcaptcha地址

所以,我们只需如此这般~​

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

captcha_url = 'http://www.zhihu.com/captcha.gif?r=' + t +

"&type=login"

r = requests.session.get(captcha_url,

headers=headers)​

得到验证码返回的response,可以使用pillow等库进行图像识别,当然对于复杂的验证码可能还需要训练识别模型,在这里同上,我们只求最快,将验证码写入文件手动输入:

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

f.write(r.content)

f.close()

captcha = input("please

input the captcha:")

有一个小技巧是每次输入之前,调用os模块将图片打开,程序员应该懒一点……

接下来处理反盗链,这里直接get知乎首页,进行解析如下:

response = requests.session.get('http://www.zhihu.com',

headers=headers, verify=False).text

soup =

BeautifulSoup(response,

"html.parser")​

xsrf = soup.find('input', {'name': '_xsrf'})['value']

通常抓取到页面信息,需要写下来或者打印出来,以便分析该如何进行提取。同样的,

with

open(“soup”,"wb")

as f:

f.write(soup.encode())

f.close()​

至此,我们拥有信息:

headers = { 'Connection':

'keep-alive','Accept-Encoding':

'gzip, deflate,

br','Accept-Language':

'Accept-Language:

zh-CN,zh;q=0.8','User-Agent':

'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36

(KHTML, like Gecko) Chrome/53.0.2785.101

Safari/537.36','X-Requested-With':

'XMLHttpRequest','Host':

'www.zhihu.com','Referer':

'https://www.zhihu.com/',}​

login_data = {

'remember_me':

'true'​

'password':''

'phone_num'​:''

'_xsrf'​:xsrf

'captcha'​:captcha

}

responsed =

request.session.post("https://www.zhihu.com/login/phone_num",headers=headers,

data=login_data),

到这里,可以打印responsed的json数据,查看登陆结果:

if 0 ==

responed.json()['r']:

​print("login successfully!") # print(responed.text)

​else:

print("login failed!")​

a4c26d1e5885305701be709a3d33442f.png登陆成功返回json数据

至此,我们伪装登陆成功。饿死自己是不道德的,我去吃饭,周末决定出去浪,回头再继续更新维持登陆和获取信息。

另,不小心居然又长了一岁,最初写爬虫的目的也有了变化,所以接下来会调整策略,进行完整爬取而不是特定寻找某人,并且用得到的数据进行推荐演化,当然那是以后的事情了。​

再吐槽一句,新浪博客添加源代码这么费劲,还是我打开的方式不对呢?​

​​

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值