Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.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 Beatifulsoup不返回页面的完整html_Python_Beautifulsoup_Request - Fatal编程技术网

Python Beatifulsoup不返回页面的完整html

Python Beatifulsoup不返回页面的完整html,python,beautifulsoup,request,Python,Beautifulsoup,Request,我想从amazon网站上抓取一些页面,比如标题、url、aisn,我遇到了一个问题,脚本只解析了15个产品,而页面上显示了50个。我决定将所有html打印到console,我看到html以15个产品结束,脚本中没有任何错误。 这是我剧本的一部分 keyword = "men jeans".replace(' ', '+') headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.

我想从amazon网站上抓取一些页面,比如标题、url、aisn,我遇到了一个问题,脚本只解析了15个产品,而页面上显示了50个。我决定将所有html打印到console,我看到html以15个产品结束,脚本中没有任何错误。 这是我剧本的一部分

keyword = "men jeans".replace(' ', '+')

headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3) Gecko/20090305 Firefox/3.1b3 GTB5'}
url = "https://www.amazon.com/s/field-keywords={}".format(keyword)

request = requests.session()
req = request.get(url, headers = headers)
sleep(3)
soup = BeautifulSoup(req.content, 'html.parser')
print(soup)

Amazon的页面范围最大为20页,这里是它对页面的抓取,这是因为很少有项目是动态生成的。除了使用硒,可能还有更好的解决方案。但是,作为一种解决方法,您可以尝试以下方法

from selenium import webdriver
from bs4 import BeautifulSoup

def fetch_item(driver,keyword):
    driver.get(url.format(keyword.replace(" ", "+")))
    soup = BeautifulSoup(driver.page_source, 'html.parser')
    for items in soup.select("[id^='result_']"):
        try:
            name = items.select_one("h2").text
        except AttributeError: name = ""
        print(name)

if __name__ == '__main__':
    url = "https://www.amazon.com/s/field-keywords={}"
    driver = webdriver.Chrome()
    try:
        fetch_item(driver,"men jeans")
    finally:
        driver.quit()

运行上述脚本后,您应该会得到56个姓名或其他结果。

如果我转到该页面,我会看到“男士+牛仔裤”50000多个结果中的
1-16个。
,因此我不确定您为什么会看到50个。尝试在清除cookies的情况下查看页面,tho.50仅用于正在提取的一个页面,我正在使用会话,在脚本末尾使用request.cookies.clear()可以发布脚本中遇到问题的部分吗?我已经发布了,variable soup没有HTML页面的全部内容哦,你是什么意思“50仅适用于正在提取的一个页面"? 在发布的脚本中只有一个url,在该页面上我看到了16个项目。我尝试了你的代码,它从单个页面返回了20个产品,但实际上,有更多的产品可供我使用,我在页面上显示了20个产品。你想让它也抓取页面吗?奇怪,但当我从浏览器中手动检查时,它显示了50个产品,我想可能是通过AJAX加载的产品,但我禁用了浏览器中的javascript来手动检查它是否会减少产品数量,实际上它只显示了大约5个,总共50个产品,而不是55个。这是因为
Amazon
已经检测到你是一个机器人,他们用不同的方式来实现这一点。休息一下,然后再次跑步,你应该会得到想要的结果。谢谢。你的脚本有时会显示20个产品,所以一行只有一个产品。我想这是正常的行为。非常感谢你的帮助!
from selenium import webdriver
from bs4 import BeautifulSoup

def fetch_item(driver,keyword):
    driver.get(url.format(keyword.replace(" ", "+")))
    soup = BeautifulSoup(driver.page_source, 'html.parser')
    for items in soup.select("[id^='result_']"):
        try:
            name = items.select_one("h2").text
        except AttributeError: name = ""
        print(name)

if __name__ == '__main__':
    url = "https://www.amazon.com/s/field-keywords={}"
    driver = webdriver.Chrome()
    try:
        fetch_item(driver,"men jeans")
    finally:
        driver.quit()