python请求和beautifulsoup机器人检测

时间:2018-08-29 03:09:24

标签: python html web-scraping beautifulsoup python-requests

我正在尝试使用request&beautifulsoup抓取页面的所有HTML元素。我正在使用ASIN(亚马逊标准标识号)来获取页面的产品详细信息。我的代码如下:

from urllib.request import urlopen
import requests
from bs4 import BeautifulSoup

url = "http://www.amazon.com/dp/" + 'B004CNH98C'
response = urlopen(url)
soup = BeautifulSoup(response, "html.parser")
print(soup)

但是output不能显示页面的整个HTML,因此我无法进一步处理产品详细信息。 有什么帮助吗?

编辑1:

从给出的答案开始,它显示了漫游器检测页面的标记。我研究了一下,发现了两种破解方法:

  1. 我可能需要在请求中添加标头,但我不明白标头的值应该是什么。
  2. 使用硒。 现在我的问题是,这两种方式是否提供平等的支持?

3 个答案:

答案 0 :(得分:3)

正如一些评论所建议的那样,如果您需要以某种方式与页面上的Javascript进行交互,则最好使用Selenium。但是,关于使用标头的第一种方法:

import requests
from bs4 import BeautifulSoup

url = "http://www.amazon.com/dp/" + 'B004CNH98C'
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}

response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text,"html.parser")

这些标头有些旧,但仍可以使用。通过使用它们,您假装您的请求来自普通的Web浏览器。如果您使用requests而没有这样的标头,则您的代码基本上是在告诉服务器该请求来自python,大多数服务器会立即拒绝该请求。

fake-useragent也可能是您的另一选择,也许您也可以尝试一下。

答案 1 :(得分:0)

尝试一下:

0

答案 2 :(得分:0)

最好在这里使用fake_useragent,以使事情变得容易。随机用户代理通过现实世界的浏览器使用情况统计信息发送请求。如果您不需要动态内容,那么通过HTTP请求页面内容并以编程方式对其进行解析几乎总是更好的选择。

import requests
from fake_useragent import UserAgent
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
ua=UserAgent();
hdr = {'User-Agent': ua.random,
      'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
      'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
      'Accept-Encoding': 'none',
      'Accept-Language': 'en-US,en;q=0.8',
      'Connection': 'keep-alive'}
url = "http://www.amazon.com/dp/" + 'B004CNH98C'
response = requests.get(url, headers=hdr)
print response.content

硒用于浏览器自动化和用于动态内容的高级Web抓取。