javascript - Python 漂亮的网页抓取模拟点击抓取所有页面
问题描述
我在尝试抓取包含 42 页数据的http://www.o-review.com/database_filter_model.php?table_name=glasses&tag=时遇到了一个有趣的问题。我能够成功抓取第一页信息,但是在尝试抓取所有页面时,我发现 URL 保持不变,并且使用网站底部的按钮更改页面。
检查器中的 html 代码如下:
<div onclick="filter_page('1')" class="filter_nav_button round5"
style="cursor:pointer;"><img src="/images/icon_arrow_next.svg"></div>
我在抓取和 python 方面非常新,但被告知我需要在 javascript 中模拟“点击”,我完全不知道该怎么做,并且不确定它是否可以被硬编码。到目前为止,我尝试尝试的微弱尝试:
response = get('http://www.o-review.com/database_filter_model.php?
table_name=glasses&tag=')
soup = bs(response.text, 'html.parser')
print(soup)
for page in range(1, 42):
pages = soup.find('div', onclick_ = 'filter_page()')
希望过去有人解决了这个问题。帮助将不胜感激!谢谢!
编辑:这是我要添加的代码:
## Find All Frame models
for find_frames in soup.find_all('a', class_ = 'round5
grid_model'):
# Each iteration grabs child text and prints it
all_models = find_frames.text
print(all_models)
这将被添加到注释要添加代码的地方!谢谢!
解决方案
该请求是通过POST
请求提出的,您可以在其中查看我以前的答案,以了解如何获得实际的API
也html.parser
或lxml
不是您问题的一部分。
我之所以使用lxml
它是因为它比html.parser
根据文档更快
import requests
from bs4 import BeautifulSoup
from pprint import pp
def main(url):
with requests.Session() as req:
for page in range(1, 44):
print("[*] - Extracting Page# {}".format(page))
data = {
"table_name": "glasses",
"family": "",
"page": "{}".format(page),
"sort": "",
"display": "list",
}
r = req.post(url, data=data)
soup = BeautifulSoup(r.text, 'lxml')
pp([x.text for x in soup.select(
'.text-clip') if x.get_text(strip=True)])
if __name__ == "__main__":
main('http://www.o-review.com/ajax/database_filter_model.php')
推荐阅读
- solr - 如果所有集合都具有唯一的字段(键),如何从 solr 中的 5 个不同集合中获取多个文档
- kubernetes - Kubernetes 1.17 containerd 1.2.0 与 Calico CNI 节点未加入主节点
- html - 在html中强制换行和圆角
- c# - Azure 函数类库的 .NET Core 3.1 传递参考问题
- javascript - 仅在 google 身份验证回调后运行保存用户功能
- wordpress - 为什么将 SSL 添加到网站时我会发现不同的内容
- python - 从多个 Docker 容器返回到本地主机的 Python 日志记录
- c - 关于在 c 中使用 fgets 和 scanf 读取输入的问题
- python - Music21:为乐谱中的所有和弦获取罗马数字,考虑到键的变化和未指定的键
- javascript - 在 window.onload 事件中不能做任何事情