“加载更多”按钮内的# href粘贴URL时不会带来更多文章
问题:“加载更多”按钮内的# href粘贴URL时不会带来更多文章 我正在尝试抓取这个网站: https://noticias.caracoltv.com/colombia 最后你可以找到一个“Cargar Más”按钮,它会带来更多新闻。到目前为止,一切都很好。但是,当检查该元素时,它说它加载了这样的链接:https://noticias.caracoltv.com/colombia?00000
问题:“加载更多”按钮内的# href粘贴URL时不会带来更多文章
我正在尝试抓取这个网站:
https://noticias.caracoltv.com/colombia
最后你可以找到一个“Cargar Más”按钮,它会带来更多新闻。到目前为止,一切都很好。但是,当检查该元素时,它说它加载了这样的链接:https://noticias.caracoltv.com/colombia?00000172-8578-d277-a9f3-f77bc3df0000-page=2
,如下所示:
问题是,如果我在浏览器中输入这个,我得到的消息与我调用原始网站时得到的消息相同。正因为如此,我看到我能够抓取网站的唯一方法是创建一个递归点击的脚本。问题是我需要 2019 年之前的新闻,所以这似乎不太可行。
此外,在检查事件侦听器时,我看到:
但我不确定如何利用它来发挥我的优势。
我错过了什么吗?有什么方法可以通过链接访问旧新闻(或者 API 会更好,但我没有找到对 API 的任何调用)。
我目前正在使用 Python 进行抓取,但我正处于调查阶段,因此没有代码可以表明这是有意义的。非常感谢!
解答
不幸的是,似乎没有很好的 api 或其他方式来批量获取数据。您将需要遍历“页面”/“加载更多”,然后解析 html。
需要一点时间,但这段代码会为你做这件事。
import requests
from bs4 import BeautifulSoup
import re
import json
from dateutil import parser
import datetime
import pandas as pd
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'}
rows = []
endYear = 2019
continueLoop = True
page = 1
while continueLoop == True:
url = f'https://noticias.caracoltv.com/colombia?00000172-8578-d277-a9f3-f77bc3df0000-page={page}'
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
if page == 1:
mainArticle = soup.find('div', {'class':'ListU'})
jsonStr = str(mainArticle.find('script'))
jsonStr = re.search('({.*})', jsonStr).group(1)
jsonData = json.loads(jsonStr)
articlePublished = jsonData['datePublished']
dt = parser.parse(articlePublished)
print(f"{dt.day}-{dt.month}-{dt.year} : {jsonData['headline']}")
rows.append(jsonData)
subArticles = soup.find_all('li', {'class':'ListE-items-item'})
for subArticle in subArticles:
jsonStr = str(subArticle.find('script'))
jsonStr = re.search('({.*})', jsonStr).group(1)
jsonData = json.loads(jsonStr)
articlePublished = jsonData['datePublished']
dt = parser.parse(articlePublished)
print(f"{dt.day}-{dt.month}-{dt.year} : {jsonData['headline']}")
rows.append(jsonData)
#get bottom articles
loadMore = soup.find('ps-list-loadmore', {'class':'ListD'})
articles = loadMore.find_all('li',{'class':'ListD-items-item'})
for article in articles:
if continueLoop == True:
try:
jsonStr = str(article.find('script'))
jsonStr = re.search('({.*})', jsonStr).group(1)
jsonData = json.loads(jsonStr)
articlePublished = jsonData['datePublished']
dt = parser.parse(articlePublished)
except:
headline = article.find('a', href=True)['title']
articlePublished = article.find('div', {'PromoB-timestamp'})['data-timestamp']
url = article.find('a', href=True)['href']
jsonData = {
'headline':headline,
'datePublished':articlePublished,
'url':url}
if endYear == dt.year:
print('Done')
continueLoop = False
else:
print(f"{dt.day}-{dt.month}-{dt.year} : {jsonData['headline']}")
rows.append(jsonData)
page += 1
df = pd.DataFrame(rows)
输出:
print(df)
@context ... video
0 http://schema.org ... {'@context': 'http://schema.org', '@type': 'Vi...
1 http://schema.org ... {'@context': 'http://schema.org', '@type': 'Vi...
2 http://schema.org ... {'@context': 'http://schema.org', '@type': 'Vi...
3 http://schema.org ... NaN
4 http://schema.org ... {'@context': 'http://schema.org', '@type': 'Vi...
... ... ...
6864 http://schema.org ... {'@context': 'http://schema.org', '@type': 'Vi...
6865 http://schema.org ... {'@context': 'http://schema.org', '@type': 'Vi...
6866 http://schema.org ... {'@context': 'http://schema.org', '@type': 'Vi...
6867 http://schema.org ... {'@context': 'http://schema.org', '@type': 'Vi...
6868 http://schema.org ... {'@context': 'http://schema.org', '@type': 'Vi...
[6869 rows x 15 columns]
print(df.columns)
Index(['@context', '@type', 'headline', 'description', 'articleBody',
'articleSection', 'url', 'mainEntityOfPage', 'datePublished',
'dateModified', 'author', 'publisher', 'image', 'keywords', 'video'],
dtype='object')
更多推荐
所有评论(0)