python3学习12---scrapy学习

本文详细介绍了Scrapy爬虫框架的基本概念和工作流程,包括引擎、调度器、下载器、爬虫、管道和中间件的角色。通过实例展示了如何在Python环境中安装Scrapy,创建并运行爬虫项目,抓取指定网站的讲师信息。文章还演示了如何解析网页内容,提取数据并保存。学习Scrapy,可以高效地进行网页数据抓取。
摘要由CSDN通过智能技术生成
# 学习一下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)
'''

#运作流程
'''
1.引擎获取spider要处理的网站和需要处理的url
2.引擎通知调度器,将request入队
3.调度器处理request,将处理好的request传给引擎
4.引擎通知下载器,按照下载中间件的设置下载request请求
5.下载器按照下载中间件的设置下载request,得到结果,将结果返给引擎(如果失败:sorry,这个request下载失败了。然后引擎告诉调度器,这个request下载失败了,你记录一下,我们待会儿再下载)
6.引擎将结果返回给spider,spider处理结果
7.spider返回处理结果(item)以及需要跟进的url,传给引擎
8.引擎通知管道处理返回结果,将跟进的url传给调度器,重复上述操作

注意!只有当调度器中不存在任何request了,整个程序才会停止,(也就是说,对于下载失败的URL,Scrapy也会重新下载。)

'''

# 安装scrapy

'''
使用cmd
升级pip 
pip install --upgrade pip

通过 pip 安装 Scrapy 框架:
pip install Scrapy -i https://pypi.douban.com/simple

这里安装是有坑的
具体解决办法看这个博客
https://www.cnblogs.com/dajie/p/11223775.html

'''
'''
(venv) F:\PycharmProjects>pip list
Package          Version
---------------- ---------
attrs            20.3.0
Automat          20.2.0
beautifulsoup4   4.9.3
certifi          2020.12.5
cffi             1.14.5
chardet          4.0.0
constantly       15.1.0
cryptography     3.4.4
cssselect        1.1.0
hyperlink        21.0.0
idna             2.10
incremental      17.5.0
itemadapter      0.2.0
itemloaders      1.0.4
jmespath         0.10.0
lxml             4.6.2
mysql-connector  2.2.9
parsel           1.6.0
pip              21.0.1
Protego          0.1.16
pyasn1           0.4.8
pyasn1-modules   0.2.8
pycparser        2.20
PyDispatcher     2.0.5
PyHamcrest       2.0.2
PyMySQL          1.0.2
pyOpenSSL        20.0.1
pywin32          300
queuelib         1.5.0
requests         2.25.1
Scrapy           2.4.1
service-identity 18.1.0
setuptools       53.0.0
six              1.15.0
soupsieve        2.2
Twisted          20.3.0
urllib3          1.26.3
w3lib            1.22.0
zope.interface   5.2.0

