【Python百宝箱】抓取世界:网络爬虫和数据提取全家桶

2024-01-03 17:14:23

特别声明:
此教程为纯技术分享!本教程的目的决不是为那些怀有不良动机的人提供及技术支持!也不承担因为技术被滥用所产生的连带责任!本教程的目的记录分享学习技术的过程

数据采掘宝典:Python网络爬虫与数据处理实战手册

前言

网络爬虫和数据提取已经成为了当今信息时代中不可或缺的一部分,因为它们可以让我们快速、高效地获取大量有用的数据并对其进行处理和分析。Python是一种非常流行的编程语言,具有丰富的库和工具来支持网络爬虫和数据提取。

本篇文章将介绍十个Python库,包括Scrapy、Beautiful Soup、Selenium、Requests、LXML、Pandas、PyQuery、Feedparser、Tesserocr和Newspaper。这些库涵盖了Python在数据提取和网络爬取领域的许多重要方面,并且广泛应用于实际项目和应用中。

欢迎订阅专栏:Python库百宝箱:解锁编程的神奇世界

1. Scrapy

1.1 概述

Scrapy是一个开源的Python框架,用于快速构建Web爬虫。它可以自动化地从网站上获取结构化的数据,例如价格、评论、文章等,并将其存储到本地或处理后发送至API。该框架支持异步网络请求、多线程和分布式爬取,还有很好的扩展性,可以通过中间件和管道来自定义处理流程。

1.2 安装与配置

可以使用pip安装Scrapy,运行以下命令:

pip install scrapy

安装完成后,可以在终端中输入以下命令检查是否正确安装:

scrapy version
1.3 基本用法

以下是一个简单的Scrapy爬虫示例,演示如何爬取豆瓣电影Top250的数据:

import scrapy

class DoubanMovieSpider(scrapy.Spider):
    # 爬虫的名称,唯一标识
    name = "douban_movie"
    # 允许访问的域名
    allowed_domains = ["movie.douban.com"]
    # 起始URL列表
    start_urls = [
        "https://movie.douban.com/top250"
    ]

    # 解析方法
    def parse(self, response):
        for movie in response.xpath('//ol/li'):
            yield {
                'title': movie.xpath('.//span[@class="title"]/text()').extract_first(),
                'rating': movie.xpath('.//span[@class="rating_num"]/text()').extract_first()
            }

        # 获取下一页链接并递归调用parse方法
        next_page_url = response.xpath('//span[@class="next"]/a/@href')
        if next_page_url:
            next_page_url = response.urljoin(next_page_url.extract_first())
            yield scrapy.Request(next_page_url, callback=self.parse)

在终端中进入该脚本所在目录后,运行以下命令即可启动爬虫:

scrapy crawl douban_movie -o output.csv

这会将爬虫输出的结果保存为CSV文件。

1.4 中间件和管道

Scrapy提供了中间件和管道来自定义处理流程。其中,中间件可以拦截请求和响应并进行修改,常用的中间件有User-Agent和IP代理池等;而管道则用于对爬取到的数据进行处理和存储,例如将数据存储到MySQL数据库中。以下是一个使用自定义管道的示例代码:

import scrapy
from scrapy.exceptions import DropItem
from scrapy.exporters import CsvItemExporter

class CsvExportPipeline(object):
    def __init__(self):
        self.file = open('output.csv', 'wb')
        self.exporter = CsvItemExporter(self.file, fields_to_export=['title', 'rating'])
        self.exporter.start_exporting()

    def process_item(self, item, spider):
        if 'rating' not in item:
            raise DropItem("Missing rating in %s" % item)

        self.exporter.export_item(item)
        return item

    def spider_closed(self, spider):
        self.exporter.finish_exporting()
        self.file.close()

将该文件保存为pipelines.py,然后在settings.py中添加以下代码以启用该管道:

ITEM_PIPELINES = {
    'myproject.pipelines.CsvExportPipeline': 300,
}
1.5 异步支持

Scrapy支持异步网络请求,利用Twisted框架实现,可以大大提高爬虫效率。以下是异步请求的示例代码:

import scrapy         
from twisted.internet.defer import inlineCallbacks, Deferred
from twisted.internet.task import deferLater

class AsyncDoubanMovieSpider(scrapy.Spider):
    name = "async_douban_movie"
    allowed_domains = ["movie.douban.com"]
    start_urls = [
        "https://movie.douban.com/top250"
    ]

    # 使用 inlineCallbacks 装饰器将方法转化为生成器
    @inlineCallbacks
    def parse(self, response):
        for movie in response.xpath('//ol/li'):
            yield {
                'title': movie.xpath('.//span[@class="title"]/text()').extract_first(),
                'rating': movie.xpath('.//span[@class="rating_num"]/text()').extract_first()
            }

        # 模拟1秒钟的延迟
        yield deferLater(reactor, 1, lambda: None)

        # 获取下一页链接并递归调用parse方法
        next_page_url = response.xpath('//span[@class="next"]/a/@href')
        if next_page_url:
            next_page_url = response.urljoin(next_page_url.extract_first())
            response = yield scrapy.Request(next_page_url)
            yield self.parse(response)

运行该爬虫后,可以看到它以非常快的速度连续爬取页面,而不必等待每个响应的返回。

2. Beautiful Soup

2.1 简介与安装

Beautiful Soup是一个Python库,用于从HTML或XML文档中提取数据。它能够自动将复杂的HTML文档转换成树形结构,使得我们可以方便地遍历和搜索节点。Beautiful Soup的API简单易用,支持多种解析器,包括 Python 标准库中的 html.parser、lxml HTML 解析器、lxml XML 解析器和 html5lib 解析器。以下是安装示例:

pip install beautifulsoup4
2.2 基本用法

以下是一个简单的Beautiful Soup示例,演示如何从HTML文档中提取链接:

