项目实训-selenium爬取

开源

工具已开源

环境配置

  1. 安装Chrome浏览器
  2. 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交给其他函数处理。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值