学习大数据的第44天(python篇)——学习python的第四天(scrapy爬虫简单实例)

学习大数据的第44天(python篇)——学习python的第四天(scrapy爬虫简单实例)

Python——爬虫scrapy框架

Scrapy 是用 Python 实现的一个为了爬取网站数据、提取结构性数据而编写的应用框架。 Scrapy

常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。 通常我们可以很简单的通过

Scrapy 框架实现一个爬虫,抓取指定网站的内容或图片。

Scrapy架构图(绿线是数据流向)
image-20220328194609065

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值