import requests
from bs4 import BeautifulSoup

url = 'https://www.baidu.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

for link in soup.find_all('a'):
    print(link.get('href'))

这段代码首先使用requests库获取百度首页的HTML源码,然后使用Beautiful Soup解析该页面并提取所有链接,最后打印出来。

2.3 标签的遍历与搜索

可以使用Beautiful Soup的许多方法遍历和搜索HTML标签。其中,find()和find_all()方法是最常用的方法。以下是一个示例,演示如何选择所有class为’job-item’的div元素:

job_items = soup.find_all('div', class_='job-item')

这段代码会返回一个列表,其中包含所有class为’job-item’的div元素。如果只需要第一个匹配的元素,则可以使用find()方法替代find_all()。

2.4 数据提取与修改

可以使用Beautiful Soup的方法轻松提取节点的文本、属性和子节点等信息。以下是一个示例,演示如何提取第一个h1标签的文本内容:

h1 = soup.find('h1')
print(h1.text)

这段代码会输出百度首页的标题。

如果需要修改节点的文本、属性或添加新的节点,则可以使用Beautiful Soup的一些方法。例如,以下代码会将百度首页的标题修改为"Hello World":

h1 = soup.find('h1')
h1.string = 'Hello World'
2.5 高级用法

除了基本用法外,Beautiful Soup还有很多高级用法,例如CSS选择器、正则表达式和XML解析等。以下是一个示例,演示如何使用CSS选择器提取所有带有href属性的链接:

links = soup.select('a[href]')
for link in links:
    print(link.get('href'))

这段代码会返回一个列表,其中包含所有带有href属性的a标签,并打印出它们的链接。

3. Selenium

3.1 介绍与安装

Selenium是一个自动化Web测试工具,也可以用于构建Web爬虫。它能够模拟用户在浏览器中的操作,并且支持多种浏览器,包括Chrome、Firefox和Edge等。以下是安装示例:

pip install selenium

此外,还需要下载浏览器对应的驱动程序,并将其添加至系统路径中。以Chrome为例,可以从以下网址下载对应版本的驱动程序:https://sites.google.com/a/chromium.org/chromedriver/downloads

3.2 WebDriver的使用

Selenium使用WebDriver来控制浏览器,可以通过创建WebDriver对象并指定浏览器类型来启动浏览器。以下是一个示例,演示如何使用Selenium打开百度首页:

from  selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')

这段代码会启动Chrome浏览器,并自动跳转到百度首页。

3.3 元素定位与操作

Selenium提供了多种方法来定位页面上的元素,例如通过ID、class、XPath和CSS选择器等。以下是一个示例,演示如何使用XPath选择器查找搜索框并输入关键词:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

search_box = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//input[@id="kw"]')))
search_box.send_keys('Python')

这段代码首先使用WebDriverWait等待搜索框的加载,然后使用XPath选择器查找搜索框元素,并调用send_keys()方法向搜索框中输入关键词。

3.4 页面交互与模拟用户行为

除了定位元素外,Selenium还支持模拟用户在浏览器中的各种操作,例如点击链接、填写表单、滚动页面和上传文件等。以下是一个示例,演示如何使用Selenium模拟用户登录GitHub:

username = 'your_username'
password = 'your_password'

driver.get('https://github.com/login')
driver.find_element_by_id('login_field').send_keys(username)
driver.find_element_by_id('password').send_keys(password)
driver.find_element_by_name('commit').click()

这段代码首先跳转到GitHub的登录页面,然后查找用户名和密码输入框并输入相应的信息,最后点击登录按钮完成登录过程。

3.5 高级特性与应用场景

Selenium还有很多高级特性,例如处理JavaScript、窗口管理、调试功能和分布式爬取等。其中,可视化爬虫和自动化测试是Selenium的主要应用场景之一,可以帮助我们快速定位和解决Web页面问题,提高生产效率。

4. Requests

4.1 发送HTTP请求

Requests是一个Python库,用于发送HTTP请求和处理响应。它支持多种请求方法,包括GET、POST、PUT、DELETE和HEAD等,并能够设置请求头、参数和Cookie等。以下是一个示例,演示如何使用Requests发送GET请求:

import requests

url = 'https://www.baidu.com'
response = requests.get(url)
print(response.text)

这段代码会发送一个GET请求到百度首页,并打印出返回的HTML源码。

4.2 请求头与参数

除了基本的请求方法外,Requests还支持设置请求头和查询参数等操作。以下是一个示例,演示如何设置请求头和查询参数:

import requests

url = 'https://www.baidu.com/s'
params = {'wd': 'Python'}
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'}

response = requests.get(url, params=params, headers=headers)
print(response.url)

这段代码会发送一个GET请求到百度搜索页面,并将查询参数和请求头传递给服务器。最后打印出请求的URL。

4.3 响应处理与解析

Requests返回的响应对象包含了各种信息,例如状态码、响应头和响应体等。可以使用响应对象的属性和方法对响应进行处理和解析。以下是一个示例,演示如何获取响应状态码和响应头:

import requests

url = 'https://www.baidu.com'
response = requests.get(url)

status_code = response.status_code
headers = response.headers

print(status_code)
print(headers)

这段代码会发送一个GET请求到百度首页,并获取响应状态码和响应头。

4.4 Cookie与Session

Requests还支持设置Cookie和Session等操作。以下是一个示例,演示如何使用Session实现保持登录状态:

import requests

login_url = 'https://accounts.example.com/login'
dashboard_url = 'https://dashboard.example.com'

session = requests.Session() 

# 登录请求
data = {'email': 'user@example.com', 'password': 'password'}
session.post(login_url, data=data)

# 访问登录后的页面
response = session.get(dashboard_url)
print(response.text)

