Python爬虫开发:BeautifulSoup、Scrapy入门

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 在现代网络开发中,网络爬虫是一个非常重要的工具。它可以自动化地从网页中提取数据,并且可以用于各种用途,如数据收集、信息聚合和内容监控等。在Python中,有多个库可以用于爬虫开发,其中BeautifulSoup和Scrapy是两个非常流行的选择。本篇文章将详细介绍这两个库,并提供一个综合详细的例子,展示如何使用它们来进行网页数据爬取。

1723471899553.jpg

在现代网络开发中,网络爬虫是一个非常重要的工具。它可以自动化地从网页中提取数据,并且可以用于各种用途,如数据收集、信息聚合和内容监控等。在Python中,有多个库可以用于爬虫开发,其中BeautifulSoup和Scrapy是两个非常流行的选择。本篇文章将详细介绍这两个库,并提供一个综合详细的例子,展示如何使用它们来进行网页数据爬取。

一、BeautifulSoup入门

1. BeautifulSoup简介

BeautifulSoup是一个Python库,用于从HTML或XML文档中提取数据。它能够通过标签和属性来定位和提取数据,非常适合进行小规模的网页抓取任务。

2. 安装BeautifulSoup

在使用BeautifulSoup之前,需要安装它和一个HTML解析器,如lxml或html5lib。可以使用以下命令进行安装:

pip install beautifulsoup4 lxml

3. BeautifulSoup基础用法

以下是BeautifulSoup的基本用法,包括如何解析HTML文档,查找标签和属性,以及提取数据。

from bs4 import BeautifulSoup
html_doc = """
<html>
<head><title>示例页面</title></head>
<body>
<p class="title"><b>示例段落</b></p>
<p class="content">这是一个示例页面。</p>
<a href="http://example.com/one" class="link">第一个链接</a>
<a href="http://example.com/two" class="link">第二个链接</a>
</body>
</html>
"""
soup = BeautifulSoup(html_doc, 'lxml')
# 查找标题标签
title = soup.title
print(title.string)
# 查找所有段落标签
paragraphs = soup.find_all('p')
for p in paragraphs:
    print(p.text)
# 查找所有链接标签
links = soup.find_all('a')
for link in links:
    print(link.get('href'))

二、Scrapy入门

1. Scrapy简介

Scrapy是一个用于爬取网站并提取结构化数据的应用框架。它提供了强大的功能,如处理请求、解析HTML、管理爬取的数据等,适合进行大规模的爬虫开发。

2. 安装Scrapy

可以使用以下命令安装Scrapy:

pip install scrapy

3. Scrapy基础用法

以下是Scrapy的基本用法,包括如何创建项目、定义爬虫和解析数据。

# 创建Scrapy项目
scrapy startproject example_project
cd example_project
# 创建爬虫
scrapy genspider example example.com

在example_project/spiders/example.py中定义爬虫:

import scrapy
class ExampleSpider(scrapy.Spider):
    name = "example"
    allowed_domains = ["example.com"]
    start_urls = [
        'http://example.com/',
    ]
    def parse(self, response):
        for title in response.css('title'):
            yield {'title': title.get()}
        for link in response.css('a::attr(href)').getall():
            yield response.follow(link, self.parse)

运行爬虫:

scrapy crawl example

三、综合示例:爬取博客文章

以下是一个综合示例,展示如何使用BeautifulSoup和Scrapy来爬取博客文章并提取文章标题和链接。

1. 使用BeautifulSoup爬取博客文章

import requests
from bs4 import BeautifulSoup
url = 'https://example-blog.com'
response = requests.get(url)
soup = BeautifulSoup(response.content, 'lxml')
# 提取文章标题和链接
articles = soup.find_all('article')
for article in articles:
    title = article.find('h2').text
    link = article.find('a')['href']
    print(f"标题: {title}, 链接: {link}")

2. 使用Scrapy爬取博客文章

首先,创建Scrapy项目并生成爬虫:

scrapy startproject blog_crawler
cd blog_crawler
scrapy genspider blog_spider example-blog.com

在blog_crawler/spiders/blog_spider.py中定义爬虫:

import scrapy
class BlogSpider(scrapy.Spider):
    name = "blog_spider"
    allowed_domains = ["example-blog.com"]
    start_urls = [
        'https://example-blog.com/',
    ]
    def parse(self, response):
        for article in response.css('article'):
            title = article.css('h2::text').get()
            link = article.css('a::attr(href)').get()
            yield {'title': title, 'link': link}
        next_page = response.css('a.next::attr(href)').get()
        if next_page:
            yield response.follow(next_page, self.parse)