安装成功!
'''

# 新建项目
#  scrapy startproject mySpider



在pycharm中创建scrapy项目

在命令行 输入创建项目的命令 在这里插入图片描述
项目就创建完成了
在这里插入图片描述
打开项目
在这里插入图片描述

项目文件的作用:

  • scrapy.cfg: 项目的配置文件。
  • mySpider/: 项目的Python模块,将会从这里引用代码。
  • mySpider/items.py: 项目的目标文件。
  • mySpider/pipelines.py: 项目的管道文件。
  • mySpider/settings.py: 项目的设置文件。
  • mySpider/spiders/: 存储爬虫代码目录。

项目初试

制定目标

我用菜鸟教程上的例子作为第一个开始

我们打算抓取 http://www.itcast.cn/channel/teacher.shtml 网站里的所有讲师的姓名、职称和个人信息。

  1. 打开items.py

  2. Item 定义结构化数据字段,用来保存爬取到的数据,有点像 Python 中的 dict,但是提供了一些额外的保护减少错误。

  3. 可以通过创建一个 scrapy.Item 类, 并且定义类型为 scrapy.Field 的类属性来定义一个 Item(可以理解成类似于 ORM 的映射关系)。

在这里插入图片描述

制定爬虫

  1. 爬数据

利用命令创建(在命令行中)

手动创建

scrapy genspider itcast "itcast.cn"

在这里插入图片描述
按需求编辑后如下

import scrapy

#要建立一个Spider, 你必须用scrapy.Spider类创建一个子类,并确定了三个强制的属性 和 一个方法。
class ItcastSpider(scrapy.Spider):
    name = 'itcast' # 爬虫的识别名称 必须唯一,不同的爬虫必须定义不同的名字
    allowed_domains = ['itcast.cn'] # 是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略。
    # 爬取的URL元祖/列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些urls开始。其他子URL将会从这些起始URL中继承性生成。
    start_urls = ("http://www.itcast.cn/channel/teacher.shtml",)

    '''
    parse(self, response) :解析的方法,每个初始URL完成下载后将被调用,调用的时候传入从每一个URL传回的Response对象来作为唯一参数,主要作用如下:
    负责解析返回的网页数据(response.body),提取结构化数据(生成item)
    生成需要下一页的URL请求。
    '''
    def parse(self, response):
        '''
        open 一定要加上 encoding='utf-8',否则在 f.write 的时候会报错。
         response.body 返回的是 bytes,需要将其 decode 成 string。
        :param response:
        :return:
        '''
        filename='teacher.html'
        open(filename,'w',encoding='utf-8').write(response.body.decode())


在命令行运行代码 看效果
这里itcast就是上面的name 爬虫的唯一标识

scrapy crawl itcast

在这里插入图片描述
当出现这个提示信息,且teacher.html文件出现 说明爬取成功

获取网站标题

打开F12 ,查看网站标题
在这里插入图片描述
复制xpath

/html/head/title

在这里插入图片描述

import scrapy
from scrapyTest.items import ItcastItem
#要建立一个Spider, 你必须用scrapy.Spider类创建一个子类,并确定了三个强制的属性 和 一个方法。
class ItcastSpider(scrapy.Spider):
    name = 'itcast' # 爬虫的识别名称 必须唯一,不同的爬虫必须定义不同的名字
    allowed_domains = ['itcast.cn'] # 是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略。
    # 爬取的URL元祖/列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些urls开始。其他子URL将会从这些起始URL中继承性生成。
    start_urls = ("http://www.itcast.cn/channel/teacher.shtml",)

    '''
    parse(self, response) :解析的方法,每个初始URL完成下载后将被调用,调用的时候传入从每一个URL传回的Response对象来作为唯一参数,主要作用如下:
    负责解析返回的网页数据(response.body),提取结构化数据(生成item)
    生成需要下一页的URL请求。
    '''
    def parse(self, response):
        '''
        open 一定要加上 encoding='utf-8',否则在 f.write 的时候会报错。
         response.body 返回的是 bytes,需要将其 decode 成 string。
        :param response:
        :return:
        '''
        # filename='teacher.html'
        # open(filename,'w',encoding='utf-8').write(response.body.decode())

        # 获取网页的标题试试
        # xpath: /html/head/title
        # context=response.xpath('/html/head/title/text()')
        # # print(' context is ==============',context)
        # #  context is ============== [<Selector xpath='/html/head/title' data='<title>传智教育课程培训教研团队</title>'>]
        # #  context is ============== [<Selector xpath='/html/head/title/text()' data='传智教育课程培训教研团队'>] 加上text()
        # title = context.extract_first()
        # print('title是:'+title)
        # title是:传智教育课程培训教研团队

        #现在我们要获取每个老师的信息了
        # 我们需要把数据封装到之前定义的ItcastItem类中 所以需要引入

        #打开页面 查看老师信息所存放的div特征
        # 存放老师信息的集合
        items = []
        for each in response.xpath("//div[@class='li_txt']"):
            print(each)
            # 将我们得到的数据封装到一个 `ItcastItem` 对象
            item = ItcastItem()
            # extract()方法返回的都是unicode字符串
            name = each.xpath("h3/text()").extract()
            title = each.xpath("h4/text()").extract()
            info = each.xpath("p/text()").extract()

            # xpath返回的是包含一个元素的列表
            item['name'] = name[0]
            item['title'] = title[0]
            item['info'] = info[0]

            items.append(item)

        # 直接返回最后数据
        return items

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值