python-3.x - 迭代所有页面和爬虫表的元素,在 Python 中保存为数据框
问题描述
我需要从这个链接循环所有页面的所有条目,然后点击红色部分的菜单(请看下图)输入每个条目的详细信息:check
目的是从页面中获取信息,如下图所示,并将左侧部分保存为列名,将右侧部分保存为行:
我使用的代码:
import requests
import json
import pandas as pd
import numpy as np
from bs4 import BeautifulSoup
url = 'http://bjjs.zjw.beijing.gov.cn/eportal/ui?pageId=425000'
content = requests.get(url).text
soup = BeautifulSoup(content, 'lxml')
table = soup.find('table', {'class': 'gridview'})
df = pd.read_html(str(table))[0]
print(df.head(5))
出去:
序号 工程名称 ... 发证日期 详细信息
0 NaN 假日万恒社区卫生服务站装饰装修工程 ... 2020-07-07 查看
进入详细页面的代码:
url = 'http://bjjs.zjw.beijing.gov.cn/eportal/ui?pageId=308891&t=toDetail&GCBM=202006202001'
content = requests.get(url).text
soup = BeautifulSoup(content, 'lxml')
table = soup.find("table", attrs={"class":"detailview"}).findAll("tr")
for elements in table:
inner_elements = elements.findAll("td", attrs={"class":"label"})
for text_for_elements in inner_elements:
print(text_for_elements.text)
出去:
工程名称:
施工许可证号:
所在区县:
建设单位:
工程规模(平方米):
发证日期:
建设地址:
施工单位:
监理单位:
设计单位:
行政相对人代码:
法定代表人姓名:
许可机关:
如您所见,我只获取列名,没有成功提取任何条目。
为了循环所有页面,我认为我们需要使用发布请求,但我不知道如何获取标题。
提前感谢您的帮助。
解决方案
此脚本将适用于所有页面并将数据放入 DataFrame 并将它们保存到data.csv
.
(!!!警告!!!总共有 2405 页,所以需要很长时间才能全部获取):
import requests
import pandas as pd
from pprint import pprint
from bs4 import BeautifulSoup
url = 'http://bjjs.zjw.beijing.gov.cn/eportal/ui?pageId=425000'
payload = {'currentPage': 1, 'pageSize':15}
def scrape_page(url):
soup = BeautifulSoup(requests.get(url).content, 'html.parser')
return {td.get_text(strip=True).replace(':', ''): td.find_next('td').get_text(strip=True) for td in soup.select('td.label')}
all_data = []
current_page = 1
while True:
print('Page {}...'.format(current_page))
payload['currentPage'] = current_page
soup = BeautifulSoup(requests.post(url, data=payload).content, 'html.parser')
for a in soup.select('a:contains("查看")'):
u = 'http://bjjs.zjw.beijing.gov.cn' + a['href']
d = scrape_page(u)
all_data.append(d)
pprint(d)
page_next = soup.select_one('a:contains("下一页")[onclick]')
if not page_next:
break
current_page += 1
df = pd.DataFrame(all_data)
df.to_csv('data.csv')
将数据打印到屏幕并保存data.csv
(来自 LibreOffice 的屏幕截图):
推荐阅读
- c - 使用套接字对 C 中的本地 IP 进行 GET 请求
- database - 与 TClientDataSet 的多对多关系
- vue.js - 如何在存根中触发事件?[vue-test-utils]
- javascript - 混合类型检查器功能,允许调用具有特定类型的函数
- android - 在 kotlin 中比较创建函数的两种方法
- android - Android相机:如何使用openCV处理onPictureTaken中的字节数据
- mysql - MySQL INSERT INTO 语句给出错误代码 1062
- android - 将 Firebase 连接到 Android 工作室
- javascript - React JS:重构 Redux 选择器
- c# - 为什么我会收到 System.OverflowException?