运行爬虫并保存结果到JSON文件:

scrapy crawl blog_spider -o articles.json

四、深入理解BeautifulSoup

1. BeautifulSoup的解析器

BeautifulSoup支持多种解析器,包括Python标准库的html.parser、第三方库lxml和html5lib。不同解析器的性能和功能有所不同,选择适合的解析器可以提升解析效率。

from bs4 import BeautifulSoup
# 使用html.parser解析器
soup = BeautifulSoup(html_doc, 'html.parser')
# 使用lxml解析器
soup = BeautifulSoup(html_doc, 'lxml')
# 使用html5lib解析器
soup = BeautifulSoup(html_doc, 'html5lib')

2. BeautifulSoup的常用功能

  • 查找标签:使用find和find_all方法查找单个或多个标签。
  • CSS选择器:使用select方法通过CSS选择器查找标签。
  • 遍历文档树:使用parent、children、siblings等方法遍历文档树。
# 查找单个标签
title_tag = soup.find('title')
# 查找所有特定标签
links = soup.find_all('a')
# 使用CSS选择器
links = soup.select('a')
# 遍历文档树
parent = title_tag.parent
siblings = title_tag.next_siblings

3. BeautifulSoup的应用实例

以下是一个完整的实例,展示如何使用BeautifulSoup爬取一个新闻网站的标题和链接。

import requests
from bs4 import BeautifulSoup
url = 'https://news.ycombinator.com/'
response = requests.get(url)
soup = BeautifulSoup(response.content, 'lxml')
articles = soup.find_all('a', class_='storylink')
for article in articles:
    title = article.text
    link = article['href']
    print(f"标题: {title}, 链接: {link}")

五、深入理解Scrapy

1. Scrapy的组件

Scrapy有多个重要的组件,每个组件都有特定的功能。

  • Spider:定义爬取逻辑,发送请求并处理响应。
  • Item:定义数据结构,用于存储爬取的数据。
  • Pipeline:处理爬取的数据,如清洗、验证和存储。
  • Middleware:处理请求和响应,如添加请求头和处理错误。

2. Scrapy的配置

Scrapy提供了丰富的配置选项,可以在settings.py中配置。

# 设置用户代理
USER_AGENT = 'my-crawler (http://example.com)'
# 设置并发请求数量
CONCURRENT_REQUESTS = 16
# 设置下载延迟
DOWNLOAD_DELAY = 1
# 启用或禁用中间件
DOWNLOADER_MIDDLEWARES = {
    'myproject.middlewares.CustomMiddleware': 543,
}

3. Scrapy的应用实例

以下是一个完整的Scrapy爬虫实例,展示如何爬取一个新闻网站的标题和链接,并将数据存储到JSON文件中。

首先,创建项目和爬虫:

scrapy startproject news_crawler
cd news_crawler
scrapy genspider news_spider news.ycombinator.com

在news_crawler/items.py中定义Item:

import scrapy
class NewsItem(scrapy.Item):
    title = scrapy.Field()
    link = scrapy.Field()

在news_crawler/spiders/news_spider.py中定义爬虫:

import scrapy
from news_crawler.items import NewsItem
class NewsSpider(scrapy.Spider):
    name = 'news_spider'
    allowed_domains = ['news.ycombinator.com']
    start_urls = ['https://news.ycombinator.com/']
    def parse(self, response):
        articles = response.css('a.storylink')
        for article in articles:
            item = NewsItem()
            item['title'] = article.css('::text').get()
            item['link'] = article.css('::attr(href)').get()
            yield item
        next_page = response.css('a.morelink::attr(href)').get()
        if next_page:
            yield response.follow(next_page, self.parse)

在news_crawler/pipelines.py中定义Pipeline:

import json
class NewsCrawlerPipeline:
    def open_spider(self, spider):
        self.file = open('items.json', 'w')
    def close_spider(self, spider):
        self.file.close()
    def process_item(self, item, spider):
        line = json.dumps(dict(item)) + "\n"
        self.file.write(line)
        return item

在news_crawler/settings.py中启用Pipeline:

ITEM_PIPELINES = {
    'news_crawler.pipelines.NewsCrawlerPipeline': 300,
}

运行爬虫并保存结果到JSON文件:

scrapy crawl news_spider

六、总结

通过本文,我们详细介绍了Python中的两个流行的爬虫开发库:BeautifulSoup和Scrapy。我们不仅介绍了它们的基本用法,还深入探讨了它们的高级功能和应用场景。通过综合实例,我们展示了如何使用这两个库来爬取新闻网站的标题和链接,并将数据存储到文件中。


