Python爬虫开发:BeautifulSoup、Scrapy入门

news2024/11/16 3:40:41

在现代网络开发中,网络爬虫是一个非常重要的工具。它可以自动化地从网页中提取数据,并且可以用于各种用途,如数据收集、信息聚合和内容监控等。在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、第三方库lxmlhtml5lib。不同解析器的性能和功能有所不同,选择适合的解析器可以提升解析效率。

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的常用功能
  • 查找标签:使用findfind_all方法查找单个或多个标签。
  • CSS选择器:使用select方法通过CSS选择器查找标签。
  • 遍历文档树:使用parentchildrensiblings等方法遍历文档树。
# 查找单个标签
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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2033856.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CVE-2024-38077:Windows远程桌面授权服务的‘隐形杀手’——深度剖析与紧急防护策略

文章目录 CVE-2024-38077&#xff1a;Windows远程桌面授权服务的‘隐形杀手’——深度剖析与紧急防护策略1 漏洞描述2 漏洞影响2.1 处置优先级&#xff1a;高2.2 影响版本 3 漏洞检测3.1 漏洞检测工具3.2 漏洞检测工具使用介绍3.2.1 漏洞检测工具当前支持三种方式检测3.2.2 漏洞…

常见的三个事务问题(脏读/幻读/不可重复读)

常见的三个事务问题&#xff08;脏读/幻读/不可重复读&#xff09; 脏读 脏读&#xff08;Dirty Read&#xff09;是指在一个事务中&#xff0c;读取了另一个未提交事务的数据。 具体来说&#xff0c;脏读的过程如下&#xff1a; 1. 事务A开始&#xff0c;对某一行数据进行…

C++学习笔记之数组

C学习笔记之数组 https://www.runoob.com/cplusplus/cpp-arrays.html C当中&#xff0c;数组是用于存储固定大小的相同类型元素的顺序集合 数组是整体作为一个变量&#xff0c;其中又包含多个单独变量&#xff0c;作为其元素&#xff0c;如数组变量a&#xff0c;其包含a[0]~a[…

html+css+js网页制作 淘宝首页1个页面带js

htmlcssjs网页制作 淘宝首页1个页面带js 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&…

【并查集、树的直径】P2195 HXY造公园 题解

题意 P2195 codeforces 455c&#xff0c;两道一样的题 给出一个由 n n n 个点&#xff0c; m m m 条边组成的森林&#xff0c;有 q q q 组询问,每次询问有以下两种情况 输入 o p 1 op 1 op1 时&#xff1a;给出点 x x x&#xff0c;输出点 x x x 所在的树的直径。 输…

千元不到,作为可穿戴AI设备,AI Friend真的能够取代手机吗?

在人工智能的浪潮中&#xff0c;我们见证了无数旨在提高效率和生产力的创新设备。 然而&#xff0c;Friend设备以其独特的设计理念&#xff0c;为AI设备带来了新的定义——一个永远在线的伴侣&#xff0c;一个情感的稳定器。 一、Friend的设计理念 Friend设备的设计初衷并非追…

vscode的C/C++环境配置和调试技巧

目录 1.背景 2.下载编译器 3.配置环境变量 4.安装C/C插件 5.写C语言代码并且编译成功 5.1文件操作 5.2对于两个窗口的解释 5.3C语言编译环境配置 6.创建执行文件 7.编译运行过程 8.写其他的代码的解决方案一 9.写其他的代码的解决方案二 10.同时编译多个.c文件 10…

Qt 中实现异步散列器

【写在前面】 在很多工作中&#xff0c;我们需要计算数据或者文件的散列值&#xff0c;例如登录或下载文件。 而在 Qt 中&#xff0c;负责这项工作的类为 QCryptographicHash。 关于 QCryptographicHash&#xff1a; QCryptographicHash 是 Qt 框架中提供的一个用于生成加密散列…

【系统维护】Dll文件修复工具使用教程,Windows系统必备!

一、dll文件是什么 dll文件是是一种Windows操作系统下的可执行文件格式&#xff0c;包含可由多个程序同时使用的代码和数据的文件&#xff0c;它的主要作用是实现代码和数据的共享&#xff0c;从而节省内存和硬盘空间&#xff0c;并提高程序的性能和可维护性 二、如何解决dll文…

刚刚,模糊测试平台SFuzz受到行业认可

