Scrapy 爬虫完整案例-基础篇( 三 )


Scrapy 爬虫完整案例-基础篇

文章插图
 
第 2 页 URL 地址:
http://capi.douyucdn.cn/api/v1/getVerticalRoom?limit=20&offset=20
Scrapy 爬虫完整案例-基础篇

文章插图
 
第 20 页地址:
http://capi.douyucdn.cn/api/v1/getVerticalRoom?limit=20&offset=400
Scrapy 爬虫完整案例-基础篇

文章插图
 
第 35 页地址:
Scrapy 爬虫完整案例-基础篇

文章插图
 
显示如上 , 表示数据没有35页 。
【limit】:表示每页20条数据 , 每页偏移量是20 。
【offset】:表示页数 。
把第 1 页的返回的 json 格式的数据拷贝 , 通过 json 在线解析工具(https://www.json.cn/)对数据进行解析 , 如下:
Scrapy 爬虫完整案例-基础篇

文章插图
 
其中每一页20条数据 , 每条数据显示如下:
Scrapy 爬虫完整案例-基础篇

文章插图
 
第三步:创建 scrapy 爬虫项目 。
在 dos下切换到目录
D:scrapy_project
Scrapy 爬虫完整案例-基础篇

文章插图
 
新建一个新的爬虫项目:scrapy startproject douyu
Scrapy 爬虫完整案例-基础篇

文章插图
 

Scrapy 爬虫完整案例-基础篇

文章插图
 
第四步:明确需要爬取的字段 , 编写 items 文件 。
Scrapy 爬虫完整案例-基础篇

文章插图
 
对于上面的信息 , 我们只抓取 2 个字段(昵称和图片链接) 。
为了保存图片 , 还需增加一个图片保存路径的字段 。
编写 Items.py 文件 。
import scrapy
class DouyuItem(scrapy.Item):
# define the fields for your item here like:
#昵称
nickname = scrapy.Field()
#图片下载链接
imagelink = scrapy.Field()
#图片下载的本地保存路径
imagePath = scrapy.Field()
第五步:新建爬虫 , 编写爬虫文件 。
在 DOS 下切换目录
D:scrapy_projectdouyudouyuspiders
执行命令新建爬虫命令:
scrapy genspider douyuMM "capi.douyucdn.cn"
Scrapy 爬虫完整案例-基础篇

文章插图
 

Scrapy 爬虫完整案例-基础篇

文章插图
 
编写爬虫文件 。
import scrapy,sys,os
import json
path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
sys.path.append(path)
from douyu.items import DouyuItem
class DouyummSpider(scrapy.Spider):
#爬虫名
name = "douyuMM"
#允许爬虫作用的范围
allowed_domains = ["capi.douyucdn.cn"]
# URL 变量
offset = 0
#基础的 URL
url = "http://capi.douyucdn.cn/api/v1/getVerticalRoom?limit=20&offset="
# 爬虫起始的url
start_urls = [url + str(offset)]
def parse(self, response):
# 请求返回的数据是json格式 , 需要把json格式的数据转换为 Python 格式 , data 段是列表
data = https://www.isolves.com/it/cxkf/bk/2021-04-12/json.loads(response.text)["data"]
for each in data:
#定义一个Item 对象 , 用来保存数据的
item = DouyuItem()
# 取 data 列表中的值 , 放到 Item 对象中
item["nickname"] = each["nickname"]
item["imagelink"] = each["vertical_src"]
## 将获取的数据交给管道文件 pipelines  , yield的作用是把一个函数当成一个生成器 , 程序每次执行到yield时 , 返回一个值 , 程序会先暂停 , 下次调用再返回一个值 , 程序会接着暂停....
yield item
if self.offset < 400:
self.offset += 20
# 每次处理完一页的数据之后 , 重新发送下一页页面请求
# self.offset自增20 , 同时拼接为新的 url , 并调用回调函数 self.parse 处理 Response
yield scrapy.Request(self.url + str(self.offset), callback = self.parse)
第六步:分析 pipelines 管道文件处理的数据类型 。
第一个案例讲的 pipelines 管道文件处理的是 html 页面的静态文本 , 这个案例需要处理的是图片 , 需要把图片下载下来 , 需要对 Settings.py 文件进行相应的配置 。


推荐阅读