为什么Python的请求会转换部分源代码?

时间:2017-05-18 13:09:24

标签: python html

我正在尝试使用python的requests来搜索谷歌新闻搜索结果,以获取不同文章的链接。我使用Beautiful Soup获取链接。

我得到的问题是,尽管在浏览器的源视图中所有链接看起来都很正常,但在操作后它们会被更改 - 所有以“/ 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但我正在使用它的方式)。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您正在将浏览器中看到的内容与生成的请求进行比较(即没有用户代理标头)。如果在发出初始请求之前指定此项,则会反映您在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)