近日&#xff0c;中国网络安全产业联盟&#xff08;CCIA&#xff09;正式发布了“2024年网络安全优秀创新成果大赛-安全严选专题赛”评选结果&#xff0c;开源网安模糊测试平台SFuzz凭借重大创新能力&#xff0c;得到组委会认可&#xff0c;获本次大赛创新产品优胜奖。 2024年网…

【LeetCode面试150】——392判断子序列

博客昵称&#xff1a;沈小农学编程 作者简介&#xff1a;一名在读硕士&#xff0c;定期更新相关算法面试题&#xff0c;欢迎关注小弟&#xff01; PS&#xff1a;哈喽&#xff01;各位CSDN的uu们&#xff0c;我是你的小弟沈小农&#xff0c;希望我的文章能帮助到你。欢迎大家在…

数据结构--第八天

--哈希表 -哈希表的概念 哈希表&#xff1a;用散列法存储的线性表被称为哈希表&#xff0c;使用的函数被称为散列函数或者哈希函数&#xff0c;f(k)被称为散列地址或者哈希地址。。通常情况下&#xff0c;散列表的储存空间是一个一维数组&#xff0c;而哈希地址为数组的下标 -哈…

【C# WPF】Style全局样式和资源字典

1.全局样式&#xff1a; 在Window.Resource中声明一个样式&#xff0c;总体为白色&#xff0c;为了更有区分度&#xff0c;采用BasedOn这一继承方式来在保留字体和边缘设置的基础上&#xff0c;更改颜色。 <Window x:Class"WpfApp1.Window1"xmlns"http://s…

LangChain 推出 LangGraph Studio:首款用于可视化、交互和调试复杂代理应用的代理 IDE

嘿&#xff0c;听说了吗&#xff1f;Langchain最近发布了一项重大更新&#xff0c;他们推出了官方Agent IDE&#xff0c;并且免费开放了LangGraph平台。这对于AI开发者来说是个好消息&#xff0c;意味着我们现在有了更强大的工具来构建智能应用。 今天&#xff0c;我们就来分享…

CI/CD——CI持续集成实验

目录 一. 安装Docker 二. 部署Jenkins 三. 配置邮箱 四. Harbor部署 五. Nexus Repository部署 五. sonarqube安装 六. 配置Docker 七. jenkins系统配置sonarqube 八. 配置pipeline 九. 构建并集成 一. 安装Docker docker-ce镜像_docker-ce下载地址_docker-ce安装教程…

HTTP、HTTPS、SOCKS5 三种协议特点详解

一、引言 在当今数字化的世界中&#xff0c;网络通信协议扮演着至关重要的角色。HTTP、HTTPS 和 SOCKS5 是三种常见的网络协议&#xff0c;它们各自具有独特的特点和应用场景。本文将对这三种协议进行详细的分析和比较&#xff0c;帮助您更好地理解它们在网络通信中的作用。 …

vue2+OpenLayers 天地图上打点并且显示相关的信息(2)

上次是在地图上打点 这次鼠标移动在图标上面显示相关的信息 首先有两个事件 鼠标移入 和 鼠标移出事件 pointermove pointerout 鼠标放上去之前 放上去后 代码如下 <template><div class"container"><div id"vue-openlayers" class&quo…

多模态大语言模型(MMLLM)的现状、发展和潜力

1、大模型 随着ChatGPT流行&#xff0c;大模型技术正逐渐成为AI领域的热点。许多行业大佬纷纷投身于这一赛道&#xff0c;展示了大模型的独特魅力和广阔前景。 王慧文&#xff0c;前美团联合创始人&#xff0c;发起“AI英雄帖”。 李志飞&#xff0c;出门问问创始人&#xff0…

7个Agent组成的公司,7分钟完成了一个游戏的开发

来源丨投资实习所&#xff08;ID&#xff1a;startupboy&#xff09; 作者丨StartupBoy 市场对 AI Agent 的期望一直很高&#xff0c;除了各种单向任务的 Agent 外&#xff0c;之前斯坦福大学和 Google 的一项实验已经展示了由 25 个 AI Agent 自行协同运行的虚拟城镇&#x…

如何使用Zoom API创建一个会议?

一、注册一个免费的Zoom账号&#xff08;zoom.us) 二、在Zoom 应用市场&#xff08;App Marketplace)创建一个server to server 的app&#xff0c;授予创建会议的权限。 三、创建一个Zoom API的服务端程序(node.js) 1、git clone https://github.com/zoom/server-to-server-o…