我正试图浏览一个网站。我尝试过使用两种方法,但都没有提供完整的网站源代码,我正在寻找。我正试图从下面提供的网站URL中获取新闻标题
URL:“https://www.todayonline.com/"
这是我尝试过但失败的两种方法
tdy_url = "https://www.todayonline.com/"
page = requests.get(tdy_url).text
soup = BeautifulSoup(page)
soup # Returns me a HTML with javascript text
soup.find_all('h3')
### Returns me empty list []
tdy_url = "https://www.todayonline.com/"
options = Options()
options.headless = True
driver = webdriver.Chrome("chromedriver",options=options)
driver.get(tdy_url)
time.sleep(10)
html = driver.page_source
soup = BeautifulSoup(html)
soup.find_all('h3')
### Returns me only less than 1/4 of the 'h3' tags found in the original page source
请帮忙。我尝试过抓取其他新闻网站,这是如此容易。多谢各位
您可以通过API访问数据(查看网络选项卡):
比如说,
您试图抓取的网站上的新闻数据是使用JavaScript(称为XHR -- XMLHttpRequest)从服务器获取的。它是在加载或滚动页面时动态发生的。因此,这些数据不会在服务器返回的页面中返回
在第一个示例中,您只获得服务器返回的页面——没有新闻,但是使用JS应该获得新闻。请求和BeautifulSoup都不能执行JS
但是,您可以尝试使用Python请求复制从服务器获取新闻标题的请求。执行以下步骤:
复制请求链接(右键单击->;复制->;复制链接),并将其传递给
requests.get(...)
获取请求的
.json()
。它将返回一个易于使用的dict。为了更好地理解dict的结构,我建议使用pprint
而不是简单的打印。请注意,在使用它之前必须执行from pprint import pprint
下面是从页面上的主要新闻中获取标题的代码示例:
如果您想在标题下抓取一组新闻,您需要更改请求URL中
news_feed/
后的数字(要获得它,您只需要在DevTools中通过“news_feed”过滤请求并向下滚动新闻页面)有时网站有防机器人程序的保护(尽管你试图抓取的网站没有)。在这种情况下,您可能还需要执行these steps
我将向您推荐一种相当简单的方法
输出
此外,如果需要,还可以查看XML页面以获取更多信息
p.S.在清理任何网站之前,始终检查合规性:)
相关问题 更多 >
编程相关推荐