迭代所有页面和爬虫 table 的元素保存为 Python 中的数据框

Iterate all pages and crawler table's elements save as dataframe in Python

我需要从这个link循环所有的所有条目,然后点击红色部分的菜单check(请看下图)输入每个条目的详细信息:

objective是抓取下图等页面的信息,左边为列名,右边为行:

我使用的代码:

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)

输出:

        工程名称:
        施工许可证号:
        所在区县:
        建设单位:
        工程规模(平方米):
        发证日期:
        建设地址:
        施工单位:
        监理单位:
        设计单位:
        行政相对人代码:
        法定代表人姓名:
        许可机关:

如您所见,我只获取了列名,没有成功提取任何条目。

为了循环所有页面,我想我们需要使用post请求,但我不知道如何获得headers。

感谢您的提前帮助。

此脚本将遍历所有页面并将数据放入 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 的屏幕截图):