我要自动执行以下操作:
这是一种Web抓取方式,但省力(我的想法)。
问题是我找不到允许我执行此操作的工具。
我从Python和Selenium(chrome驱动程序)开始。但是没有找到任何信息,是否有可能获得XHR响应。所有教程都是关于抓取HTML的。似乎有逻辑可能,但我的研究没有帮助。
有什么主意吗?
谢谢。
答案 0 :(得分:0)
您要剪贴的网站具有JavaScript动态生成的内容。
您有两种选择可以解决此问题
使用硒模拟人类浏览器的交互作用,然后打开网站,然后等待直到所有内容都呈现完毕,然后使用硒来提取您要查找的数据。这种方法处理“元素”选项卡。您只需使用CSS或xpath选择器即可获取所需的标签
您应该获取XHR请求的URL并使用相同的标头构建相同的请求,而不是寻找一种方法来使硒进入“网络”选项卡并保存内容(这将非常困难)。和参数(如果有),然后使用requests
发送该请求,您可以轻松保存内容。
让我们尝试抓取Home | Microsoft Academic
第一种方法:
from selenium import webdriver
driver = webdriver.Chrome() # Launch the browser
driver.get("https://academic.microsoft.com/home") # Go to the given url
authors = driver.find_elements_by_xpath('//a[@data-appinsights-action="TopAuthorSelected"]') # get the elements using selectors
for author in authors: # loop through them
print(author.text)
输出:
1. Yoshua Bengio
2. Geoffrey E. Hinton
3. Andrew Zisserman
4. Ilya Sutskever
5. Jian Sun
6. Trevor Darrell
7. Scott Shenker
8. Jiawei Han
9. Kaiming He
10. Ross Girshick
11. Ion Stoica
12. Hari Balakrishnan
13. R Core Team
14. Jitendra Malik
15. Jeffrey Dean
第二种方法:
import requests
res = requests.get('https://academic.microsoft.com/api/analytics/authors/topauthors?topicId=41008148&take=15&filter=1&dateRange=1').json()
#The XHR Response is Usually in Json format
#res = [{'name': 'Yoshua Bengio', 'id': '161269817', 'lat': 0.0, 'lon': 0.0}, {'name': 'Geoffrey E. Hinton', 'id': '563069026', 'lat': 0.0, 'lon': 0.0}, {'name': 'Andrew Zisserman', 'id': '2469405535', 'lat': 0.0, 'lon': 0.0}, {'name': 'Ilya Sutskever', 'id': '215131072', 'lat': 0.0, 'lon': 0.0}, {'name': 'Jian Sun', 'id': '2200192130', 'lat': 0.0, 'lon': 0.0}, {'name': 'Trevor Darrell', 'id': '2174985400', 'lat': 0.0, 'lon': 0.0}, {'name': 'Scott Shenker', 'id': '719828399', 'lat': 0.0, 'lon': 0.0}, {'name': 'Jiawei Han', 'id': '2121939561', 'lat': 0.0, 'lon': 0.0}, {'name': 'Kaiming He', 'id': '2164292938', 'lat': 0.0, 'lon': 0.0}, {'name': 'Ross Girshick', 'id': '2473549963', 'lat': 0.0, 'lon': 0.0}, {'name': 'Ion Stoica', 'id': '2161479384', 'lat': 0.0, 'lon': 0.0}, {'name': 'Hari Balakrishnan', 'id': '1998464616', 'lat': 0.0, 'lon': 0.0}, {'name': 'R Core Team', 'id': '2976715238', 'lat': 0.0, 'lon': 0.0}, {'name': 'Jitendra Malik', 'id': '2136556746', 'lat': 0.0, 'lon': 0.0}, {'name': 'Jeffrey Dean', 'id': '2429370538', 'lat': 0.0, 'lon': 0.0}]
for author in res:
print(author['name'])
输出:
Yoshua Bengio
Geoffrey E. Hinton
Andrew Zisserman
Ilya Sutskever
Jian Sun
Trevor Darrell
Scott Shenker
Jiawei Han
Kaiming He
Ross Girshick
Ion Stoica
Hari Balakrishnan
R Core Team
Jitendra Malik
Jeffrey Dean
第二种方法可以节省时间,资源和直截了当。
答案 1 :(得分:-1)
BrowserMob代理(https://github.com/lightbody/browsermob-proxy)将为您提供帮助。它将捕获所有请求以及配置后的响应。
有关更多详细信息,请参见前面的答案:Running Selenium Webdriver with a proxy in Python