Python 网络爬虫入门:Spider man的第三课
- 写在最前面
- 从requests到scrapy
- 利用scrapy爬取目标网站
- 更多内容
- 结语
写在最前面
有位粉丝希望学习网络爬虫的实战技巧,想尝试搭建自己的爬虫环境,从网上抓取数据。
前面有写一篇博客分享,但是内容感觉太浅显了
【一个超简单的爬虫demo】探索新浪网:使用 Python 爬虫获取动态网页数据
本期邀请了擅长爬虫的朋友@PoloWitty,来撰写这篇博客。通过他的专业视角和实战经验,一步步引导我们入门,成为一名数据探索的“Spider Man”。
【Python网络爬虫入门教程1】成为“Spider Man”的第一课:HTML、Request库、Beautiful Soup库
【Python网络爬虫入门教程2】成为“Spider Man”的第二课:观察目标网站、代码编写
【Python网络爬虫入门教程3】成为“Spider Man”的第三课:从requests到scrapy、爬取目标网站
随着互联网数据的指数级增长,了解如何有效地提取这些信息变得越来越重要。无论是文本模型如ChatGPT,还是视觉模型如Stable Diffusion,它们的训练数据大多来源于互联网的海量数据。在这个日新月异的大数据时代,爬虫也算是其中不得不点的一项基础技能树了。
本系列文章将深入浅出地介绍Python网络爬虫的基础知识和技术,从 Requests 库到 Scrapy 框架的 入门级
使用,为你开启python网络爬虫的大门,成为spider man的一员,并最终以ScrapeMe网站作为目标示例,爬取下网站上的可爱又有趣的宝可梦照片。
在开始之前,还要啰嗦几句叠个甲,网络爬虫虽然强大,但在使用时必须遵守法律法规和网站的爬虫协议。不违法爬取数据,遵守相关法律法规哦~
这是本系列的第三篇文章,将会以ScrapeMe网站作为示例,展示如何利用scrapy库更好的来对网站上的宝可梦图片进行爬取。
文章目录
- 写在最前面
- 从requests到scrapy
- 利用scrapy爬取目标网站
- 更多内容
- 结语
从requests到scrapy
当谈到网络爬虫时,起初我们可能会选择简单的方案,比如使用requests
和Beautiful Soup
这样的工具,就像手工艺者用胶水和剪刀来完成手工艺品。但是,当我们的爬虫任务变得更为复杂、庞大时,我们就需要更高效、更强大的工具。
这时候,Scrapy
登场了!它就像是一台全能机器人助手,能够应对各种爬虫任务。通过Scrapy
,我们可以创建整个爬虫项目,定义抓取规则和流程。它能够并行抓取多个页面,就像是多线程的大明星!更棒的是,它内置了各种功能,比如自动的请求调度、页面解析以及数据存储。简直就像是一套量身定制的工具箱,让我们更轻松地面对爬虫世界的挑战。
具体到我们在第二课中实现的简单爬虫程序,运行过程序的小伙伴可能会发现,爬取的速度并不是很快,而如果要自己实现并行,不仅需要了解并行的相关知识,还要做好并行程序之间的通讯调度等等。而Scrapy框架则可以直接帮我们自动完成这些功能,我们仅需要关注于单个线程代码的实现即可,是不是很方便呢
利用scrapy爬取目标网站
首先,我们需要利用pip install Scrapy
命令下载Scrapy包。
为了创建一个完整的scrapy项目,我们可以使用其提供的命令行工具进行创建,在命令行中输入scrapy startproject spider
,我们可以新建一个名为spider的全新scrapy项目,在这个项目目录下,包含以下一些文件:
.
├── scrapy.cfg
└── spider
├── __init__.py
├── items.py
├── middlewares.py
├── pipelines.py
├── settings.py # 项目配置文件
└── spiders # 用于放置你的爬虫程序的目录
└── __init__.py
除了上述给出注释的文件,其他文件里的内容可以暂时不进行理会,感兴趣的同学可以在网上查找相关内容进行学习。
然后我们进入spider/spiders
目录下,在命令行中输入scrapy genspider pokemon scrapeme.live/shop/
,创建一个名为pockmon的爬虫(一个爬虫项目下可以又多个爬虫),用于爬取scrapme.live/shop/
网页。
此时,在spider/spiders
目录下,我们便可以发现我们的爬虫程序pokemon.py
,它当前的内容为自动填充的结果:
import scrapy
class PokemonSpider(scrapy.Spider):
name = "pokemon"
allowed_domains = ["scrapeme.live"]
start_urls = ["http://scrapeme.live/"]
def parse(self, response):
pass
接下来我们需要向其中填入新的内容,并可以使用scrapy crawl pokemon -O image_urls.csv
命令运行该爬虫,得到我们想要的结果:
import scrapy
import requests
def download_from_url(url:str):
'''
利用requests库,从相应的图片链接中下载对应的图片
结果会保存到results文件夹中
'''
filename = url.split('/')[-1]
with open(f'../results/{filename}','wb') as fp:
fig_response = requests.get(url)
fp.write(fig_response.content)
class PokemonSpider(scrapy.Spider):
name = "pokemon"
allowed_domains = ["scrapeme.live"]
start_urls = [f"https://scrapeme.live/shop/page/{pageNum}/?orderby=popularity" for pageNum in range(1,49)] # 所有的page链接
def parse(self, response):
image_urls = response.css('img') # 找到所有的img对应的位置
for image_url in image_urls:
url = image_url.attrib['src']
download_from_url(url)
yield {'image_url':url}
其中PokemonSpider
继承了scrapy.Spider
类,会使用name
属性命名该爬虫,并将请求限制在allowed_domains
内,以start_urls
开始进行爬取。在parse()
函数中,会得到一个response
对象,这个对象其实就很类似于之前使用Beautiful Soup解析后的DOM树,我们可以直接使用repoonse.css()
方法获取到网页中以相应css标签进行标记的内容,最后的yield
会将每次parse
的图像链接保存至image_urls.csv
输出文件中。而相应的下载的图片依旧是在results
文件夹下。
而想要使用scrapy让爬虫爬取速度更快,加大并发量,只需要在setting.py
中新加入一行CONCURRENT_REQUESTS = 256
即可hhh,是不是so easy呢
更多内容
Scrapy本身还有非常非常多的可拓展空间,当前成熟的爬虫程序中有很多便是使用scrapy进行编写的。而本课程作为入门课程,基本也就要到此为止了,如果还想学习更多关于scrapy的相关知识,可以阅读Scrapy Tutorial或者是网上的其他进阶课程。
结语
我们已经一起初步探索了网络爬虫的精彩世界,我们从HTML背景知识的介绍开始,深入理解了requests
和Beautiful Soup
这两个强大的工具。然后,我们在第二篇中利用这些知识和工具,成功爬取了一个网站上所有宝可梦的图片,获得了丰富的数据。
而第三篇则让我们迈入了更高级的领域,学习了如何使用Scrapy
库来处理更大规模的爬虫任务。Scrapy
让我们更高效、更自动化地抓取了目标网站的宝可梦图片,为我们的爬虫之旅增添了更多神奇的色彩,并为之后更复杂的任务打下坚实的基础。
通过这三篇课程,我们不仅仅学到了技术知识,更领略到了爬虫世界的广阔无垠。爬虫不仅是获取数据的手段,更是对互联网深度探索的一种方式。希望这些课程能为你的学习之路增添一些乐趣,并为你今后在数据获取和应用的旅程中提供帮助。愿你在这片广阔的数据海洋中畅游自如,发现更多精彩!
了爬虫世界的广阔无垠。爬虫不仅是获取数据的手段,更是对互联网深度探索的一种方式。希望这些课程能为你的学习之路增添一些乐趣,并为你今后在数据获取和应用的旅程中提供帮助。愿你在这片广阔的数据海洋中畅游自如,发现更多精彩!