python - 如何通过触发“阅读更多”按钮来抓取数据
问题描述
我正在尝试使用 Python 中的 BeautifulSoup从https://www.mouthshut.com/product-reviews/ICICI-Lombard-Auto-Insurance-reviews-925641018中抓取评论。
实际上评论内容有一个“阅读更多...”按钮。如何触发该按钮以获取全部内容?
我发现单击按钮时会触发 XHR 请求。如何使用 python 模拟它?
此外,在检查了“阅读更多...”按钮后,我得到了这个:
<a style="cursor:pointer" onclick="bindreviewcontent('2836986',this,false,'I found this review of ICICI Lombard Auto Insurance pretty useful',925641018,'.jpg','I found this review of ICICI Lombard Auto Insurance pretty useful %23WriteShareWin','https://www.mouthshut.com/review/ICICI-Lombard-Auto-Insurance-review-rmlrrturotn','ICICI Lombard Auto Insurance',' 1/5','rmlrrturotn');">Read More</a>
如何使用 python 触发 onclick 事件?
解决方案
提取带有评分和链接的所有评论
import requests
from bs4 import BeautifulSoup as bs
import pandas as pd
def add_reviews(s, soup, results):
for review in soup.select('.review-article'):
info = review.select_one('a')
identifier = review.select_one('[reviewid]')['reviewid']
data['reviewid'] = identifier
title = info.text
link = info['href']
rating = len(review.select('.rated-star'))
r = s.post('https://www.mouthshut.com/review/CorporateResponse.ashx', data)
soup2 = bs(r.content, 'lxml')
review = ' '.join([i.text for i in soup2.select('p')])
row = [title, link, rating, review]
results.append(row)
url = 'https://www.mouthshut.com/product-reviews/ICICI-Lombard-Auto-Insurance-reviews-925641018-page-{}'
data = {'type': 'review', 'reviewid': '', 'catid': '925641018', 'corp': 'false', 'catname': ''}
results = []
with requests.Session() as s:
r = s.get('https://www.mouthshut.com/product-reviews/ICICI-Lombard-Auto-Insurance-reviews-925641018')
soup = bs(r.content, 'lxml')
pages = int(soup.select('#spnPaging .btn-link')[-1].text)
add_reviews(s, soup, results)
if pages > 1:
for page in range(2, pages + 1):
r = s.get(url.format(page))
soup = bs(r.content, 'lxml')
add_reviews(s, soup, results)
df = pd.DataFrame(results, columns = ['Title', 'Link', 'Rating', 'Review'])
print(df)
推荐阅读
- javascript - 如何配置一个包以在 reactjs 中导出子目录?
- html - 使用链接的 CSS 选择器为深度嵌套的 html 元素选择最后几个 N 项
- javascript - javascript 正则表达式匹配任何脚本中所有非单词字符的正确正则表达式范围是多少?
- react-native - 当用户滚动到 viewpager (@react-native-community/viewpager) 中的另一个页面时,如何暂停正在播放的视频(使用 react-native-video 播放)?
- javascript - 从一个屏幕导航到另一个屏幕时未处理的承诺拒绝
- r - R如何在数据集上执行for循环
- json - 在sol中将参数转换为json
- json - 提取某些json对象nifi Json
- javascript - 如何仅在 Bootstrap Vue 表的单个单元格中显示验证失败消息?
- javascript - 如何在 VueJS 的父子通信中传递 JSON 数组?