爬虫之模拟登入,Scrapy模拟登6今日头条

近期应朋友供给,帮衬爬取了小红书创作平台的数目,以为整个经过很风趣,由此记录一下。在那前面本身没怎么爬过要求账户登入的网址数据,所以刚开头去看小红书的登入认证时3头雾水,等到一步步走下去,最终水到渠成,思路通了感觉其实仍然相当的粗略。

图片 1

图片 2

 杀鸡取蛋思路

之前用Scrapy把
伯乐在线上的持有的篇章爬取下来,还策画把相亲板块爬取下来。不过伯乐在线不用登入就能够爬撤除息,也没怎么看头,所以就选用试着用Python模拟登六搜狐。

 一同来本身就只有这么五个网站小红书创作平台,和登陆账号、密码,然后通过多次试错分析,最后拿出了缓慢解决方案。要爬取那一个平台的数额,最主题的便是行使
python 模拟浏览器登陆进去。研究历程:

Scrapy爬虫教程1 Windows下安装Scrapy的不贰法门和主题素材总结

蒙受和开辟工具

  • Python3.6+macOS
  • Firefox

 1、在登入分界面点击用密码登入,输入账号密码验证码,通过
chrome 调节和测试工具查看请求的 header 会发掘,登6时是通过 POST
格局,请求的莫过于地址是:
值,当中 zone 是指你所在的国度的区号,举例中夏族民共和国为+八6,因而值为
八陆。那么这里管理比较困难的正是 token 和 captcha

Scrapy爬虫教程2 浅析最烦人的反爬虫手腕

仿照登六的历程

  • 运用浏览器查看客户端和服务器间的通信

  • 查阅发送请求时索要传送的参数

  • 运用Python构造壹组参数向服务器发起呼吁

    #### 必要小心的标题

    • 亟需向哪个ULX570L发起呼吁
    • 须求传送哪些参数
    • 如何接纳session和cookie保持登入的景况
    • 当供给输入验证码的时候怎么操作

图片 3

Scrapy爬虫教程三 详细的Python Scrapy模拟登入腾讯网

翻开参数

率先展开天涯论坛的首页
https://www.zhihu.com

图片 4

登录

图片 5

直观上看,需求输入二个账号和1个密码,具体向哪些url发起呼吁一时不能查看,然而大家得以试一下输入三个错误的账号密码,然后通过查看客户端和服务器端的通讯来查阅一些参数。

图片 6

翻看必要倡导呼吁的UCR-VL

图片 7

参数

因此Firefox查看到了1部分不能够不的参数,例如_xsrf、password、phone_num,captcha_type(后来发掘把cn去掉验证码更简约。),就像只须要将这几个数据POST到/login/phone_num就能够落成登陆。
选用email模拟登入操作和地方是一致的。
那多少个参数中,_xsrf看上去有点特殊一点

CSENCOREF(克罗丝-site request forgery)跨站请求伪造,也被称呼“One Click
Attack”只怕Session
Riding,日常缩写为CSCR-VF恐怕XSEnclaveF,是一种对网址的恶意使用。就算听起来像跨站脚本(XSS),但它与XSS分外例外,XSS利用站点内的信任用户,而CS大切诺基F则经过伪装来自受注重用户的恳求来利用受依赖的网址。

经过在网页上询问,开掘了这些参数,只有将以此自由发生参数放在POST中才干将呼吁发送到目的ULANDL

图片 8

二、token 哪儿来的?是哪些值?captcha
是图表验证码,怎么管理?作者发觉开始展览在登入分界面点击用密码登陆那些操作时,实际实行了一回GET
请求,请求的地址
token,还有1个是验证码图片链接。怎么着?有未有极高兴,须要什么就来什么。

Scrapy爬虫教程四 Scrapy+Selenium有浏览器分界面模拟登入天涯论坛

代码落成

在这些宪章登六的进度中,重若是用到requests来开始展览呼吁,然后记录下新闻到cookie中有益将来不用输入账号密码登6。

import requests
#python2中是cookielib,Python3中是http下的cookiejar
try:
    import cookilelib
except:
    import http.cookiejar as cookielib
# 使用登录cookie信息
session = requests.session()
session.cookies = cookielib.LWPCookieJar(filename='cookies.txt')
try:
    session.cookies.load(ignore_discard=True)
except:
    print("Cookie 未能加载")

率先步是安装好请求的headers

headers = {
    "HOST":"www.zhihu.com",
    "Referer":"https://www.zhihu.com",
    "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:55.0) Gecko/20100101 Firefox/55.0"
}

透过下边包车型客车参数查看,当中账号密码由本人输入,_xsrf在网页代码中用正则表达式恐怕用scrapy的选拔器找到:

