researchGate爬虫案例

ResearchGate是科研社交网站,有很多的认证专家和学术爱好者。
本案例采集researchGate 的作者信息。


先抓包,有时候会有三次请求,有时一次即可。
在这里插入图片描述
第一次返回429,response有一段script。复制到控制台上输出
在这里插入图片描述
可以看出是第二次发请求 ClientValidation.ajax.html ,验证浏览器

在这里插入图片描述
第二次验证后 success = true时,开始第三次请求base页面,获取数据。


经过对请求头的分析,在三次请求时不断的set-cookie,一次请求成功时cookie是完善的,所以成功与否取决于cookie的正确性。

而 cookie中 只认证了 sid 和 captui 。我猜测 sid 是账号认证参数, captui 是对浏览器环境的认证参数。

没有captui的时候会返回网络异常。
在这里插入图片描述

# -*- coding: utf-8 -*-
''' 
复制浏览器的cookie进行测试
pip install lxpy 
'''
import requests
from lxpy import copy_headers_dict

h = copy_headers_dict('''
cookie: sid=m8hIX......f0iLA2TZs; captui=MDdkYWViMWE5Y.......MWNBa0lqUGQ%3D; 
upgrade-insecure-requests: 1
user-agent: Mozilla/5.0 (Win...... Safari/537.36
''')

url = 'https://www.researchgate.net/search/researcher?q=lx'
d = requests.get(url, headers=h).text
print(d)

目前参数的有效期具体时间不确定,不过可以通过状态码来判断。

如果返回 429,就按照三次请求,来获取cookie。

but 我发现在第二次验证的时候,是有验证码的,但是我这里没有合适的外网 = =


现在就先手动复制吧。或者到期时使用selenium获取新cookie。
在这里插入图片描述

代码:

# -*- coding: utf-8 -*-

import requests
import time
h = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'}
c = {
    'captui':'OGRiMTYwNjMyMTBiY2E5OGYzZjViNTJhNjEwMzdiOGZmZmFjMDdlYjRlZWRiNjkyYzVkZGU4Njc3MTM4NGNhNF9TVzVYNFI2Y2pRd2tzcXJXSkxXVWd3eVVFYjBoMVpxNFpEdmU'
}
q = 'lx'

url = f'https://www.researchgate.net/search/researcher?q={q}'
d = requests.get(url, headers=h,cookies=c)
if d.status_code == 429:
    print("cookies validation failed")
    # 接下来应该进行验证,获取 cattui 后构建cookie,再次请求
    # capUrl = f'https://www.researchgate.net/application.ClientValidation.html?origPath=/search/researcher?q={q}'
    # cookies = requests.utils.dict_from_cookiejar(d.cookies)
    # d = requests.get(capUrl, headers=h,cookies=cookies)
    # 但是因为没外网,获取不到验证,这里采用其他方式获取新cookie,记得修改 executable_path
    from selenium import webdriver
    driver = webdriver.Chrome(executable_path=r'C:\Users\feiyi\Desktop\chromedriver.exe')
    driver.get(url)
    time.sleep(5)
    cookies = {}
    for cook in driver.get_cookies():
        cookies[cook['name']]=cook['value']
    c.update(cookies)

d = requests.get(url, headers=h,cookies=c)


from lxml import etree
e = etree.HTML(d.text)
for li in e.xpath('//div[@class="nova-v-person-item__body"]'):
    print(li.xpath('./div/div[1]/a/img/@src'))

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

考古学家lx(李玺)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值