从原理到实战,一份详实的 Scrapy 爬虫教程
off999 2024-10-14 12:06 33 浏览 0 评论
来源:早起Python
作者:饮马长江
大家好,我是早起。
之前分享了很多 requests 、selenium 的 Python 爬虫文章,本文将从原理到实战带领大家入门另一个强大的框架 Scrapy。如果对Scrapy感兴趣的话,不妨跟随本文动手做一遍!
一、Scrapy框架简介
Scrapy是:由Python语言开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据,只需要实现少量的代码,就能够快速的抓取。
二、运行原理
Scrapy框架的运行原理看下面一张图就够了(事实上原理是比较复杂的,也不是三言两语能够说清楚的,因此感兴趣的读者可以进一步阅读更多的相关文章来了解,本文不做过多讲解)
Scrapy主要包括了以下组件:
- 引擎(Scrapy Engine)
- Item 项目
- 调度器(Scheduler)
- 下载器(Downloader)
- 爬虫(Spiders)
- 项目管道(Pipeline)
- 下载器中间件(Downloader Middlewares)
- 爬虫中间件(Spider Middlewares)
- 调度中间件(Scheduler Middewares)
三. 入门
3.1安装
第一种:在命令行模式下使用pip命令即可安装:
$ pip install scrapy
第二种:首先下载,然后再安装:
$ pip download scrapy -d ./
# 通过指定国内镜像源下载
$pip download -i https://pypi.tuna.tsinghua.edu.cn/simple scrapy -d ./
进入下载目录后执行下面命令安装:
$ pip install Scrapy-1.5.0-py2.py3-none-any.whl
3.2使用
使用大概分为下面四步 1 创建一个scrapy项目
scrapy startproject mySpider
2 生成一个爬虫
scrapy genspider demo "demo.cn"
3 提取数据
完善spider 使用xpath等
4 保存数据
pipeline中保存数据
3.3 程序运行
在命令中运行爬虫
scrapy crawl qb # qb爬虫的名字
在pycharm中运行爬虫
from scrapy import cmdline
cmdline.execute("scrapy crawl qb".split())
四、基本步骤
Scrapy 爬虫框架的具体使用步骤如下:
“选择目标网站定义要抓取的数据(通过Scrapy Items来完成的)编写提取数据的spider执行spider,获取数据数据存储”
五. 目录文件说明
当我们创建了一个scrapy项目后,继续创建了一个spider,目录结构是这样的:
下面来简单介绍一下各个主要文件的作用:
“
scrapy.cfg :项目的配置文件
mySpider/ :项目的Python模块,将会从这里引用代码
mySpider/items.py :项目的目标文件
mySpider/pipelines.py :项目的管道文件
mySpider/settings.py :项目的设置文件
mySpider/spiders/ :存储爬虫代码目录
”
5.1 scrapy.cfg文件
项目配置文件。这个是文件的内容:
# Automatically created by: scrapy startproject
#
# For more information about the [deploy] section see:
# https://scrapyd.readthedocs.io/en/latest/deploy.html
[settings]
default = mySpider.settings
[deploy]
#url = http://localhost:6800/
project = mySpider
5.2 mySpider**/**
项目的Python模块,将会从这里引用代码
5.3 mySpider/items.py
项目的目标文件
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class MyspiderItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
pass
定义scrapy items的模块,示例: name = scrapy.Field()
5.4 mySpider/pipelines.py
项目的管道文件
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
class MyspiderPipeline:
def process_item(self, item, spider):
return item
这个文件也就是我们说的管道,当Item在Spider中被收集之后,它将会被传递到Item Pipeline(管道),这些Item Pipeline组件按定义的顺序处理Item。每个Item Pipeline都是实现了简单方法的Python类,比如决定此Item是丢弃而存储。以下是item pipeline的一些典型应用:
- 验证爬取的数据(检查item包含某些字段,比如说name字段)
- 查重(并丢弃)
- 将爬取结果保存到文件或者数据库中
5.5 mySpider/settings.py
项目的设置文件
# Scrapy settings for mySpider project
...
BOT_NAME = 'mySpider' # scrapy项目名
SPIDER_MODULES = ['mySpider.spiders']
NEWSPIDER_MODULE = 'mySpider.spiders'
.......
# Obey robots.txt rules
ROBOTSTXT_OBEY = False # 是否遵守协议,一般给位false,但是创建完项目是是True,我们把它改为False
# Configure maximum concurrent requests performed by Scrapy (default: 16)
#CONCURRENT_REQUESTS = 32 # 最大并发量 默认16
......
#DOWNLOAD_DELAY = 3 # 下载延迟 3秒
# Override the default request headers: # 请求报头,我们打开
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
}
# 爬虫中间件
#SPIDER_MIDDLEWARES = {
# 'mySpider.middlewares.MyspiderSpiderMiddleware': 543,
#}
# 下载中间件
#DOWNLOADER_MIDDLEWARES = {
# 'mySpider.middlewares.MyspiderDownloaderMiddleware': 543,
#}
......
# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
#ITEM_PIPELINES = {
# 'mySpider.pipelines.MyspiderPipeline': 300, # 管道
#}
.......
省略号省略代码,一般重要点,给了注释
6.mySpider/spiders/ :存储爬虫代码目录
import scrapy
class DbSpider(scrapy.Spider):
name = 'db'
allowed_domains = ['douban.com'] # 可以修改
start_urls = ['http://douban.com/'] # 开始的url也可以修改
def parse(self, response):
# pass
六. Scrapy shell
Scrapy终端是一个交互终端,我们可以在未启动spider的情况下尝试及调试代码,也可以用来测试XPath或CSS表达式,查看他们的工作方式,方便我们爬取的网页中提取的数据,但是一般使用的不多。感兴趣的查看官方文档:
官方文档
http://scrapy-chs.readthedocs.io/zh_CN/latest/topics/shell.html
Scrapy Shell根据下载的页面会自动创建一些方便使用的对象,例如 Response 对象,以及 Selector 对象 (对HTML及XML内容)。
- 当shell载入后,将得到一个包含response数据的本地 response 变量,输入 response.body将输出response的包体,输出 response.headers 可以看到response的包头。
- 输入 response.selector 时, 将获取到一个response 初始化的类 Selector 的对象,此时可以通过使用 response.selector.xpath()或response.selector.css() 来对 response 进行查询。
- Scrapy也提供了一些快捷方式, 例如 response.xpath()或response.css()同样可以生效(如之前的案例)。
Selectors选择器
“
Scrapy Selectors 内置 XPath 和 CSS Selector 表达式机制
”
Selector有四个基本的方法,最常用的还是xpath:
- xpath(): 传入xpath表达式,返回该表达式所对应的所有节点的selector list列表
- extract(): 序列化该节点为字符串并返回list
- css(): 传入CSS表达式,返回该表达式所对应的所有节点的selector list列表,语法同 BeautifulSoup4
- re(): 根据传入的正则表达式对数据进行提取,返回字符串list列表
七、案例实战
本节,我将使用Scrapy爬取站酷数据作为示例
7.1 案例说明
既然已经初步了解了scrapy的工作流程以及原理,我们来做一个入门的小案例,爬取站酷首页推荐的item信息。如下图所示,一个小方框就是一个item信息。我们要提取每一个item的六个组成部分:
- imgLink(封面图片链接);
- title(标题);
- types(类型);
- vistor(人气);
- comment(评论数);
- likes(推荐人数)
然后只是一个页面的item,我们还要通过翻页实现批量数据采集。
7.2 文件配置
目录结构
在上一篇中我们说明了新建scrapy项目(zcool)和spider项目(zc),这里不再赘述,然后得到我们的目录结构如下图所示:
start.py文件
然后为了方便运行,在zcool目录下新建start文件。并进行初始化设置。
from scrapy import cmdline
cmdline.execute('scrapy crawl zc'.split())
settings.py文件
在这个文件里我们需要做几样设置
避免在程序运行的时候打印log日志信息
LOG_LEVEL = 'WARNING'
ROBOTSTXT_OBEY = False
添加请求头:
打开管道:
item.py文件
import scrapy
class ZcoolItem(scrapy.Item):
# define the fields for your item here like:
imgLink = scrapy.Field() # 封面图片链接
title = scrapy.Field() # 标题
types = scrapy.Field() # 类型
vistor = scrapy.Field() # 人气
comment = scrapy.Field() # 评论数
likes = scrapy.Field() # 推荐人数
7.3 页面数据提取
首先我们在站酷页面使用xpath-helper测试一下:
然后zc.py文件里面初步测试一下:
def parse(self, response):
divList = response.xpath('//div[@class="work-list-box"]/div')
print(len(divList))
运行结果如下图所示:
没有问题,然后我们对各种信息分别解析提取,
def parse(self, response):
divList = response.xpath('//div[@class="work-list-box"]/div')
for div in divList:
imgLink = div.xpath("./div[1]/a/img/@src").extract()[0] # 1.封面图片链接
... 2.title(标题);3 types(类型);4vistor(人气);5comment(评论数) ....
likes = div.xpath("./div[2]/p[3]/span[3]/@title").extract_first() # 6likes(推荐人数)
item = ZcoolItem(imgLink=imgLink,title=title,types=types,vistor=vistor,comment=comment,likes=likes)
yield item
解释: xpath提取数据方法:
S.N.方法 & 描述extract()返回的是符合要求的所有的数据,存在一个列表里。extract_first()返回的hrefs 列表里的第一个数据。get()和extract_first()方法返回的是一样的,都是列表里的第一个数据。getall()和extract()方法一样,返回的都是符合要求的所有的数据,存在一个列表里。
注意:
“
get() 、getall() 方法是新的方法,extract() 、extract_first()方法是旧的方法。extract() 、extract_first()方法取不到就返回None。get() 、getall() 方法取不到就raise一个错误。
”
item实例创建(yield上面一行代码)
这里我们之前在目录文件配置的item文件中已经进行了设置,对于数据存储,我们在爬虫文件中开头要导入这个类:
from zcool.items import ZcoolItem
然后使用yield返回数据。
为什么使用yield而不是return
不能使用return这个无容置疑,因为要翻页,使用return直接退出函数;而对于yield:在调用for的时候,函数内部不会立即执行,只是返回了一个生成器对象。在迭代的时候函数会开始执行,当在yield的时候,会返回当前值(i)。之后的这个函数会在循环中进行,直到没有下一个值。
7.4 翻页实现批量数据采集
通过上面的代码已经可以初步实现数据采集,只不过只有第一页的,如下图所示:
但是我们的目标是100个页面的批量数据采集,所以代码还需要修改。针对翻页这里介绍两种方式:
方式一:我们首先在页面中定位到下一页的按钮,如下图所示:
然后编写如下代码,在for循环完毕后。
next_href = response.xpath("//a[@class='laypage_next']/@href").extract_first()
if next_href:
next_url = response.urljoin(next_href)
print('*' * 60)
print(next_url)
print('*' * 60)
request = scrapy.Request(next_url)
yield request
scrapy.Request(): 把下一页的url传递给Request函数,进行翻页循环数据采集。
https://www.cnblogs.com/heymonkey/p/11818495.html # scrapy.Request()参考链接
注意方式一只有下一页按钮它的href对应属性值和下一页的url一致才行。
方式二:定义一个全局变量count = 0,每爬取一页数据,令其加一,构建新的url,再使用scrapy.Request() 发起请求。
如下图所示:
count = 1
class ZcSpider(scrapy.Spider):
name = 'zc'
allowed_domains = ['zcool.com.cn']
start_urls = ['https://www.zcool.com.cn/home?p=1#tab_anchor'] # 第一页的url
def parse(self, response):
global count
count += 1
for div in divList:
# ...xxx...
yield item
next_url = 'https://www.kuaikanmanhua.com/tag/0?state=1&sort=1&page={}'.format(count)
yield scrapy.Request(next_url)
这两种方式在实际案例中择机采用。
7.5 数据存储
数据存储是在pipline.py中进行的,代码如下:
from itemadapter import ItemAdapter
import csv
class ZcoolPipeline:
def __init__(self):
self.f = open('Zcool.csv','w',encoding='utf-8',newline='') # line1
self.file_name = ['imgLink', 'title','types','vistor','comment','likes'] # line2
self.writer = csv.DictWriter(self.f, fieldnames=self.file_name) # line3
self.writer.writeheader() # line4
def process_item(self, item, spider):
self.writer.writerow(dict(item)) # line5
print(item)
return item # line6
def close_spider(self,spider):
self.f.close()
解释:
- line1: 打开文件,指定方式为写,利用第3个参数把csv写数据时产生的空行消除
- line2: 设置文件第一行的字段名,注意要跟spider传过来的字典key名称相同
- line3: 指定文件的写入方式为csv字典写入,参数1为指定具体文件,参数2为指定字段名
- line4: 写入第一行字段名,因为只要写入一次,所以文件放在__init__里面
- line5: 写入spider传过来的具体数值,注意在spider文件中yield的item,是一个由类创建的实例对象,我们写入数据时,写入的是 字典,所以这里还要转化一下。
- line6: 写入完返回
7.6 程序运行
因为之前创建了start.py文件,并且对它就行了初始化设置,现在运行爬虫程序不需要在控制台中输入命令:
scrapy crawl zc(爬虫项目名)
直运行start.py文件:得到如下结果:
对应于页面:
打开csv文件如下图所示:(由于csv文件在word中乱码了,此处我是用Notepad++打开)
没有问题,数据采集完毕。
7.7. 总结
入门案例,需要细心,主要是基础知识的巩固,以便于为进阶学习做好准备。
相关推荐
- 戴尔官网保修查询入口(戴尔售后保质期查询)
-
可以按照以下步骤查询戴尔笔记本电脑的保修期:1.打开戴尔官网:https://www.戴尔.com/zh-cn/售后服务/保修政策.html2.点击页面上方的“服务与支持”按钮,进入戴尔的服务支持...
- 手机号邮箱登录入口(手机号邮箱官网)
-
手机163邮箱登录入口如下:163邮箱官网入口:https://smart.mail.163.com/login.htm点击进入登录或者注册邮箱即可。手机浏览器访问进入官网http://www.123...
- sd卡(sd卡无法读取怎么修复)
-
SD卡是大卡,相机用的;普通的手机内存卡,是小卡,正规的名称是macrosd卡,也就是微型SD卡。可以通过卡套转为普通的SD卡的大小。 其实就是大小不同。但手机上的内存卡,人们经常也俗称为SD...
- windows7蓝牙功能在哪里打开
-
点击搜索框在windows7系统主界面点击开始菜单,点击打开搜索框。输入命令输入services.msc后回车,在列表中找到并右击BluetoothSupportS...点击属性选择进入属性菜单,...
-
- 2010激活密钥(microsoft2010激活密钥)
-
步骤/方式1officeprofessionalplus2010:(office专业版)6QFdx-pYH2G-ppYFd-C7RJM-BBKQ8Bdd3G-xM7FB-Bd2HM-YK63V-VQFdKVYBBJ-TRJpB-QFQ...
-
2025-11-19 04:03 off999
- 联想官方刷新bios工具(联想电脑刷新bios)
-
刷新BIOS需要使用联想的官方网站或授权维修中心来进行操作。以下是一些基本步骤:1.访问联想的官方网站,找到BIOS更新程序并下载。在下载过程中,请确保选择与您计算机型号匹配的版本。2.将下载的B...
-
- 苹果ios14系统下载(苹果ios14.1下载)
-
1方法一步骤/方式一打开Appstore。步骤/方式二在搜索栏点击搜索框。步骤/方式三搜索并点击需要下载的软件。步骤/方式四点击获取。步骤/方式五最后验证ID密码即可。1.在应用商店搜索你要下载的应用名称。2.点击下载按钮,如果要求登...
-
2025-11-19 03:03 off999
- office2010怎么免费永久激活密钥
-
用这个试试,一个KMS激活工具可以激活2010到2019的Office自家的目前用的就是这个microsoft6477.moe/1716.html直接使用这个Microsoftoffice2010...
-
- 类似爱加速的国内ip(类似爱加速的app)
-
推荐“V8盒子”。这一款免费无广告的模拟器,不同于其它软件盒子,而是类似于X8沙箱,满足游戏多开,画中画,悬浮球操作,熄屏后台运行等多功能的沙箱盒子.支持一键root,一键安装xposed框架,能在安卓/苹果手机上运行多个安卓/ios虚拟系...
-
2025-11-19 02:03 off999
- 阿里旺旺手机客户端(阿里旺旺手机app)
-
手机淘宝的旺旺在打开商品后,会看到左下角有个旺旺的图标,点击就可以联系了。 阿里旺旺是将原先的淘宝旺旺与阿里巴巴贸易通整合在一起的一个新品牌。它是淘宝和阿里巴巴为商人量身定做的免费网上商务沟通软件,...
- 最纯净的pe装机工具(pe工具哪个纯净)
-
U盘装系统步骤:1.制作U盘启动盘。这里推荐大白菜U盘启动盘制作工具,在网上一搜便是。2.U盘启动盘做好了,我们还需要一个GHOST文件,可以从网上下载一个ghost版的XP/WIN7/WIN8系统,...
- 装一个erp系统多少钱(wms仓库管理软件)
-
现在主流有客户端ERP和云端ERP两种客户端通常一次买断,价格在万元左右,但是还有隐性费用,你需要支付服务器、数据管理员,此外如果系统需要更新维护,你还需要支付另外一笔不菲的费用。云端ERP:优势...
- cad2014序列号和密钥永久(autocad2014序列号和密钥)
-
1在cad2014中修改标注样式后,需要将其保存2单击“样式管理器”按钮,在弹出的窗口中选择修改后的标注样式,然后单击“设置为当前”按钮,再单击“保存当前样式”按钮,将其保存为新的样式名称3为了...
- qq修改密保手机号(qq修改密保手机号是什么意思)
-
QQ更改绑定的手机号码操作步骤如下:1、打开手机主界面,找到“QQ”软件点击打开。2、输入正确的QQ账户和密码登录到qq主界面。3、点击左上角的头像“图片”,进入到个人中心界面。4、进入到个人中心界面...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
慕ke 前端工程师2024「完整」
-
失业程序员复习python笔记——条件与循环
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
