社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

我常用几个实用的Python爬虫库,收藏~

码农逆袭 • 1 月前 • 64 次点击  
Python中有非常多用网络数据采集的库,功能非常强大,有的用于抓取网页,有的用于解析网页,这里介绍6个最常用的库。

1. BeautifulSoup

BeautifulSoup是最常用的Python网页解析库之一,可将 HTML 和 XML 文档解析为树形结构,能更方便地识别和提取数据。

BeautifulSoup可以自动将输入文档转换为 Unicode,将输出文档转换为 UTF-8。此外,你还可以设置 BeautifulSoup 扫描整个解析页面,识别所有重复的数据(例如,查找文档中的所有链接),只需几行代码就能自动检测特殊字符等编码。

from bs4 import BeautifulSoup  
  
# 假设这是我们从某个网页获取的HTML内容(这里直接以字符串形式给出)  
html_content = """  
  
  
    示例网页  
  
  
    

欢迎来到BeautifulSoup示例

  
    

这是一个关于BeautifulSoup的简单示例。

  
    关于我们  
  
  
"""
  
  
# 使用BeautifulSoup解析HTML内容,这里默认使用Python的html.parser作为解析器  
# 你也可以指定其他解析器,如'lxml'或'html5lib',但需要先安装它们  
soup = BeautifulSoup(html_content, 'html.parser')  
  
# 提取并打印标签的文本内容  
print("网页标题:", soup.title.string)  # 网页标题: 示例网页  
  
# 提取并打印

标签的文本内容,这里使用class属性来定位  


print("介绍内容:", soup.find('p', class_='introduction').string)  # 介绍内容: 这是一个关于BeautifulSoup的简单示例。  
  
# 提取并打印标签的href属性和文本内容  
link = soup.find('a', class_='link')  
print("链接地址:", link['href'])  # 链接地址: https://www.example.com/about  
print("链接文本:", link.string)  # 链接文本: 关于我们  
  
