开源
环境配置
- 安装Chrome浏览器
- pip安装工具包
pip install selenium
pip install chromedriver_autoinstaller
pip install flask
安装驱动
运行installSelenium.py
,调用chromedriver_autoinstaller
包自动安装。
若能成功打开,环境配置成功。
from selenium import webdriver
import chromedriver_autoinstaller
chromedriver_autoinstaller.install() # Check if the current version of chromedriver exists
# and if it doesn't exist, download it automatically,
# then add chromedriver to path
driver = webdriver.Chrome()
driver.get("http://www.python.org")
assert "Python" in driver.title
尝试运行
运行main.py
文件,可以爬取定义的几个搜索页网站,取出所有的链接和链接文本。
文件解析
定义链接
keyword = '通义千问'
urls = [
'https://search.bilibili.com/all?keyword=' + keyword,
'https://so.csdn.net/so/search?q=' + keyword,
'https://www.bing.com/search?q=' + keyword,
'https://www.baidu.com/s?wd=' + keyword,
]
定义过滤条件
links_and_titles = [] # 存储所有链接和标题
keywords_to_filter = ['首页', '番剧', '直播', ...] # 省略了部分内容
domains_to_filter = ['space.bilibili']
links_and_titles
: 存储抓取到的链接和标题。keywords_to_filter
: 需要过滤掉的标题关键词列表。domains_to_filter
: 需要过滤掉的域名列表。
逐个URL处理
for url in urls:
driver.get(url)
link_elements = driver.find_elements(By.TAG_NAME, 'a')
- 循环处理每个URL。
driver.get(url)
: 打开指定的URL。link_elements = driver.find_elements(By.TAG_NAME, 'a')
: 获取页面上的所有链接元素。
提取链接和标题
for element in link_elements:
try:
link = element.get_attribute('href')
title = element.text
except Exception as e:
print(e)
if not link or not title:
continue
title = title.strip().replace('\n', '')
- 循环处理每个链接元素。
link = element.get_attribute('href')
: 获取链接的URL。title = element.text
: 获取链接的标题文本。- 捕获异常并跳过有问题的元素。
- 过滤掉空的链接和标题,并清理标题中的换行符和空格。
过滤链接和标题
contains_keyword = True
for keyword1 in keywords_to_filter:
if keyword1 in title:
contains_keyword = False
break
for keyword1 in domains_to_filter:
if keyword1 in link:
contains_keyword = False
break
if contains_keyword and re.search('[\u4e00-\u9fff]', title):
links_and_titles.append((link, title))
- 初始化
contains_keyword
为True。 - 检查标题中是否包含需要过滤的关键词,如果包含则设置
contains_keyword
为False。 - 检查链接中是否包含需要过滤的域名,如果包含则设置
contains_keyword
为False。 - 如果
contains_keyword
仍为True,并且标题中包含中文字符,则将链接和标题添加到links_and_titles
列表中。
输出所有链接和标题
for link, title in links_and_titles:
print(f'Title: {title}, Link: {link}')
- 输出抓取到的所有链接和标题。
运行结果
出现这样类型的爬取结果。
...
Title: 出现背景, Link: http://www.baidu.com/link?url=ZHcZvNb6yhveASLIkP49tHQWMizF37J-AIF1S2yEtKSrRLRjR1cbYa6OckdPvHrs2j6AMCKjrPbalesjq8wJCJ9YXdkFOKj2ldoWvMm8LkS
Title: 名称由来, Link: http://www.baidu.com/link?url=ZHcZvNb6yhveASLIkP49tHQWMizF37J-AIF1S2yEtKSrRLRjR1cbYa6OckdPvHrs2j6AMCKjrPbalesjq8wJC2uSDPXG9516PzNNClJM9va
Title: 发展历程, Link: http://www.baidu.com/link?url=ZHcZvNb6yhveASLIkP49tHQWMizF37J-AIF1S2yEtKSrRLRjR1cbYa6OckdPvHrs2j6AMCKjrPbalesjq8wJC4dusDqvCvIUMdxSZlYDUTi
Title: 主要功能, Link: http://www.baidu.com/link?url=ZHcZvNb6yhveASLIkP49tHQWMizF37J-AIF1S2yEtKSrRLRjR1cbYa6OckdPvHrs2j6AMCKjrPbalesjq8wJCI2tbU8SusRY1Yclq7sK7l7
Title: 百度百科, Link: http://www.baidu.com/link?url=ALgYgtdxsW4pNETBRGi6qcbRD7P8MhV4G2F-VV5o6FORusPD3n-m1Q0nzP43Oil84vJs1mu2u-64wUV2MmjiHSg-rASMjzglxq1ch0n22Vm
...
过滤信息
我们发现,有一些网页自带的广告,和一些我们不愿意看到的域名。
后者可以很简单的处理:domains_to_filter = ['space.bilibili']
,即可简单过滤。
广告需要通过链接文字来处理,运行a.py
进行过滤:
# 原始数据
data = """
Title: 出现背景, Link: http://www.baidu.com/link?url=ZHcZvNb6yhveASLIkP49tHQWMizF37J-AIF1S2yEtKSrRLRjR1cbYa6OckdPvHrs2j6AMCKjrPbalesjq8wJCJ9YXdkFOKj2ldoWvMm8LkS
Title: 名称由来, Link: http://www.baidu.com/link?url=ZHcZvNb6yhveASLIkP49tHQWMizF37J-AIF1S2yEtKSrRLRjR1cbYa6OckdPvHrs2j6AMCKjrPbalesjq8wJC2uSDPXG9516PzNNClJM9va
Title: 发展历程, Link: http://www.baidu.com/link?url=ZHcZvNb6yhveASLIkP49tHQWMizF37J-AIF1S2yEtKSrRLRjR1cbYa6OckdPvHrs2j6AMCKjrPbalesjq8wJC4dusDqvCvIUMdxSZlYDUTi
Title: 主要功能, Link: http://www.baidu.com/link?url=ZHcZvNb6yhveASLIkP49tHQWMizF37J-AIF1S2yEtKSrRLRjR1cbYa6OckdPvHrs2j6AMCKjrPbalesjq8wJCI2tbU8SusRY1Yclq7sK7l7
Title: 百度百科, Link: http://www.baidu.com/link?url=ALgYgtdxsW4pNETBRGi6qcbRD7P8MhV4G2F-VV5o6FORusPD3n-m1Q0nzP43Oil84vJs1mu2u-64wUV2MmjiHSg-rASMjzglxq1ch0n22Vm
"""
# 提取标题
titles = [line.split(': ')[1].split(', Link')[0].strip() for line in data.strip().split('\n')]
# 输出结果
for title in titles:
print(f'\'{title}\'',end=',')
得到结果:'出现背景','名称由来','发展历程','主要功能','百度百科'
,将这个结果放入keywords_to_filter
实现对链接文本的过滤。
最终结果
得到如下结构的结果:
Title:{}, Link: {}
...
Title:{}, Link: {}
后续经过Flask服务器,将这个输出结果转化成 JSON 格式,通过HTTP交给其他函数处理。