python-3.x - 网页链接抓取
问题描述
我正在做一个项目,该项目需要我从网站上抓取唯一链接并将它们保存到 CSV 文件中。我已经阅读了很多关于如何做到这一点的材料,我看过视频,完成了 Pluralsight 和 LinkedIn Learning 的培训,而且我大部分情况下都发现我不确定任务的一个方面怎么做。
该程序应该从给定的域(参见下面的代码)和域外的任何 Web 链接中抓取 Web 链接。
import bs4 as bs
from bs4 import BeautifulSoup
import urllib.request
import urllib.parse
BASE_url = urllib.request.urlopen("https://www.census.gov/programs-surveys/popest.html").read()
soup = bs.BeautifulSoup(BASE_url, "html.parser")
filename = "C996JamieCooperTask1.csv"
file = open(filename, "w")
headers = "WebLinks as of 4/7/2019\n"
file.write(headers)
all_Weblinks = soup.find_all('a')
url_set = set()
def clean_links(tags, base_url):
cleaned_links = set()
for tag in tags:
link = tag.get('href')
if link is None:
continue
if link.endswith('/') or link.endswith('#'):
link = link[-1]
full_urls = urllib.parse.urljoin(base_url, link)
cleaned_links.add(full_urls)
return cleaned_links
baseURL = "https://www.census.gov/programs-surveys/popest.html"
cleaned_links = clean_links(all_Weblinks, baseURL)
for link in cleaned_links:
file.write(str(link) + '\n')
print ("URI's written to .CSV File")
该代码适用于 baseURL 内部的所有 Web 链接,因此它们存在于该网站中,但不会抓取该网站外部的任何点。我知道答案必须很简单,但是在这个项目上工作了一段时间后,我看不出它有什么问题,所以请帮助我。
解决方案
您可以在集合推导中尝试如下选择器。这会查找以or开头的a
标签元素。这是您可以定制的起点。您将需要更多逻辑,因为至少有一个单独的 url 。href
http
/
/
links = {item['href'] for item in soup.select('a[href^=http], a[href^="/"]')}
另外,检查所有预期的 url 是否存在于汤中,因为我怀疑有些需要 javascript 才能在页面上运行。
推荐阅读
- google-sheets - 更新文件夹和子文件夹中所有文件中的单个工作表
- android - Android 移动应用程序可绘制图标下载
- bootstrap-4 - Bootstrap 4手风琴不会自动关闭以前打开的部分
- javascript - 混合内容:HTTP 问题
- c# - 根据 Entity Framework Core 中的不同列选择所有行
- json - 如何将 JSON 提交到 PowerShell RestMethod 或 WebRequest
- ruby - 是否可以覆盖接收器行为?
- python - 表单集验证的 Django 问题
- java - 每个 Java .class 文件是否都包含一个公共类?
- c# - 在 c# 中搜索给定字符串的匿名类型的任何属性