这段代码首先创建了一个Session对象,然后发送POST请求进行登录,最后通过Session对象发送GET请求访问登录后的页面。由于使用了Session,因此可以保持登录状态,避免反复登录。

4.5 异常处理与重试

在进行Web爬取时,经常会遇到一些异常情况,例如网络错误、服务器繁忙或者网站限制等。Requests提供了一些异常类和重试机制,可以帮助我们更好地处理这些异常情况。以下是一个示例,演示如何设置最大重试次数和超时时间:

import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

url = 'https://www.example.com'

retry_strategy = Retry(
    total=3,
    backoff_factor=0.5,
    status_forcelist=[429, 500, 502, 503, 504],
    method_whitelist=["GET"]
)

adapter = HTTPAdapter(max_retries=retry_strategy)

with requests.Session() as session:
    session.mount("https://", adapter)
    session.mount("http://", adapter)

    response = session.get(url, timeout=5)
    print(response.text)

这段代码会使用Retry和HTTPAdapter分别设置最大重试次数和超时时间,然后使用Session对象发送GET请求。如果请求失败或超时,就会进行重试。这可以帮助我们更好地应对网络异常和服务器压力等情况。

5. LXML

5.1 简介与安装

LXML是一个Python库,用于解析和处理XML和HTML文档。它具有高性能、易用性和灵活性等优点,并支持XPath和CSS选择器等查询语言。以下是一个示例,演示如何使用LXML解析HTML文档:

from lxml import etree

html = '''
<html>
<head><title>Example</title></head>
<body>
    <h1>Hello, World!</h1>
    <p>Welcome to my website.</p>
</body>
</html>
'''

tree = etree.HTML(html)
title = tree.xpath('//title/text()')[0]
print(title)

这段代码会将HTML文本解析为Element对象,并使用XPath提取标题元素的内容。最后打印出标题。

5.2 元素选择与遍历

在LXML中,可以使用XPath和CSS选择器等方式选择和遍历元素。以下是一个示例,演示如何使用XPath选择元素:

from lxml import etree

html = '''
<html>
<head><title>Example</title></head>
<body>
    <h1>Hello, World!</h1>
    <ul>
        <li><a href="http://example.com">Example</a></li>
        <li><a href="http://www.baidu.com">Baidu</a></li>
    </ul>
</body>
</html>
'''

tree = etree.HTML(html)
links = tree.xpath('//ul/li/a/@href')
for link in links:
    print(link)

这段代码会选择所有链接元素,并使用XPath提取链接地址。最后打印出两个链接地址。

5.3 数据提取与修改

除了选择和遍历元素外,LXML还支持对元素进行数据提取和修改等操作。以下是一个示例,演示如何使用XPath提取元素属性和文本:

from lxml import etree

html = '''
<html>
<head><title>Example</title></head>
<body>
    <h1>Hello, World!</h1>
    <ul>
        <li><a href="http://example.com">Example</a></li>
        <li><a href="http://www.baidu.com">Baidu</a></li>
    </ul>
</body>
</html>
'''

tree = etree.HTML(html)
link = tree.xpath('//ul/li/a')[0]

# 提取属性
href = link.get('href')

# 提取文本
text = link.text.strip()

print(href)
print(text)

这段代码会先选择第一个链接元素,并使用get方法提取href属性和text属性的内容。最后打印出链接地址和链接文本。

5.4 XPath与CSS选择器

在LXML中,可以使用XPath和CSS选择器两种方式选择和操作元素。XPath语法类似于文件系统路径的表示方法,而CSS选择器语法则类似于jQuery选择器的表示方法。以下是一个示例,演示如何使用CSS选择器选择元素:

from lxml import etree

html = '''
<html>
<head><title>Example</title></head>
<body>
    <h1>Hello, World!</h1>
    <ul>
        <li><a href="http://example.com">Example</a></li>
        <li><a href="http://www.baidu.com">Baidu</a></li>
    </ul>
</body>
</html>
'''

tree = etree.HTML(html)
links = tree.cssselect('ul li a')
for link in links:
    href = link.get('href')
    text = link.text.strip()
    print(href)
    print(text)

这段代码和前面的示例类似,只是使用了CSS选择器的方式选择元素。

5.5 性能优化与扩展

在实际使用中,当需要处理大规模的XML或HTML文档时,LXML的性能可能会受到影响。因此,可以采取一些优化措施来提高性能,例如使用XPath按需加载或者结合Cython编译等加速手段。另外,LXML还支持一些扩展和插件,例如XPath扩展、XSLT转换、CSS选择器等。这些功能可以进一步增强LXML的功能和灵活性。

6. Pandas

6.1 数据结构介绍

Pandas是一个Python库,用于处理和分析数据。它提供了两种基本的数据结构:Series和DataFrame。Series是一维数组对象,类似于带有标签的列表。DataFrame是二维表格结构,类似于关系型数据库中的表格。以下是一个示例,演示如何创建Series和DataFrame对象:

import pandas as pd

# 创建Series
s = pd.Series([1, 3, 5, np.nan, 6, 8])
print(s)

# 创建DataFrame
data = {'name': ['John', 'Mary', 'Tom'],
        'age': [20, 25, 30],
        'gender': ['M', 'F', 'M']}
df = pd.DataFrame(data)
print(df)

这段代码会先创建一个包含NaN值的Series对象,然后创建一个包含姓名、年龄和性别等信息的DataFrame对象。最后打印出这两个对象的内容。

6.2 数据导入与导出

在实际应用中,需要从文件或网络等来源导入数据,并将处理结果导出到文件或数据库等存储介质中。Pandas提供了多种数据导入和导出方式,例如CSV、Excel、SQL等格式。以下是一个示例,演示如何使用Pandas读取和写入CSV文件:

import pandas as pd

# 读取CSV文件
df = pd.read_csv('example.csv')

# 处理数据

# 写入CSV文件
df.to_csv('output.csv', index=False)