希望本文对你理解和使用BeautifulSoup和Scrapy有所帮助,无论是进行小规模的网页抓取任务,还是开发大规模的爬虫项目。未来可以根据具体需求选择合适的工具,提高开发效率和数据处理能力。


作者:Rjdeng

链接:https://juejin.cn/post/7400255677804232716

相关文章
|
6天前
|
数据采集 JavaScript 前端开发
构建你的首个Python网络爬虫
【9月更文挑战第8天】本文将引导你从零开始,一步步构建属于自己的Python网络爬虫。我们将通过实际的代码示例和详细的步骤解释,让你理解网络爬虫的工作原理,并学会如何使用Python编写简单的网络爬虫。无论你是编程新手还是有一定基础的开发者,这篇文章都将为你打开网络数据获取的新世界。
|
6天前
|
数据采集 机器学习/深度学习 搜索推荐
Python爬虫技术基础与应用场景详解
本文介绍了爬虫技术的基本概念、原理及应用场景,包括数据收集、价格监测、竞品分析和搜索引擎优化等。通过一个实战案例展示了如何使用Python爬取电商网站的商品信息。强调了在使用爬虫技术时需遵守法律法规和道德规范,确保数据抓取的合法性和合规性。
|
9天前
|
数据采集 JavaScript 前端开发
打造你的Python爬虫:从基础到进阶
【9月更文挑战第5天】在数字信息泛滥的时代,掌握一项技能能让我们更好地筛选和利用这些资源。本文将带你了解如何用Python构建一个基本的网页爬虫,进而拓展到更复杂的数据抓取任务。无论你是编程新手还是有一定经验的开发者,跟随这篇文章的步伐,你将能够实现自动化获取网络数据的目标。准备好了吗?让我们一起潜入代码的世界,解锁新的可能!
|
11天前
|
数据采集 Java 数据挖掘
Java IO异常处理:在Web爬虫开发中的实践
Java IO异常处理:在Web爬虫开发中的实践
|
13天前
|
数据采集 存储 前端开发
Java爬虫开发:Jsoup库在图片URL提取中的实战应用
Java爬虫开发:Jsoup库在图片URL提取中的实战应用
WK
|
13天前
|
数据采集 XML 安全
常用的Python网络爬虫库有哪些?
Python网络爬虫库种类丰富,各具特色。`requests` 和 `urllib` 简化了 HTTP 请求,`urllib3` 提供了线程安全的连接池,`httplib2` 则具备全面的客户端接口。异步库 `aiohttp` 可大幅提升数据抓取效率。
WK
33 1
|
14天前
|
数据采集 JavaScript 前端开发
构建简易Python爬虫:抓取网页数据入门指南
【8月更文挑战第31天】在数字信息的时代,数据抓取成为获取网络资源的重要手段。本文将引导你通过Python编写一个简单的网页爬虫,从零基础到实现数据抓取的全过程。我们将一起探索如何利用Python的requests库进行网络请求,使用BeautifulSoup库解析HTML文档,并最终提取出有价值的数据。无论你是编程新手还是有一定基础的开发者,这篇文章都将为你打开数据抓取的大门。
|
14天前
|
数据采集 存储 JavaScript
Python 爬虫实战:从入门到精通
【8月更文挑战第31天】 本文将带你走进 Python 爬虫的世界,从基础的请求和解析开始,逐步深入到反爬策略的应对和数据存储。我们将通过实际案例,一步步构建一个功能完整的爬虫项目。无论你是编程新手还是有一定经验的开发者,都能在这篇文章中找到适合自己的学习路径。让我们一起探索数据的海洋,揭开网络信息的神秘面纱。
|
15天前
|
数据采集 存储 JavaScript
Python 爬虫实战:从入门到精通
【8月更文挑战第31天】 本文将带你走进 Python 爬虫的世界,从基础的请求和解析开始,逐步深入到反爬策略的应对和数据存储。我们将通过实际案例,一步步构建一个功能完整的爬虫项目。无论你是编程新手还是有一定经验的开发者,都能在这篇文章中找到适合自己的学习路径。让我们一起探索数据的海洋,揭开网络信息的神秘面纱。
|
15天前
|
数据采集 存储 数据库
Python中实现简单爬虫与数据解析
【8月更文挑战第31天】在数字化时代的浪潮中,数据成为了新的石油。本文将带领读者通过Python编程语言,从零开始构建一个简单的网络爬虫,并展示如何对爬取的数据进行解析和处理。我们将一起探索请求网站、解析HTML以及存储数据的基础知识,让每个人都能成为自己数据故事的讲述者。