我正在尝试从“https://data.lacity.org/A-Safe-City/Crime-Data-from-2010-to-Present/y8tr-7khq”进行网页抓取。具体地说,在div class=“socrata table freezed columns”下,所有数据列名称和数据列描述。但是,我编写的代码似乎不起作用(它没有返回任何东西?)在
import requests
from bs4 import BeautifulSoup
url = "https://data.lacity.org/A-Safe-City/Crime-Data-from-2010-to-Present/y8tr-7khq"
page = requests.get(url)
print(page.status_code)
soup=BeautifulSoup(page.content,'html.parser')
for col in soup.find_all("div", attrs={"class":"socrata-visualization-container loaded"})[0:1]:
for tr in col.find_all("div",attrs={"class":"socrata-table frozen-columns"}):
for data in tr.find_all("div",attrs={"class":"column-header-content"}):
print(data.text)
我的密码错了吗?在
这是因为数据是在页面加载后由ReactJs动态填充的。在
如果你通过请求下载,你就看不到数据。在
您需要使用seleniumweb驱动程序,打开页面并处理所有JavaScript。然后你就可以得到你想要的数据。在
如果您查看页面源代码(ctrl+U),您会注意到没有
<div class = "socrata-table frozen-columns">
这样的元素。这是因为你想要删除的内容是动态添加到页面中的。看看这个问题:web scraping dynamic content with python或Web scraping a website with dynamic javascript content页面是动态加载的,数据集是分页的,这意味着使用浏览器自动检索,这是很慢的。有一个API可以使用。它有允许您成批返回结果的参数。。在
阅读API文档here。这将是一种更有效、更可靠的检索数据的方法。在
使用
limit
确定一次检索到的记录;使用offset
参数为新记录启动下一批。示例调用此处。在因为它是一个查询,所以实际上可以像SQL查询一样调整其他参数,以检索所需的结果集。这也意味着您可以编写一个非常快速的初始查询,从数据库中返回记录计数,您可以用它来确定批处理请求的结束点。在
您可以编写一个使用多处理的基于类的脚本,从而更有效地获取这些批处理。在
JSON响应中的示例记录:
相关问题 更多 >
编程相关推荐