researchGate爬虫案例
【摘要】
ResearchGate是科研社交网站,有很多的认证专家和学术爱好者。 本案例采集researchGate 的作者信息。
先抓包,有时候会有三次请求,有时一次即可。 第一次返回429,respon...
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)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
目前参数的有效期具体时间不确定,不过可以通过状态码来判断。
如果返回 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'))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
文章来源: blog.csdn.net,作者:考古学家lx,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/weixin_43582101/article/details/113524317
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)