zl程序教程

您现在的位置是:首页 >  其他

当前栏目

researchGate爬虫案例

2023-03-15 22:04:25 时间

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:UsersfeiyiDesktopchromedriver.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'))