Python Beatifulsoup不返回页面的完整html
我想从amazon网站上抓取一些页面,比如标题、url、aisn,我遇到了一个问题,脚本只解析了15个产品,而页面上显示了50个。我决定将所有html打印到console,我看到html以15个产品结束,脚本中没有任何错误。 这是我剧本的一部分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.
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()