import re
# 获得_xsrf
def get_xsrf():
    response=session.get("https://www.zhihu.com",headers=headers)
    match_obj= re.match('.*name="_xsrf" value="(.*?)"',response.text,re.S)

    if match_obj:
        return match_obj.group(1)
    else:
        return ""

将大家在网页中观望的须要的参数POST到目的U奥迪Q5L中就能够效仿登入了

def zhihu_login(account, password):
    #知乎登录
    if re.match("^1\d{10}",account):
        print ("手机号码登录")
        post_url = "https://www.zhihu.com/login/phone_num"
        post_data = {
            "_xsrf": get_xsrf(),
            "phone_num": account,
            "password": password,
        }
    else:
        if "@" in account:
            # 判断用户名是否为邮箱
            print("邮箱方式登录")
            post_url = "https://www.zhihu.com/login/email"
            post_data = {
                "_xsrf": get_xsrf(),
                "email": account,
                "password": password,
            }

    response = session.post(post_url, data=post_data, headers=headers)
     #将登录的信息进行保存
    session.cookies.save()   

唯独那样登入的时候会回到一些不当,举例:“验证码会话无效
:(”。表达模拟登入时依然亟需输入验证码的

from PIL import Image
# 获取验证码
def get_captcha():
    #本来觉得可能需要加上时间的参数,不过不需要时间也是可以获得验证码
    # t = str(int(time.time() * 1000))
    # captcha_url = "https://www.zhihu.com/captcha.gif?r=%s&type=login"%t
    captcha_url = "https://www.zhihu.com/captcha.gif?&type=login"
    captcha_image = session.get(captcha_url, headers=headers)
    with open('captcha.gif', 'wb') as f:
        f.write(captcha_image.content)
        f.close()
    try:
        im=Image.open("captcha.gif")
        im.show()
        captcha = input("please input the captcha:")
        im.close()
        return captcha
    except:
        print("未打开验证码文件")

对之请求重返的音讯实行拍卖,判定是或不是要求输入验证码

import json
#将修改captcha这个参数加到post_data中
def zhihu_login(account, password):
         ...
login_msg = json.loads(response.text)
    #判断是否需要输入验证码
    if login_msg["r"]==1:
        post_data["captcha"]=get_captcha()
        response = session.post(post_url,data=post_data,headers=headers)
        print(json.loads(response.text)["msg"])

是因为我们存储了登陆的cookie,要是在此以前有记名成功过就足以一贯登陆

def isLogin():
    # 通过查看用户个人信息来判断是否已经登录
    url = "https://www.zhihu.com/settings/profile"
    login_code = session.get(url, headers=headers, allow_redirects=False).status_code
    if login_code == 200:
        return True
    else:
        return False

终极正是运转了:

if __name__ == '__main__':
    if isLogin():
        print('您已经登录')
    else:
        account = input("请输入你的用户名\n--->  ")
        password = input("请输入你的密码\n--->  ")
        zhihu_login(account, password)

 三、因为每一趟登入 token 和 captcha
都会刷新,因而代码里面无法写死。那么对于 captcha
笔者的管理格局便是把图片下载下来,手动在程序中输入验证码作为参数;那 token
呢?token 小编曾经获取了哟,直接当做参数就可以!

Scrapy爬虫教程伍 爬虫安排

 由此消除该模拟登6进度壹共三步:

在此之前爬取携程和5一job皆防止登录就能够爬取数据的,可是后天爬取和讯的时候就要求登入后才能爬到数码,这我们只可以进展模拟登陆了。

博客园登入分为邮箱登入和手提式有线电话机签到三种办法,通过浏览器的开辟者工具查看,大家因此不一致措施登陆时,网站是不等同的。邮箱登6的地址email_url
= ‘ =

 1、通过 get 请求登录分界面获取 token
和图片验证码;

浅析和讯API

咱俩先进入和讯的报到页面,输入用户名和密码(为了查看登陆时伸手的api音讯,小编那边故意把密码输错),点击登入,查看左边Network消息。

图片 9

博客园登入页

因此Network截取到使用phone_num登入,所以恳请api为
Data为_xsrf、password、captcha_type和phone_num,其中captcha_type为cn可能en(这里预示着有二种办法开始展览验证码验证,上面会详细解答的),_xsrf是从上1页面动态获取的(这些值的获取在底下也有解答),phone_num和password为报到手提式有线电话机号和密码。

透过对今日头条登入须求交给的From
Data音信实行分析得知唯有_xsrf那一个参数的值是内需动态获取,并且是从上1个页面(

哪些收获_xsrf?见下图,请求zhihu.com时翻看Response新闻,从页面中找寻_xsrf值存款和储蓄的职位。

图片 10

齐全,只差代码啦,上边附上自身的代码,差那么一点忘记下边还预留的题目了,那正是From
Data中captcha_type对应的是cn和en二种景况,尽管在网页登陆乐乎的时候你是看不到验证码的,不过在报到的时候自然要证惠氏(Nutrilon)(Beingmate)下验证码(不知情干什么小编试了好数十一回都并未有在网页上出示出来填写验证码,大概是乐乎反爬虫程序猿的二个小套路吧,想明白反爬虫手腕的请看:反爬虫花招),captcha_type假设把它设置成
“cn” 正是倒立文字验证码,设置成 “en”
正是数字英文验证码,上边作者会把那二种方法的验证码都会以身作则一下的,上面真正的代码要来了,为了令你们真的的能演习一下,作者就附上航海用体育场面片啦:

壹.针对数字英文验证码的秘诀:

图片 11

图片 12

图片 13

首要还亟需关爱一下代码中的cookie,那么些cookie能够在PC端登入成功后,F1第22中学就能够找到这些cookie值,替换一下就足以。

2.针对倒立文字验证码

图片 14

图片 15

图片 16

针对captcha那么些参数需求证实一下,它的的”img_size”字段是定点的,每一遍都是[200,44],应该便是图片大小的乐趣。前面包车型大巴”input_points”是您点击验证码中倒立文字的坐标,由于验证码中三个文字地点是原则性的,我们假使每种字都点一下再拓展登入,再核查成分来规定各类字的坐标就能够模仿点击了(是否峰回路转),这几个手续自行点击来获得坐标,笔者把本身测试好的八个文字坐标依次拿出来:[22.796875,22],[42.796875,22],[63.796875,21],[84.796875,20],[107.796875,20],[129.796875,22],[150.796875,22]。

提及底再作证一下,当您通过别的的学科在模拟登陆的时候会碰着验证码会话无效也许请点击图中倒立的文字又或然请输入验证码等字样的时候,使用上述的缓和方案都以足以的,亲测有效,相对有效。。。

哈哈哈,很舒心,准备好下班啦。。。

 二、token
直接当做参数,验证码手动输入,加上账号、密码、区号作为post
请求登入的参数;

 叁、登录成功后的 response header 里有大家需求的
cookie,将其抽出拼到新的 request header
里,请求要爬取数据的页面,成功获取数据!

 落到实处进度

 具体代码实现正是依照上述思路的,作者举行了讲授,不再多做表明。

''' 第一步 '''
cookie = cookielib.CookieJar()
handler = urllib2.HTTPCookieProcessor(cookie)
opener = urllib2.build_opener(handler)
r=requests.get('http://post.xiaohongshu.com/api/homerus/login/captcha')
token = json.loads(r.text)['data']['token']     # get请求到的token
#print token
img_url=json.loads(r.text)['data']['url']
picture = opener.open(img_url).read()
local = open('F:/code.jpg', 'wb')               # 保存验证码到本地
local.write(picture)
local.close()
''' 第二步 '''
secret_code = raw_input('输入验证码: ')
login_data = {
   'phone': '136****0000',
   'passwd': 'XXXXXXXXXXXX',
   'token': token,                             # 获取的token
   'captcha': secret_code,                     # 手动输入的验证码
   'zone': '86'
}
headers = {'content-type': 'application/json'}  # payload请求方式
res = requests.post('http://post.xiaohongshu.com/web_api/sns/v1/homerus/user/login_with_passwd'
                   ,data=json.dumps(login_data),headers=headers)                                                      # 模拟登录
header={ ''' 第三步 '''
   'Accept': 'application / json, text / plain',
   'Connection': 'keep - alive',
   'Cookie': res.headers['Set-Cookie'].replace(' Path=/','')+'xhs_spid.6d29=21fa0111a09b6c3c'
                        '1516671392.1.15166716811516671392.6d3c3921-2e47-4cbe-b695-698499ac4636; xhs_spses.6d29=*',   # 登录成功的cookie拼装在header
   'Referer': 'http: // post.xiaohongshu.com /',
   'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
resp = requests.get('http://post.xiaohongshu.com/web_api/sns/v1/homerus/note/list?page=1&page_size=200',headers=header)
data = json.loads(resp.text)

终极,作者成功得到到如下所示的数据集。

图片 17

网络有很多仿照登入今日头条豆瓣等网址的学科和代码,但小红书那几个平台一般不太受用,那么些思路对于广大索要登录技巧查看数据的网址都应该有扶持,由此分享在这里供参考。

 

Python学习交换群:238757010

 

 

作者:Nekyo

原稿链接:

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website