# 注意:如果HTML内容中包含多个相同条件的标签,你可以使用find_all()来获取它们的一个列表  
# 例如,要获取所有标签的href属性,可以这样做:  
all_links = [a['href'for a in soup.find_all('a')]  
print("所有链接地址:", all_links)  # 假设HTML中有多个标签,这里将列出它们的href属性  
# 注意:上面的all_links列表在当前的HTML内容中只有一个元素,因为只有一个标签

2. Scrapy

Scrapy是一个流行的高级爬虫框架,可快速高效地抓取网站并从其页面中提取结构化数据。

由于 Scrapy 主要用于构建复杂的爬虫项目,并且它通常与项目文件结构一起使用

Scrapy 不仅仅是一个库,还可以用于各种任务,包括监控、自动测试和数据挖掘。这个 Python 库包含一个内置的选择器(Selectors)功能,可以快速异步处理请求并从网站中提取数据。

# 假设这个文件名为 my_spider.py,但它实际上应该放在 Scrapy 项目的 spiders 文件夹中  
  
import scrapy  
  
class MySpider(scrapy.Spider):  
    # Spider 的名称,必须是唯一的  
    name = 'example_spider'  
  
    # 允许爬取的域名列表(可选)  
    # allowed_domains = ['example.com']  
  
    # 起始 URL 列表  
    start_urls = [  
        'http://example.com/',  
    ]  
  
    def parse(self, response):  
        # 这个方法用于处理每个响应  
        # 例如,我们可以提取网页的标题  
        title = response.css('title::text').get()  
        if title:  
            # 打印标题(在控制台输出)  
            print(f'Title: {title}')  
  
        # 你还可以继续爬取页面中的其他链接,这里只是简单示例  
        # 例如,提取所有链接并请求它们  
        # for href in response.css('a::attr(href)').getall():  
        #     yield scrapy.Request(url=response.urljoin(href), callback=self.parse)  
  
# 注意:上面的代码只是一个 Spider 类的定义。  
# 要运行这个 Spider,你需要将它放在一个 Scrapy 项目中,并使用 scrapy crawl 命令来启动爬虫。  
# 例如,如果你的 Scrapy 项目名为 myproject,并且你的 Spider 文件名为 my_spider.py,  
# 那么你应该在项目根目录下运行以下命令:  
# scrapy crawl example_spider

3. Selenium

Selenium 是一款基于浏览器地自动化程序库,可以抓取网页数据。它能在 JavaScript 渲染的网页上高效运行,这在其他 Python 库中并不多见。

在开始使用 Python 处理 Selenium 之前,需要先使用 Selenium Web 驱动程序创建功能测试用例。

Selenium 库能很好地与任何浏览器(如 Firefox、Chrome、IE 等)配合进行测试,比如表单提交、自动登录、数据添加/删除和警报处理等。

from selenium import webdriver  
from selenium.webdriver.common.keys import Keys  
from selenium.webdriver.common.by import By  
from selenium.webdriver.support.ui import WebDriverWait  
from selenium.webdriver.support import expected_conditions as EC  
  
# 设置WebDriver的路径(根据你的系统路径和WebDriver版本修改)  
driver_path = '/path/to/your/chromedriver'  
  
# 初始化WebDriver  
driver = webdriver.Chrome(executable_path=driver_path)  
  
try:  
    # 打开网页  
    driver.get('https://www.example.com')  
  
    # 等待页面加载完成(这里使用隐式等待,针对所有元素)  
    # 注意:隐式等待可能会影响性能,通常在脚本开始时设置一次  
    driver.implicitly_wait(10)  # 秒  
  
    # 查找并输入文本到搜索框(假设搜索框有一个特定的ID或类名等)  
    # 这里以ID为'search'的输入框为例  
    search_box = driver.find_element(By.ID, 'search')  
    search_box.send_keys('Selenium WebDriver')  
  
    # 提交搜索(假设搜索按钮是一个类型为submit的按钮或是一个可以点击的输入框)  
    # 如果搜索是通过按Enter键触发的,可以直接在search_box上使用send_keys(Keys.ENTER)  
    # 这里假设有一个ID为'submit'的按钮  
    submit_button = driver.find_element(By.ID, 'submit')  
    submit_button.click()  
  
    # 等待搜索结果加载完成(这里使用显式等待作为示例)  
    # 假设搜索结果页面有一个特定的元素,我们等待它出现  
    wait = WebDriverWait(driver, 10)  # 等待最多10秒  
    element = wait.until(EC.presence_of_element_located((By.ID, 'results')))  
  
    # 执行其他操作...  
  
finally:  
    # 关闭浏览器  
    driver.quit()

4. requests

不用多说,requests 是 Python 中一个非常流行的第三方库,用于发送各种 HTTP 请求。它简化了 HTTP 请求的发送过程,使得从网页获取数据变得非常简单和直观。

requests 库提供了丰富的功能和灵活性,支持多种请求类型(如 GET、POST、PUT、DELETE 等),可以发送带有参数、头信息、文件等的请求,并且能够处理复杂的响应内容(如 JSON、XML 等)。

import requests  
  
# 目标URL  
url = 'https://httpbin.org/get'  
  
# 发送GET请求  
response = requests.get(url)  
  
# 检查请求是否成功  
if response.status_code == 200:  
    # 打印响应内容  
    print(response.text)  
else:  
    # 打印错误信息  
    print(f'请求失败,状态码:{response.status_code}')

5. urllib3

urllib3 是 Python内置网页请求库,类似于 Python 中的requests库,主要用于发送HTTP请求和处理HTTP响应。它建立在Python标准库的urllib模块之上,但提供了更高级别、更健壮的API。

urllib3可以用于处理简单身份验证、cookie 和代理等复杂任务。

import urllib3  
  
# 创建一个HTTP连接池  
http = urllib3.PoolManager()  
  
# 目标URL  
url = 'https://httpbin.org/get'  
  
# 使用连接池发送GET请求  
response = http.request('GET', url)  
  
# 检查响应状态码  
if response.status == 200:  
    # 打印响应内容(注意:urllib3默认返回的是bytes类型,这里我们将其解码为str)  
    print(response.data.decode('utf-8'))  
else:  
    # 如果响应状态码不是200,则打印错误信息  
    print(f'请求失败,状态码:{response.status}')  
  
# 注意:urllib3没有直接的方法来处理JSON响应,但你可以使用json模块来解析  
# 如果响应内容是JSON,你可以这样做:  
# import json  
# json_response = json.loads(response.data.decode('utf-8'))  
# print(json_response)

6. lxml

lxml是一个功能强大且高效的Python库,主要用于处理XML和HTML文档。它提供了丰富的API,使得开发者可以轻松地读取、解析、创建和修改XML和HTML文档。

from lxml import etree  
  
# 假设我们有一段HTML或XML内容,这里以HTML为例  
html_content = """  
  
    
    示例页面  
    
    
    

欢迎来到我的网站

  
    

这是一个使用lxml解析的示例页面。

  
    
      
          
  • 项目1
  •   
          
  • 项目2
  •   
        
  
    
  
"""
  
  
# 使用lxml的etree模块来解析HTML或XML字符串  
# 注意:对于HTML内容,我们使用HTMLParser解析器  
parser = etree.HTMLParser()  
tree = etree.fromstring(html_content, parser=parser)  
  
# 查找并打印标签的文本  
title = tree.find('.//title').text  
print("页面标题:", title)  
  
# 查找并打印class为"description"的

标签的文本  


description = tree.find('.//p[@class="description"]').text  
print("页面描述:", description)  
  
# 查找所有的
  • 标签,并打印它们的文本  

  • for li in tree.findall('.//li'):  
        print("列表项:", li.text)  
      
    # 注意:lxml也支持XPath表达式来查找元素,这里只是简单展示了find和findall的用法  
    # XPath提供了更强大的查询能力

    其他爬虫工具

    除了Python库之外,还有其他爬虫工具可以使用。

    八爪鱼爬虫

    八爪鱼爬虫是一款功能强大的桌面端爬虫软件,主打可视化操作,即使是没有任何编程基础的用户也能轻松上手。

    官网:https://affiliate.bazhuayu.com/hEvPKU

    八爪鱼支持多种数据类型采集,包括文本、图片、表格等,并提供强大的自定义功能,能够满足不同用户需求。此外,八爪鱼爬虫支持将采集到的数据导出为多种格式,方便后续分析处理。

    亮数据爬虫

    亮数据平台提供了强大的数据采集工具,比如Web Scraper IDE、亮数据浏览器、SERP API等,能够自动化地从网站上抓取所需数据,无需分析目标平台的接口,直接使用亮数据提供的方案即可安全稳定地获取数据。

    网站:https://get.brightdata.com/weijun

    亮数据浏览器支持对多个网页进行批量数据抓取,适用于需要JavaScript渲染的页面或需要进行网页交互的场景。

    Web Scraper

    Web Scraper是一款轻便易用的浏览器扩展插件,用户无需安装额外的软件,即可在Chrome浏览器中进行爬虫。插件支持多种数据类型采集,并可将采集到的数据导出为多种格式。无论是Python库还是爬虫软件,都能实现数据采集任务,可以选择适合自己的。当然记得在使用这些工具时,一定要遵守相关网站的爬虫政策和法律法规。

    95后程序员月薪2万背着电脑送外卖,送单途中改Bug
    收藏!史上最简单的升级ChatGPT Plus教程,3分钟搞定升级难题


    推荐一款人人都使用的提效工具


    我每天都在卖这个完全克隆ChatGPT与Claude的工具,国内环境也能直上,价格不到官方一半,想通过ChatGPT和Claude为工作提效,可以扫码了解并购买



    为工作提效,扫码了解GPT与Claude双系统


    扫码加我微信,围观朋友圈,拓展视野




    Python社区是高质量的Python/Django开发社区
    本文地址:http://www.python88.com/topic/175486
     
    64 次点击