我正在尝试使用 python 的 requests
来抓取谷歌新闻搜索结果,以获取不同文章的链接。我通过使用 Beautiful Soup
获取链接。
我遇到的问题是,虽然在浏览器的源代码 View 中所有链接看起来都很正常,但在操作之后它们被更改了 - 所有以“/url?q=”开头并且在链接的“核心”之后完成是一串以“&”开头的字符。另外 - 链接内的一些字符也发生了变化 - 例如 url:
http://www.azonano.com/news.aspx?newsID=35576
更改为:
http://www.azonano.com/news.aspx%newsID%35576
我正在使用标准的“入门”代码:
import requests, bs4
url_list = list()
url = 'https://www.google.com/search?hl=en&gl=us&tbm=nws&authuser=0&q=graphene&oq=graphene&gs_l=news-cc.3..43j0l9j43i53.2022.4184.0.4322.14.10.3.1.1.1.166.884.5j5.10.0...0.0...1ac.1.-Q2j3YFqIPQ'
res = requests.get(url)
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, 'html.parser')
for link in soup.select('h3 > a'):
url_list.append(link.get('href'))
# First link on google news page is:
# https://www.theengineer.co.uk/graphene-sensor-could-speed-hepatitis-diagnosis/
print url_list[0] #this line will print url modified by requests.
我知道可以通过使用selenium
来解决这个问题,但我想知道requests
(或更多)这个问题的根本原因在哪里貌似合理的不是 requests
而是我使用它的方式)。
感谢您的帮助!
最佳答案
您正在将在浏览器中看到的内容与请求生成的内容进行比较(即没有用户代理 header )。如果您在发出初始请求之前指定此项,它将反射(reflect)您在 Web 浏览器中看到的内容。 Google 以不同的方式处理请求,如下所示:
url = 'https://www.google.com/search?hl=en&gl=us&tbm=nws&authuser=0&q=graphene&oq=graphene&gs_l=news-cc.3..43j0l9j43i53.2022.4184.0.4322.14.10.3.1.1.1.166.884.5j5.10.0...0.0...1ac.1.-Q2j3YFqIPQ'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'} # I just used a general Chrome 41 user agent header
res = requests.get(url, headers=headers)
关于python - 为什么Python的请求会转换部分源代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44048700/