【发布时间】:2020-07-15 00:39:21
【问题描述】:
我正在尝试从 Hansard 中抓取数据,这是英国议会大厦内所有发言的官方逐字记录。这是我要抓取的precise link:简而言之,我想抓取此页面上的每个“提及”容器以及之后的 50 页。
但我发现,当我的爬虫“完成”时,它只收集了 990 个容器的数据,而不是完整的 1010 个容器。缺少 20 个容器的数据,就好像它在跳过一页一样。当我只将页面范围设置为 (0,1) 时,它无法收集任何值。当我将它设置为 (0,2) 时,它只收集第一页的值。要求它收集 52 页的数据并没有帮助。我认为这可能是因为我没有给 URL 足够的时间来加载,所以我在爬虫的抓取中添加了一些延迟。这并没有解决任何问题。
谁能告诉我我可能遗漏了什么?我想确保我的抓取工具正在收集所有可用数据。
pages = np.arange(0, 52)
for page in pages:
hansard_url = "https://hansard.parliament.uk/search/Contributions? searchTerm=%22civilian%20casualties%22&startDate=01%2F01%2F1988%2000%3A00%3A00&endDate=07%2F14%2F2020%2000%3A00%3A00"
full_url = hansard_url + "&page=" + str(page) + "&partial=true"
page = get(full_url)
html_soup = BeautifulSoup(page.text, 'html.parser')
mention_containers = html_soup.find_all('div', class_="result contribution")
time.sleep(randint(2,10))
for mention in mention_containers:
topic = mention.div.span.text
topics.append(topic)
house = mention.find("img")["alt"]
if house == "Lords Portcullis":
houses.append("House of Lords")
elif house == "Commons Portcullis":
houses.append("House of Commons")
else:
houses.append("N/A")
name = mention.find('div', class_="secondaryTitle").text
names.append(name)
date = mention.find('div', class_="").text
dates.append(date)
time.sleep(randint(2,10))
hansard_dataset = pd.DataFrame(
{'Date': dates, 'House': houses, 'Speaker': names, 'Topic': topics})
)
print(hansard_dataset.info())
print(hansard_dataset.isnull().sum())
hansard_dataset.to_csv('hansard.csv', index=False, sep="#")
感谢任何帮助我解决此问题的帮助。
【问题讨论】:
-
如果您使用
requests和BeautifulSoup,那么添加时间是没有意义的——它不是 Selenium,它不运行 JavaScript,也不需要等待。最好将 HTML 保存在文件中并在浏览器中打开以查看您得到的内容。也许有一些与您期望的不同的东西。也许会有一些关于这个问题的信息。或者第一页可能有不同的 URL,或者你必须在没有page=0的情况下加载它 -
当我在浏览器中使用
page=0运行此页面时,我看到An error occurred loading the search results. Please try again later. -
标准规则:您应该使用
print()来检查变量中的值。这样,您应该检查每个页面上有多少项目 - 如果某些页面提供的值较少,则在浏览器中检查此页面。也许有不同的项目有不同的标签等。
标签: python database web-scraping beautifulsoup missing-data