这段代码会先使用read_csv方法读取CSV文件,然后进行数据处理,最后使用to_csv方法将结果写入CSV文件。

6.3 数据清洗与处理

在处理数据时,经常需要进行数据清洗、转换和合并等操作。Pandas提供了多种数据清洗和处理方式,例如缺失值处理、重复值处理、数据类型转换和合并等。以下是一个示例,演示如何使用Pandas处理缺失值:

import pandas as pd
import numpy as np

# 创建DataFrame
data = {'name': ['John', 'Mary', 'Tom'],
        'age': [20, np.nan, 30],
        'gender': ['M', 'F', 'M']}
df = pd.DataFrame(data)

# 检查缺失值
print(df.isnull().sum())

# 删除缺失值
df.dropna(inplace=True)

# 填充缺失值
df.fillna(method='ffill', inplace=True)

print(df)

这段代码会先创建一个包含缺失值的DataFrame对象,然后使用isnull和dropna方法对缺失值进行检查和删除。最后使用fillna方法填充缺失值。

6.4 数据合并与拼接

在实际应用中,需要将多个数据源合并或者拼接起来,以便进行更全面的数据分析和处理。Pandas提供了多种数据合并和拼接方式,例如concat、merge和join等。以下是一个示例,演示如何使用Pandas进行数据合并:

import pandas as pd

# 创建DataFrame
data1 = {'name': ['John', 'Mary', 'Tom'],
        'age': [20, 25, 30]}
df1 = pd.DataFrame(data1)

data2 = {'name': ['John', 'Mary', 'Bob'],
        'gender': ['M', 'F', 'M']}
df2 = pd.DataFrame(data2)

# 数据合并
df = pd.merge(df1, df2, on='name', how='inner')
print(df)

这段代码会先创建两个包含姓名、年龄和性别等信息的DataFrame对象,然后使用merge方法将两个对象按照姓名字段进行合并。最后打印出合并后的DataFrame对象。

6.5 数据分组与聚合

在进行数据分析时,经常需要对数据进行分组和聚合操作。Pandas提供了多种数据分组和聚合方式,例如groupby、pivot_table和crosstab等。以下是一个示例,演示如何使用Pandas进行数据分组和聚合:

import pandas as pd

# 创建DataFrame
data = {'name': ['John', 'Mary', 'Tom', 'Bob', 'Alice'],
        'age': [20, 25, 30, 22, 27],
        'gender': ['M', 'F', 'M', 'M', 'F'],
        'salary': [3000, 4000, 5000, 3500, 4500]}
df = pd.DataFrame(data)

# 按性别分组,并计算平均薪资和年龄
result = df.groupby('gender').agg({'salary': 'mean', 'age': 'mean'})
print(result)

这段代码会先创建一个包含姓名、年龄、性别和薪资等信息的DataFrame对象,然后使用groupby方法按照性别字段进行分组,最后使用agg方法计算平均薪资和年龄。最后打印出结果。

7. PyQuery

7.1 简介与安装

PyQuery是一个Python库,用于解析和操作HTML/XML文档。它基于jQuery选择器语法,可以快速、灵活地定位和操作元素。以下是一个示例,演示如何使用PyQuery解析HTML文档:

from pyquery import PyQuery as pq

html = '''
<html>
<head><title>Example</title></head>
<body>
    <h1>Hello, World!</h1>
    <ul>
        <li><a href="http://example.com">Example</a></li>
        <li><a href="http://www.baidu.com">Baidu</a></li>
    </ul>
</body>
</html>
'''

doc = pq(html)
title = doc('title').text()
links = doc('ul li a')
for link in links:
    print(pq(link).attr('href'))

这段代码会先将HTML文本解析为PyQuery对象,然后使用选择器语法选择标题元素和链接元素,并分别提取它们的内容和属性。最后打印出结果。

7.2 类jQuery选择器语法

PyQuery支持类似于jQuery选择器的语法,可以快速定位和操作HTML/XML文档中的元素。以下是一些常用的选择器语法:

  • 标签选择器:tagname
  • ID选择器:#id
  • 类选择器:.class
  • 属性选择器:[attribute=value]
  • 后代选择器:ancestor descendant
  • 子元素选择器:parent > child
  • 兄弟元素选择器:prev + next

除了以上的选择器语法,还支持一些其他的选择器语法,例如伪类选择器和表单选择器等。这些语法可以根据实际需要进行使用。

7.3 元素操作与遍历

在PyQuery中,可以对元素进行多种操作,例如获取元素属性、设置元素内容、添加样式等。以下是一个示例,演示如何对元素进行操作:

from pyquery import PyQuery as pq

html = '''
<html>
<head><title>Example</title></head>
<body>
    <h1>Hello, World!</h1>
    <ul>
        <li><a href="http://example.com">Example</a></li>
        <li><a href="http://www.baidu.com">Baidu</a></li>
    </ul>
</body>
</html>
'''

doc = pq(html)
title = doc('title')

# 获取属性
print(title.attr('lang'))

# 设置内容
title.text('New Title')
print(doc)

# 添加样式
doc('h1').css('color', 'red')
print(doc)

这段代码会先选择标题元素,并使用attr方法获取lang属性的值;然后使用text方法修改标题元素的内容;最后使用css方法添加样式,使得标题元素的颜色变成红色。

在操作元素之外,也可以对元素进行遍历和查找。以下是一个示例,演示如何遍历和查找元素:

from  pyquery import PyQuery as pq

html = '''
<html>
<head><title>Example</title></head>
<body>
    <h1>Hello, World!</h1>
    <ul>
        <li><a href="http://example.com">Example</a></li>
        <li><a href="http://www.baidu.com">Baidu</a></li>
    </ul>
</body>
</html>
'''

doc = pq(html)
links = doc('ul li a')

# 遍历元素
for link in links:
    print(pq(link).text())

