1:我们按照广度优先搜索算法获取网站URL,一般使用广度优先搜索的思想。这是因为广度优先搜索更适合用于按层次遍历,而在爬虫中,我们通常会从一个页面开始,然后逐层深入爬取其他页面。
def crawl_website(base_url, max_depth=3):
visited = set()
queue = [(base_url, 0)]
url_list = []
while queue:
current_url, depth = queue.pop(0)
if depth > max_depth:
break
if current_url in visited:
continue
try:
response = requests.get(current_url)
visited.add(current_url)
url_list.append(current_url)
if response.status_code == 200:
# 处理页面内容,这里简单输出页面标题
soup = BeautifulSoup(response.text, 'html.parser')
title = soup.title.text.strip()
print(f"Depth {depth}: - {current_url}")
# 提取页面中的链接并加入队列
for link in soup.find_all('a', href=True):
next_url = urljoin(current_url, link['href'])
if urlparse(next_url).netloc == urlparse(base_url).netloc:
queue.append((next_url, depth + 1))
except Exception as e:
print(f"Error crawling {current_url}: {e}")
return url_list
2:根据获得的URL,进行新闻主体内容提取:
def getcontent(url):
response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'}, timeout=5)
response.encoding = 'utf-8'
if response.status_code == 200:
html = response.text
extractor = GeneralNewsExtractor()
result = extractor.extract(html)
print(result)
else:
print(f"请求失败,状态码:{response.status_code}")
return result
3:得到的result中提取需要的内容。
这种方法需要给出网站中的一个网页,不需要给出xpath,css等格式,就能够对新闻主体内容进行抽取,抽取效果目前看来还不错,不会抽取到页眉页脚元素。对于没有正文的导航页,抽取到免责声明。这也好清洗,总体看来效果不错。