Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python请求&;超级群机器人检测_Python_Html_Web Scraping_Beautifulsoup_Python Requests - Fatal编程技术网

python请求&;超级群机器人检测

python请求&;超级群机器人检测,python,html,web-scraping,beautifulsoup,python-requests,Python,Html,Web Scraping,Beautifulsoup,Python Requests,我正在尝试使用requests&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 = Beaut

我正在尝试使用requests&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)
但是没有显示页面的整个HTML,因此我无法进一步处理产品细节。 有什么帮助吗

编辑1:

根据给定的答案,它显示bot检测页面的标记。我做了一些研究,找到了两种方法来打破它:

  • 我可能需要在请求中添加一个头,但我无法理解头的值应该是什么
  • 使用硒。 现在我的问题是,这两种方式是否提供了同等的支持
  • 试试这个:

    import requests
    from bs4 import BeautifulSoup
    
    url = "http://www.amazon.com/dp/" + 'B004CNH98C'
    r = requests.get(url)
    r = r.text
    
    ##options #1
    #  print r.text
    
    soup = BeautifulSoup( r.encode("utf-8") , "html.parser")
    
    ### options 2
    print(soup)
    

    正如一些评论所建议的,如果您需要在页面上以某种方式与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")
    
    这些标题有点旧,但仍然可以使用。通过使用它们,你假装你的请求来自一个普通的网络浏览者。如果您使用的
    请求
    没有这样的头,那么您的代码基本上是在告诉服务器该请求来自python,而大多数服务器都会立即拒绝该请求


    你的另一个选择可能是,也许你也可以尝试一下。

    为了让事情变得简单,最好在这里使用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
    

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

    如果您能给出B004CNH98C的内容,让人们可以查看实际页面,那就太好了。我的猜测是,一些html内容隐藏在javascript函数下。您应该将页面加载到Selenium并单击它。与此同时,我刚刚熟悉Selenium webdriver。每次我尝试为每个页面刮取内容时,是否都会打开一个新的chrome窗口?请使用headless选项。使用javascript框架的页面不能用BS刮取。亚马逊有这么好的API,为什么还要刮呢?我认为亚马逊API在我的国家是不受支持的。我已经尝试过这种方式,导致出现了“确保你不是机器人”页面。我很困惑“用户代理”是否采用任何预定义的格式来提供我的机器信息。我遇到了这个。我猜这将是我通过的标题,对吗?从文档中也可以看出,定制标题的优先性较低。就接受请求而言,这是否意味着“优先级较低”?从您发布的浏览器列表中,您可以选择要使用的标题。然后,您的请求假装来自此浏览器。我还没有找到关于“优先级较低”的段落,因此我只能假设这是什么意思,但一般来说,服务器大多拒绝以某种方式自动化的请求,以保持良好的性能。这就是为什么有必要假装成真正的浏览器,以便服务器接受您的请求。然而,现在大多数网站都为希望使用自动请求的用户提供API。这实际上对双方都有好处。API请求对于服务器性能更好,而且对于您来说,需要的代码更少,而且更简单。因此,一般来说,我建议在尝试以“hacky”方式解析页面之前,先检查页面是否提供了API。TypeError:get()获得了一个意外的关键字参数“headers”