# 查找元素
baidu_link = doc('a[href="http://www.baidu.com"]')
print(baidu_link.text())

这段代码会先选择所有链接元素,并使用循环遍历每个元素的文本内容;然后使用属性选择器查找百度链接元素,并打印出它的文本内容。

7.4 数据提取与修改

在PyQuery中,可以使用类似于jQuery的方式对元素进行数据提取和修改。例如,可以使用text方法获取元素的文本内容,使用attr方法获取元素的属性值,使用html方法获取元素的HTML代码。以下是一个示例,演示如何使用PyQuery提取和修改元素数据:

from pyquery import PyQuery as pq

html = '''
<html>
<head><title>Example</title></head>
<body>
    <h1>Hello, World!</h1>
    <ul>
        <li><a href="http://example.com">Example</a></li>
        <li><a href="http://www.baidu.com">Baidu</a></li>
    </ul>
</body>
</html>
'''

doc = pq(html)
title = doc('title')
print(title.text())  # 提取文本内容
print(title.html())  # 提取HTML代码
print(title.attr('lang'))  # 提取属性值

# 修改元素数据
doc('h1').text('New Header')  # 修改文本内容
doc('li:first-child a').attr('href', 'http://new.example.com')  # 修改属性值
print(doc)

这段代码会先选择标题元素,并使用text、html和attr方法提取元素的文本内容、HTML代码和属性值;然后使用text和attr方法修改元素的文本内容和属性值,并打印出修改后的HTML代码。

7.5 与其他库的结合应用

PyQuery可以与其他Python库进行结合应用,以实现更强大的功能。例如,可以将PyQuery用于网络爬虫中,从网页中提取相关信息。以下是一个示例,演示如何使用PyQuery和Requests库进行网页抓取和解析:

import requests
from pyquery import PyQuery as pq

url = 'http://www.example.com'
resp = requests.get(url)
doc = pq(resp.text)

links = doc('a')
for link in links:
    print(pq(link).attr('href'))

这段代码会使用Requests库获取网页内容,然后使用PyQuery库解析网页内容,并提取其中所有链接的地址。最后打印出所有链接的地址。

8. Feedparser

8.1 RSS与Atom简介

RSS和Atom是两种常见的Web订阅格式,用于发布和订阅更新内容。它们都基于XML语法,支持多种类型的内容,例如新闻、博客、音频、视频等。RSS是由Netscape公司开发的一种订阅格式,已经成为Web2.0时代的标志之一。Atom是一种替代RSS的新型订阅格式,由IETF标准化组织开发和维护。

8.2 Feedparser基本用法

Feedparser是一个Python库,用于解析RSS和Atom订阅格式。它可以从URL或文件中读取订阅内容,并将其转换为Python对象。以下是一个示例,演示如何使用Feedparser解析RSS订阅内容:

import feedparser

url = 'http://www.example.com/rss.xml'
feed = feedparser.parse(url)

print(feed.feed.title)  # 输出订阅标题
for entry in feed.entries:
    print(entry.title)  # 输出条目标题
    print(entry.link)  # 输出条目链接

这段代码会使用Feedparser库解析指定URL的RSS订阅内容,并提取出其中的标题和条目标题和链接。最后打印出这些信息。

8.3 解析Feed内容与元数据

在解析订阅内容时,不仅可以提取标题和链接等信息,还可以提取内容和元数据等更详细的信息。Feedparser提供了多种方法来访问这些信息,例如entries属性、feed属性、categories属性等。以下是一个示例,演示如何使用Feedparser提取更详细的订阅内容和元数据:

import feedparser

url = 'http://www.example.com/rss.xml'
feed = feedparser.parse(url)

print(feed.feed.title)  # 输出订阅标题
print(feed.feed.subtitle)  # 输出订阅副标题
print(feed.feed.updated)  # 输出订阅更新时间

for entry in feed.entries:
    print(entry.title)  # 输出条目标题
    print(entry.link)  # 输出条目链接
    print(entry.description)  # 输出条目描述
    print(entry.published)  # 输出条目发布时间
    print(entry.author)  # 输出条目作者
    print(entry.categories)  # 输出条目分类

这段代码会使用Feedparser库解析指定URL的RSS订阅内容,并提取出其中的订阅标题、订阅副标题、订阅更新时间以及条目的标题、链接、描述、发布时间、作者和分类等信息。最后打印出这些信息。

8.4 定制化Feed解析器

在使用Feedparser解析订阅内容时,可以根据实际需要对解析器进行一些定制化的配置。例如,可以设置代理、限制下载速度、添加自定义标签等。以下是一个示例,演示如何定制化Feedparser解析器:

import feedparser

url = 'http://www.example.com/rss.xml'
etag = '9c6a5d2f1d25bfae7c5b994857c68f82'

# 设置代理和缓存
feedparser.USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
feedparser.PREFERRED_XML_PARSERS = ['drv_libxml2', 'drv_xmlraw']
feedparser.ALLOWED_HTML_TAGS = []

# 设置缓存
feedparser.etag_cache.add(url, etag)

# 解析订阅内容
feed = feedparser.parse(url, etag=etag)
print(feed.feed.title)

这段代码会先设置代理和缓存,然后使用parse方法解析指定URL的RSS订阅内容,并提取出其中的订阅标题。在解析器中,可以设置USER_AGENT属性来伪装成浏览器访问网站,可以设置PREFERRED_XML_PARSERS属性来选择XML解析器,可以设置ALLOWED_HTML_TAGS属性来过滤HTML标记。在解析URL时,还可以设置etag参数来启用缓存,加快解析速度。

8.5 应用场景与案例

Feedparser可以应用于多种场景,例如新闻聚合、博客订阅、信息监控、舆情分析等。以下是一个示例,演示如何使用Feedparser实现新闻聚合功能:

