我正在尝试从本网站 ( 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/)
虽然我无法让您发布的代码运行,但我确实发现您链接到的原始教程代码可以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
我们使用它来形成脚本使用的 URL242 Total Items
,所以看起来他们正在移除囚犯,或者至少列出了囚犯记录。您可以:?max_rows=242
,但?max_rows=250
仍然可以工作,因为250
大于记录总数242
,并且只要它大于页面就不需要分页,从而允许您将所有记录放在一页上。Current Detainees
页面和可能以相同方式编码的页面?max_rows=...
. 然而,另一个网站,即使它们具有可调整的每页限制,也可能为此max_rows
变量使用不同的名称,或者完全忽略查询字符串,因此我们的解决方案可能无法在其他网站上运行因此,将来如果您需要下载大量记录,这种一次性下载的方法可能会让您遇到与内存相关的麻烦,但是对于抓取这个特定Current Detainees
页面,它可以完成工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句