如何刮分页表

玛德琳·史密斯

我正在尝试从本网站 ( https://report.boonecountymo.org/mrcjava/servlet/SH01_MP.I00290s )上的表格中抓取所有数据,但似乎无法弄清楚我将如何抓取所有数据后续页面。这是将第一页结果抓取到 CSV 文件的代码:

import csv

import requests
from bs4 import BeautifulSoup

url = 'http://www.showmeboone.com/sheriff/JailResidents/JailResidents.asp'
response = requests.get(url)
html = response.content

soup = BeautifulSoup(html, "html.parser")

fileList = []

# For the table-header cells
tableHeader = soup.find('tr', attrs={'class': 'table-header'})
rowList = []
for cell in tableHeader.findAll('th'):
    cellText = cell.text.replace(' ', '').replace('\n', '')
    rowList.append(cellText)
fileList.append(rowList)

# For the table body cells
table = soup.find('tbody', attrs={'class': 'stripe'})
for row in table.findAll('tr'):
    rowList = []
    for cell in row.findAll('td'):
        cellText = cell.text.replace(' ', '').replace('\n', '')

        if cellText == "Details":
            continue

        rowList.append(cellText)

    fileList.append(rowList)

outfile = open("./prison-inmates.csv", "w")
writer = csv.writer(outfile)
writer.writerows(fileList)

如何进入下一页结果?

取自本教程的代码(http://first-web-scraper.readthedocs.io/en/latest/

清晰度123

虽然我无法让您发布的代码运行,但我确实发现您链接到的原始教程代码可以url =在线更改为:

url = 'https://report.boonecountymo.org/mrcjava/servlet/SH01_MP.I00290s' \
    + '?max_rows=250'

运行python scrape.py然后成功输出inmates.csv所有可用记录。

简而言之,这是通过以下方式工作的:

  • 而不是:How do I get to the next page
  • 我们追求:How do I remove pagination
  • 我们使页面立即发送所有记录,因此一开始就不需要处理分页
  • 这允许我们使用原始教程代码来保存完整的记录集。

解释

  • url = 'https://report.boonecountymo.org/mrcjava/servlet/SH01_MP.I00290s'使用新的 URL。教程中的旧 URL:http://www.showmeboone.com/sheriff/JailResidents/JailResidents.asp重定向到这个新 URL,但不适用于我们的解决方案,因此我们不能使用旧 URL
  • \ 是一个换行符,允许我在下一行继续代码行,以提高可读性
  • +是连接以便我们可以添加?max_rows=250.
  • 所以结果等价于 url = 'https://report.boonecountymo.org/mrcjava/servlet/SH01_MP.I00290s?max_rows=250'
  • ?max_rows=<number-of-records-to-display>是我发现适用于该特定Current Detainees页面的查询字符串这可以通过首先注意到Page Size供用户设置每页自定义行文本输入字段来找到它显示了一个默认值50检查它的HTML代码,例如火狐浏览器(52.7.3),使用Ctrl+ shift+ i,以显示Firefox的Web开发Inspector工具窗口。单击“选择元素”按钮(图标类似于带有鼠标光标箭头的框轮廓),然后单击包含50. 下面的 HTML 窗格通过 highlight: 显示<input class="mrcinput" name="max_rows" size="3" title="max_rowsp" value="50" type="text">这意味着它提交了一个名为 的表单变量max_rows,它是一个数字,默认50. 某些网页,取决于它的编码方式,如果将这些变量作为查询字符串附加到 URL,可以识别此类变量,因此可以通过附加?max_rows=加上您选择的数字来尝试这一点在我启动页面时说250 Total Items,所以我选择250通过将浏览器地址栏更改为加载来尝试自定义编号https://report.boonecountymo.org/mrcjava/servlet/SH01_MP.I00290s?max_rows=250它成功显示了 250 条记录,因此无需分页,因此?max_rows=250我们使用它来形成脚本使用的 URL
  • 但是现在页面现在显示242 Total Items,所以看起来他们正在移除囚犯,或者至少列出了囚犯记录。您可以:?max_rows=242,但?max_rows=250仍然可以工作,因为250大于记录总数242,并且只要它大于页面就不需要分页,从而允许您将所有记录放在一页上。

保修单

  • 这不是在遇到分页时抓取表数据的通用解决方案。它适用于此Current Detainees页面和可能以相同方式编码的页面
  • 这是因为分页不是普遍实现的,所以任何代码或解决方案都取决于页面如何实现分页。这里我们使用?max_rows=.... 然而,另一个网站,即使它们具有可调整的每页限制,也可能为此max_rows变量使用不同的名称,或者完全忽略查询字符串,因此我们的解决方案可能无法在其他网站上运行
  • 可扩展性问题:例如,如果您处于需要数百万条记录的不同网站的情况下,像这样的一次性下载方法可能会在服务器端和您的计算机上遇到内存限制,两者都可能超时并无法完成交付或处理。一种不同的方法,类似于您最初要求的分页,肯定会更合适

因此,将来如果您需要下载大量记录,这种一次性下载的方法可能会让您遇到与内存相关的麻烦,但是对于抓取这个特定Current Detainees页面,它可以完成工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何分页动态AngularJS表?

来自分类常见问题

与网络请求刮板分页

来自分类Dev

刮表与路径

来自分类Dev

使用python刮表

来自分类Dev

刮表:标题盲

来自分类Dev

Azure表存储:如何实现分页?

来自分类Dev

如何启用Bootstrap表分页和搜索?

来自分类Dev

如何从数据库中分页表

来自分类Dev

Azure表存储:如何实现分页?

来自分类Dev

如何使用jQuery缩短表分页

来自分类Dev

用分页刮ASP.NET网站

来自分类Dev

刮y爬行蜘蛛ajax分页

来自分类Dev

使用python刮HTML表

来自分类Dev

分页表可以分页吗?

来自分类Dev

我将如何使用BeautifulSoup刮擦此ESPN Fantasy玩家表?

来自分类Dev

使用Python刮刮Yahoo Finance损益表

来自分类Dev

如何使用Codeigniter中的分页库对数据表进行正确的分页

来自分类Dev

如何在带有表节的UITableViewController中创建分页

来自分类Dev

如何使用包含分页的jquery在表中搜索?

来自分类Dev

如何使用Material UI表分页显示每页正确的行

来自分类Dev

如何将分页添加到表(Django)

来自分类Dev

如何在Google Chrome的HTML表中实现分页符?

来自分类Dev

如何在ManyToMany关联中获取表的分页结果

来自分类Dev

我如何在分页表中正确附加 div

来自分类Dev

如何在 jquery 数据表库中进行分页?

来自分类Dev

如何删除数据表分页按钮中的空格

来自分类Dev

如何在搜索排序、分页 MVC 中使用表连接

来自分类Dev

如何使用分页打印 vuetify 数据表

来自分类Dev

如何在所有列中使用带有href的表的“ rvest”来刮除R中的HTML表?