import feedparser

feeds = [
    {'title': 'CNN', 'url': 'http://rss.cnn.com/rss/cnn_topstories.rss'},
    {'title': 'BBC', 'url': 'http://feeds.bbci.co.uk/news/rss.xml'},
    {'title': 'Reuters', 'url': 'http://feeds.reuters.com/reuters/topNews'}
]

for feed in feeds:
    print(feed['title'])
    content = feedparser.parse(feed['url'])
    for entry in content.entries:
        print('  -', entry.title)

这段代码会先定义了三个不同来源的RSS订阅,然后使用循环遍历每个订阅,解析其中的新闻内容,并输出相关信息。通过这种方式,可以将不同来源的新闻聚合在一起,方便用户查看和阅读。
另一个应用场景是博客订阅。以下是一个示例,演示如何使用Feedparser实现博客订阅功能:

import feedparser

url = 'http://www.example.com/feed.xml'
feed = feedparser.parse(url)

for entry in feed.entries:
    print(entry.title)
    print(entry.link)
    print(entry.published)
    print(entry.author)
    print(entry.description)

这段代码会先解析指定URL的Atom/RSS订阅,然后使用循环遍历每个条目,输出相关信息。通过这种方式,可以及时获取并查看自己关注的博客更新。

除了新闻聚合和博客订阅,Feedparser还可以应用于信息监控和舆情分析等领域。例如,可以定期抓取某些网站的RSS订阅,然后对其中的关键词进行分析和统计,以了解当前的热点话题和事件趋势。这种方法在商业和政治等领域具有广泛的应用价值。

9. Tesserocr

9.1 OCR技术概述

OCR(Optical Character Recognition)即光学字符识别,是一种将印刷体字符、手写文字和符号等图形图像转换为可编辑和可搜索的文本格式的技术。OCR技术可以应用于多种场景,例如文档扫描、数字化档案、车牌识别、身份证识别、表格识别等。

9.2 Tesserocr的安装与配置

Tesserocr是一个Python库,是基于Tesseract-OCR引擎开发的。在使用Tesserocr之前,需要先安装并配置Tesseract-OCR引擎。以下是一个示例,演示如何在Ubuntu系统中安装和配置Tesseract-OCR:

# 安装Tesseract-OCR和语言包
sudo apt-get install tesseract-ocr tesseract-ocr-eng tesseract-ocr-chi-sim

# 配置环境变量
export TESSDATA_PREFIX=/usr/share/tesseract-ocr/4.00/tessdata/

这段代码会先使用apt-get命令安装Tesseract-OCR及相关语言包,然后设置TESSDATA_PREFIX环境变量为语言包所在目录。在Windows系统中,可以从官网下载Tesseract-OCR并安装,并将其安装目录添加到系统环境变量中。

安装好Tesseract-OCR之后,就可以开始安装和使用Tesserocr库了。以下是一个示例,演示如何安装和使用Tesserocr:

pip install tesserocr
import tesserocr
from PIL import Image

image = Image.open('example.png')
text = tesserocr.image_to_text(image)
print(text)

这段代码会先使用PIL库打开一个图片文件,然后使用Tesserocr库将图片中的文字提取出来,并输出识别结果。通过这种方式,可以快捷地对图片中的文字进行识别和提取。

9.3 图片文本识别与提取

在使用Tesserocr进行图片文本识别时,需要注意以下几个方面:

  1. 图片预处理:在识别之前需要对图片进行处理,例如灰度化、二值化、降噪等,以便更好地分离文字和背景。
  2. 字符集选择:根据实际应用场景选择适合的字符集,例如中文、英文、数字、符号等。
  3. 识别结果评估:对识别结果进行评估和调整,以提高准确率和召回率。
  4. 引擎参数调优:根据实际情况调整引擎参数,以获得更好的识别效果。

以下是一个示例,演示如何使用Tesserocr进行图片文本识别和提取:

import tesserocr
from PIL import Image

image = Image.open('example.png').convert('L')
threshold = 150
table = []
for i in range(256):
    if i < threshold:
        table.append(0)
    else:
        table.append(1)
image = image.point(table, '1')
text = tesserocr.image_to_text(image, lang='eng')
print(text)

这段代码会先使用PIL库打开一个图片文件,并对其进行灰度化和二值化处理,以提高识别效果。然后使用Tesserocr库将图片中的文字识别出来,并输出识别结果。通过这种方式,可以快速地对图片中的文字进行提取和分析。

9.4 OCR结果后处理

在使用Tesserocr进行OCR识别后,可能会出现一些错误和异常情况,例如字符识别错误、识别结果不完整等。为了提高OCR结果的准确率和可读性,需要进行一些后处理操作,例如字符校验、去重、纠错、格式规范化等。以下是一些常见的OCR结果后处理操作:

  1. 字符校验:对识别结果中的字符进行校验,以排除非法字符和错误字符。
  2. 去重:对识别结果中的重复字符进行合并或删除,以提高可读性和准确度。
  3. 纠错:对识别结果中的错误字符进行纠正或替换,以修正OCR识别错误。
  4. 格式规范化:将识别结果按照特定的格式进行排版和分段,以便后续处理和使用。

以下是一个示例,演示如何使用Python实现OCR结果后处理:

import re

text = 'H-e-l-l-o, W-o-r-l-d!'

# 字符校验
pattern = r'[a-zA-Z0-9\s\-\.\,]+'
text = ''.join(re.findall(pattern, text))

# 去重
text = ''.join(list(set(text)))

# 纠错
mapping = {'-': '', '.': '', ',': ''}
text = ''.join([mapping.get(c, c) for c in text])

# 格式规范化
text = text.lower().replace(' ', '')

print(text)

