Python 使用Beatifulsoup进行刮除之前请等待

Python 使用Beatifulsoup进行刮除之前请等待,python,web-scraping,Python,Web Scraping,我正试图从这个评论网站上搜集数据。它首先通过第一页,检查是否有第二页,然后再去它。问题是当到达第二页时。页面更新需要时间,我仍然会得到第一页的数据,而不是第二页的数据 例如,如果您转到,您将看到加载第2页数据所需的时间 我试着暂停或睡觉,但没有成功。我更喜欢具有最小软件包/浏览器依赖性的解决方案(如webdriver.PhantomJS()),因为我需要在雇主的环境中运行此代码,但不确定是否可以使用它。谢谢 from urllib.request import Request, urlopen

我正试图从这个评论网站上搜集数据。它首先通过第一页,检查是否有第二页,然后再去它。问题是当到达第二页时。页面更新需要时间,我仍然会得到第一页的数据,而不是第二页的数据

例如,如果您转到,您将看到加载第2页数据所需的时间

我试着暂停或睡觉,但没有成功。我更喜欢具有最小软件包/浏览器依赖性的解决方案(如
webdriver.PhantomJS()
),因为我需要在雇主的环境中运行此代码,但不确定是否可以使用它。谢谢

from urllib.request import Request, urlopen
from time import sleep
from socket import timeout
    
req = Request(softwareadvice, headers={'User-Agent': 'Mozilla/5.0'})
    
web_byte = urlopen(req, timeout=10).read()
    
webpage = web_byte.decode('utf-8')
parsed_html = BeautifulSoup(webpage, features="lxml")
    
true=parsed_html.find('div', {'class':['Grid-cell--1of12 pagination-arrows pagination-arrows-right']})
    
while(true):
                                       
    true = parsed_html.find('div', {'class':['Grid-cell--1of12 pagination-arrows pagination-arrows-right']})

    if(not True):
       true=False
    else: 
       req = Request(softwareadvice+'?review.page=2', headers=hdr)
       sleep(10)
       webpage = urlopen(req, timeout=10)
       sleep(10)
       webpage = webpage.read().decode('utf-8')
       parsed_html = BeautifulSoup(webpage, features="lxml")

这些评论是通过Ajax请求从外部源加载的。您可以使用此示例了解如何加载它们:

重新导入
导入json
导入请求
从bs4导入BeautifulSoup
url=”https://www.softwareadvice.com/sms-marketing/twilio-profile/reviews/"
api_url=(
"https://pkvwzofxkc.execute-api.us-east-1.amazonaws.com/production/reviews"
)
参数={
“q”:“s*|-s*”,
“facet.gdm_industry_id”:“{”sort:“bucket”,“size”:200}”,
“fq:”(产品id:“{}”列出:1)”,
“问题选项”:“{”字段“:[“赞成^5”、“反对^5”、“建议^5”、“审核^5”、“审核标题^5”、“供应商回复^5”]}”,
“尺寸”:“50”,
“开始”:“50”,
“排序”:“完整性评分说明、提交日期说明”,
}
#获取产品id
soup=BeautifulSoup(requests.get(url.content,“html.parser”)
a=汤。选择一个('a[href^='https://reviews.softwareadvice.com/new/"]')
id@int(“.”join(关于findall(r“\d+”,a[“href”]))
params[“fq”]=params[“fq”].格式(id)

对于起始范围(0,3):#通过Ajax请求从外部源加载评论。您可以使用此示例了解如何加载它们:

重新导入
导入json
导入请求
从bs4导入BeautifulSoup
url=”https://www.softwareadvice.com/sms-marketing/twilio-profile/reviews/"
api_url=(
"https://pkvwzofxkc.execute-api.us-east-1.amazonaws.com/production/reviews"
)
参数={
“q”:“s*|-s*”,
“facet.gdm_industry_id”:“{”sort:“bucket”,“size”:200}”,
“fq:”(产品id:“{}”列出:1)”,
“问题选项”:“{”字段“:[“赞成^5”、“反对^5”、“建议^5”、“审核^5”、“审核标题^5”、“供应商回复^5”]}”,
“尺寸”:“50”,
“开始”:“50”,
“排序”:“完整性评分说明、提交日期说明”,
}
#获取产品id
soup=BeautifulSoup(requests.get(url.content,“html.parser”)
a=汤。选择一个('a[href^='https://reviews.softwareadvice.com/new/"]')
id@int(“.”join(关于findall(r“\d+”,a[“href”]))
params[“fq”]=params[“fq”].格式(id)

对于起始范围(0,3):#我已经抓取了许多类型的网站,我认为在抓取的世界中,大约有两种类型的网站

第一个是“基于URL的”网站(即,您使用URL发送请求,服务器使用HTML标记进行响应,可以直接从中提取元素),第二个是“JavaScript呈现的”网站(即,您只得到JavaScript响应,只有在运行后才能看到HTML标记)

在前者的情况下,您可以使用bs4自由浏览网站。但在后者的情况下,您不能总是使用URL作为经验法则

您要抓取的站点是使用Angular.js构建的,它基于客户端渲染。因此,您得到的响应是JavaScript代码,而不是包含页面内容的HTML标记。您必须运行代码才能获取内容

关于您介绍的代码:

req = Request(softwareadvice, headers={'User-Agent': 'Mozilla/5.0'})
    
web_byte = urlopen(req, timeout=10).read() # response is javascript, not page content you want...
    
webpage = web_byte.decode('utf-8')
您只能获得JavaScript代码,必须运行才能获得HTML元素。这就是为什么每次都会收到相同的页面(响应)

那么,该怎么办?有没有办法在bs4中运行JavaScript?我想没有任何合适的方法可以做到这一点。你可以用硒来做这个。您可以按字面意思等待页面完全加载,您可以单击按钮和锚定,或随时获取页面内容

selenium中的无头浏览器可能会工作,这意味着您不必看到计算机上打开的受控浏览器

以下是一些可能对您有所帮助的链接


感谢阅读。

我一直在抓取许多类型的网站,我认为在抓取的世界中,大约有两种类型的网站

第一个是“基于URL的”网站(即,您使用URL发送请求,服务器使用HTML标记进行响应,可以直接从中提取元素),第二个是“JavaScript呈现的”网站(即,您只得到JavaScript响应,只有在运行后才能看到HTML标记)

在前者的情况下,您可以使用bs4自由浏览网站。但在后者的情况下,您不能总是使用URL作为经验法则

您要抓取的站点是使用Angular.js构建的,它基于客户端渲染。因此,您得到的响应是JavaScript代码,而不是包含页面内容的HTML标记。您必须运行代码才能获取内容

关于您介绍的代码:

req = Request(softwareadvice, headers={'User-Agent': 'Mozilla/5.0'})
    
web_byte = urlopen(req, timeout=10).read() # response is javascript, not page content you want...
    
webpage = web_byte.decode('utf-8')
您只能获得JavaScript代码,必须运行才能获得HTML元素。这就是为什么每次都会收到相同的页面(响应)

那么,该怎么办?有没有办法在bs4中运行JavaScript?我想没有任何合适的方法可以做到这一点。你可以用硒来做这个。您可以按字面意思等待页面完全加载,您可以单击按钮和锚定,或随时获取页面内容

selenium中的无头浏览器可能会工作,这意味着您不必看到计算机上打开的受控浏览器

以下是一些可能对您有所帮助的链接


谢谢阅读。

谢谢你的回答。这是你们得到的回复,我想还是第一页。我怎么才能得到第二,第三…@juhu不,这会得到