学习大数据的第44天(python篇)——学习python的第四天(scrapy爬虫简单实例)
Python——爬虫scrapy框架
Scrapy 是用 Python 实现的一个为了爬取网站数据、提取结构性数据而编写的应用框架。 Scrapy
常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。 通常我们可以很简单的通过
Scrapy 框架实现一个爬虫,抓取指定网站的内容或图片。
Scrapy架构图(绿线是数据流向)
Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler 中间的通讯,信
号、数据传递等。
Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的 方式进行整理排
列,入队,当引擎需要时,交还给引擎。
Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests 请求,并将其
获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider 来处理,
Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字 段需要的数
据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器).
Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处 理(详细分析、
过滤、存储等)的地方。
Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩 展下载功能的组
件。
Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展 和操作引擎和
Spider中间通信的功能组件(比如进入Spider的Responses;和从 Spider出去的Requests)
Scrapy相关笔记
# 安装 Scrapy
pip install scrapy
# 查看Scarpy相关的命令
scrapy --help
startproject Create new project
# 创建一个爬虫项目
# SpiderDemo 是指项目名称
# 在当前的目录下创建一个爬虫项目
scrapy startproject SpiderDemo
New Scrapy project 'SpiderDemo', using template directory 'd:\app\python37\lib\site-packages\scrapy\templates\project', created in:
E:\CodeSpace15\learnPython15\SpiderDemo
# 进入项目中 创建爬虫样例 出现example.py 样例文件
You can start your first spider with:
cd SpiderDemo
scrapy genspider example example.com
#
# 爬虫的名称
name = 'example'
# 可以访问的域名,为了限制爬虫访问域名的范围
allowed_domains = ['example.com']
# 访问的URL
start_urls = ['http://example.com/']
# 启动爬虫命令:
# 启动名为 example 的爬虫
scrapy crawl example
# 关闭robot 协议
# settings 文件下:
ROBOTSTXT_OBEY = False
# 文件的作用
items.py: 表示定义一些获取数据的结构信息
middlewares.py: 表示自定义中间处理过程
pipelines.py: 用来存储及处理数据
settings.py : 用来设置当前的爬虫
生成的example.py: 用来写我们请求及处理过程
# 创建一个爬虫程序
1.创建一个爬虫程序JDCommentSpider,定义类名JDCommentSpider并且继承scrapy.Spider
2.给爬虫创建名称:name = 'JDCommentSpider'
3.设置允许的域名:allowed_domains
4.重写我们父类的:start_requests
5.自定义处理response方法
# 浏览器的使用:
F12打开开发者模式
圈斜杠符号表示情况当前的请求内容
preview表示查看我们API返回结果
headers表示我们请求头
爬虫小练习——爬取京东商品的评论 JDCommentSpider
import scrapy
import re
import json
# 创建JDCommentSpider类继承Spider
class JDCommentSpider(scrapy.Spider):
name = "JDCommentSpider"
allowed_domains = ['club.jd.com']
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36"
}
def start_requests(self):
# yield 参考文件demo_12_yield
'''
url: str, 爬取的url
callback: Optional[Callable] = None, 用来处理URl返回的response
method: str = "GET", request的请求方式
headers: Optional[dict] = None, 请求头,用于模拟浏览器
'''
url = 'https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100009464799&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1'
yield scrapy.Request(url=url, headers=self.header, callback=self.parse)
def parse(self, response: scrapy.http.Response):
# 打印请求内容
print(">>>" * 30)
# 通过re.match进行正则匹配,获取完整的json内容
response_match = re.match('(fetchJSON_comment98\()(.*)(\);)', response.text)
# 验证 处理结果是一个json
# with open('E:\CodeSpace15\learnPython15\data\json_res.json', mode='w',encoding='utf8') as f:
# f.write(response_match.group(2).replace('\n', '').replace('\r', ''))
# print(response_match.group(2).replace('\n', '').replace('\r', ''))
# 通过json库转换成JSON对象
json_res = json.loads(response_match.group(2).replace('\n', '').replace('\r', ''))
# 获取comments中的value
comments = json_res['comments']
# 循环获取每条评论
for comment in comments:
creationTime = comment['creationTime']
nickname = comment['nickname']
productColor = comment['productColor']
productSize = comment['productSize']
content = comment['content']
print(content, creationTime, nickname, productColor, productSize)
print(">>>" * 30)