这段代码会先对一个包含数字、字母、空格、连字符、句点和逗号的字符串进行处理,在处理过程中对字符进行校验、去重、纠错和格式规范化。最后输出处理后的文本结果。通过这种方式,可以提高OCR识别结果的准确率和可读性,为后续的数据分析和处理打下坚实的基础。

9.5 实际应用案例

OCR技术可以应用于多个领域和行业,例如金融、医疗、物流、教育等。以下是一些常见的应用场景:

  1. 文档扫描:将纸质文档扫描成电子文档,并进行OCR识别和整理,以便电子存档和检索。
  2. 数字化档案:将历史档案和文物数字化,并进行OCR识别和分类,以便保育和利用。
  3. 车牌识别:对车辆的车牌进行OCR识别和比对,以实现智能交通和安全监控。
  4. 身份证识别:对身份证信息进行OCR识别和核验,以实现身份认证和人员管理。
  5. 表格识别:对表格中的信息进行OCR识别和提取,以实现自动化数据录入和统计分析。

在实际应用中,需要根据具体需求和场景选择合适的OCR技术和工具,并结合其他技术和方法一起使用,以实现更好的效果和价值。同时需要注意安全和隐私问题,保护用户和企业的信息安全和权益。

除了基本的OCR识别功能,Tesserocr还提供了一些高级功能和参数,例如OCR语言模型、字符集训练、图像分割等。通过这些工具和方法,可以进一步提高OCR识别的准确率和效率。

以下是一个示例,演示如何使用Tesserocr进行OCR语言模型训练:

# 下载样本文件
wget https://github.com/tesseract-ocr/langdata_lstm/raw/master/radical-stroke.txt

# 生成训练文件
combine_tessdata -e tessdata/eng.traineddata radical-stroke

# 训练新的OCR语言模型
lstmtraining --model_output output --traineddata tessdata/eng.traineddata --continue_from eng.lstm --append_timesteps 1 --net_spec "[1,32,dropout=0.2]BLSTM(64)[128,1]" --train_listfile train/eng.training_files.txt --max_iterations 10000

这段代码会先下载一个OCR训练样本文件,并使用combine_tessdata命令将其转换为Tesseract-OCR的训练文件格式。然后使用lstmtraining命令对样本文件进行训练,生成一个新的OCR语言模型文件。通过这种方式,可以根据特定的需求和语言环境,自定义OCR识别模型,以获得更好的识别效果和适应性。

在实际应用中,需要根据具体需求和场景选择合适的OCR技术和工具,并结合其他技术和方法一起使用,以实现更好的效果和价值。同时需要注意安全和隐私问题,保护用户和企业的信息安全和权益。

10. Newspaper

pip install newspaper3k
10.1 新闻文章提取与分析

Newspaper是一个Python库,用于从新闻网站上提取和抽取文章内容和元数据。它支持多种语言和新闻源,并可以自动识别和解析文章结构,提取标题、作者、时间、正文、图片、视频等信息。在使用Newspaper进行新闻文章提取与分析时,需要注意以下几个方面:

  1. 新闻源选择:根据实际需求和场景选择合适的新闻源,例如国内外新闻、科技新闻、财经新闻等。
  2. 文章筛选:对获取到的文章进行筛选和过滤,以排除无效或垃圾文章。
  3. 文章解析:对获取到的文章进行解析和处理,以提取关键信息和元数据。
  4. 数据存储:将提取的文章内容和元数据进行存储和整理,以便后续的数据分析和使用。

以下是一个示例,演示如何使用Newspaper进行新闻文章提取和分析:

import newspaper

# 创建新闻源对象
url = 'https://www.bbc.com'
source = newspaper.build(url, memoize_articles=False)

# 遍历获取文章
for   article in source.articles:
    article.download()
    article.parse()

    # 过滤无效文章
    if not article.text or len(article.text) < 100:
        continue

    # 提取元数据
    title = article.title
    author = article.authors
    time = article.publish_date
    text = article.text

    # 存储数据
    save_to_database(title, author, time, text)

这段代码会先创建一个BBC新闻源对象,并遍历获取其中的文章。对于每篇文章,首先进行下载和解析,然后对其进行过滤和提取,最后将提取到的元数据存储到数据库中。通过这种方式,可以快速地获取和整理大量的新闻文章,为后续的数据分析和应用做好准备。

10.2 文章结构解析与抽取

Newspaper库内置了一些算法和方法,用于自动识别和解析文章结构,提取标题、作者、时间、正文、图片、视频等信息。在使用Newspaper进行文章结构解析和抽取时,需要注意以下几个方面:

  1. 解析算法选择:根据实际需求和场景选择合适的解析算法,例如基于HTML标签的解析、机器学习模型的解析等。
  2. 元素定位:对于不同类型的元素(例如标题、作者、时间、正文、图片、视频等),需要针对其特征进行定位和抽取。
  3. 数据清洗:对于抽取到的元数据,可能存在格式不规范、重复、缺失等问题,需要进行清洗和整理,以保证数据的准确性和可读性。

以下是一个示例,演示如何使用Newspaper进行文章结构解析和抽取:

import newspaper

# 创建新闻源对象
url = 'https://www.bbc.com/news/world-europe-58486391'
source = newspaper.build(url, memoize_articles=False)

# 获取文章
article = source.articles[0]  
article.download()
article.parse()

# 抽取元数据
title = article.title
author = article.authors
time = article.publish_date
text = article.text
image_url = article.top_image

# 输出结果
print('Title:', title)
print('Author:', author)
print('Time:', time)
print('Text:', text)
print('Image URL:', image_url)

这段代码会先创建一个BBC新闻源对象,并获取其中的一篇文章。然后对文章进行下载和解析,抽取其中的标题、作者、时间、正文和图片URL等元数据,并输出结果。通过这种方式,可以快速地从文章中提取所需信息,并进行后续的数据处理和分析。

10.3 自然语言处理与关键字提取

Newspaper库还支持一些自然语言处理算法和方法,例如文本分词、词性标注、命名实体识别等。通过这些工具和方法,可以进一步分析和理解文章内容,提取其中的关键信息和特征。在使用Newspaper进行自然语言处理和关键字提取时,需要注意以下几个方面:

  1. 处理算法选择:根据实际需求和场景选择合适的自然语言处理算法,例如分词器、词向量模型、命名实体识别器等。
  2. 数据预处理:对于要处理的文本数据,可能存在缺失、格式不规范、噪声等问题,需要进行预处理和清洗,以保证处理效果和准确性。
  3. 结果解释:对于处理结果(例如关键词、主题、情感极性等),需要进行解释和分析,以获得更深入的理解和价值。

以下是一个示例,演示如何使用Newspaper进行自然语言处理和关键字提取:

import newspaper
import nltk

# 创建新闻源对象
url = 'https://www.bbc.com/news/world-europe-58486391'
source = newspaper.build(url, memoize_articles=False)

# 获取文章
article = source.articles[0]
article.download()
article.parse()

# 分词和词性标注
text = article.text
tokens = nltk.word_tokenize(text)
tags = nltk.pos_tag(tokens)

# 命名实体识别
entities = nltk.chunk.ne_chunk(tags)

# 提取关键词
keywords = []
for word, pos in tags:
    if pos.startswith('N') or pos.startswith('V'):
        if len(word) > 2 and len(word) < 20:
            keywords.append(word)

# 输出结果
print('Keywords:', keywords)
print('Entities:', entities)

这段代码会先创建一个BBC新闻源对象,并获取其中的一篇文章。然后对文章进行下载和解析,使用NLTK库对其进行分词和词性标注,以及命名实体识别。最后从处理结果中提取关键词,并输出结果。通过这种方式,可以对文章进行深入分析和理解,以获得更多的信息和价值。

10.4 文章摘要生成

Newspaper库提供了一些算法和方法,用于从文章中自动生成摘要。通过这些工具和方法,可以快速地获取文章的主旨和要点,并作为参考或概述使用。在使用Newspaper进行文章摘要生成时,需要注意以下几个方面:

  1. 摘要算法选择:根据实际需求和场景选择合适的摘要算法,例如基于统计的算法、基于学习的算法等。
  2. 摘要长度设置:根据实际需求和场景设置合适的摘要长度,以兼顾信息丰富度和可读性。
  3. 摘要优化:对于生成的摘要,可能存在重复、无效、不连贯等问题,需要进行优化和调整,以提高其质量和可用性。

以下是一个示例,演示如何使用Newspaper进行文章摘要生成:

import newspaper

# 创建新闻源对象
url = 'https://www.bbc.com/news/world-europe-58486391'
source = newspaper.build(url, memoize_articles=False)

# 获取文章
article = source.articles[0]
article.download()
article.parse()

# 生成摘要
summary = article.summary

# 输出结果
print('Summary:', summary)

这段代码会先创建一个BBC新闻源对象,并获取其中的一篇文章。然后对文章进行下载和解析,使用Newspaper库内置的摘要生成算法自动生成文章摘要,并输出结果。通过这种方式,可以快速地获取文章的主旨和要点,为后续的阅读和分析提供便利和参考。

10.5 实际应用场景和扩展

Newspaper库可以应用于各种实际场景和应用中,例如:

  1. 新闻网站爬虫:使用Newspaper库获取新闻网站上的文章内容和元数据。
  2. 内容聚合平台:使用Newspaper库对多个来源的文章进行处理和整理,以提供更全面和精准的信息服务。
  3. 舆情监测系统:使用Newspaper库对多个来源的文章进行自然语言处理和情感分析,以了解公众舆论动向和态度。
  4. 数据挖掘和分析:使用Newspaper库获取大量的文章数据,并进行统计和可视化分析,以发现潜在的信息和规律。

除了Newspaper库本身提供的功能和方法,还可以结合其他技术和工具进行扩展和优化,例如:

  1. 网络爬虫:使用Scrapy、BeautifulSoup等库进行网页抓取和解析,以获取更丰富和深入的文章数据。
  2. 自然语言处理:使用NLTK、Spacy、gensim等库进行文本分析和处理,以提高文章结构解析和关键字提取的准确性和效率。
  3. 机器学习和深度学习:使用TensorFlow、PyTorch等库进行模型训练和优化,以实现更好的文章分类、命名实体识别、情感分析等功能。

通过不断学习和实践,可以进一步发掘Newspaper库和相关技术的潜力和价值,为我们的生活和工作带来更多的便利和创新。

10.6 sina
import time      

import newspaper

# 创建新闻源对象
url = 'https://news.sina.com.cn/'
source = newspaper.build(url, memoize_articles=False)

# 获取某一栏目下所有文章的URL列表
category_url = 'http://news.sina.com.cn/china/'
category_source = source.category_urls()[0] + category_url 
category = newspaper.build(category_source, memoize_articles=False) 
urls = category.article_urls()

# 遍历URL列表,对每个文章进行处理和输出
for  url in urls:
    article = newspaper.Article(url, language='zh') 
    article.download() 
    article.parse() 

    print('Title:', article.title) 
    print('Authors:', article.authors) 
    print('Text:' , article.text) 
    time.sleep(100)

总结

Python拥有强大的库和工具来支持网络爬虫和数据提取,十个库Scrapy、Beautiful Soup、Selenium、Requests、LXML、Pandas、PyQuery、Feedparser、Tesserocr和Newspaper已经成为这一领域的主流选择。每个库都有其优劣和适用场景,我们需要根据实际需求和场景来选择和使用。这些库的学习和应用,对于我们更好地理解网络爬虫和数据提取的基本原理和技术具有重要的意义。

文章来源:https://blog.csdn.net/qq_42531954/article/details/135361932
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。