首页 > 其他分享 >Spider理论系列--Scrapy浅应用

Spider理论系列--Scrapy浅应用

时间:2023-05-27 21:02:07浏览次数:44  
标签:xpath -- 爬虫 Spider item Scrapy article response scrapy

scrapy的入门使用

学习目标:
  1. 掌握 scrapy的安装
  2. 应用 创建scrapy的项目
  3. 应用 创建scrapy爬虫
  4. 应用 运行scrapy爬虫
  5. 应用 解析并获取scrapy爬虫中的数据

1、scrapy项目实现流程

  1. 创建一个scrapy项目:scrapy startproject mySpider
  2. 生成一个爬虫:scrapy genspider myspider www.xxx.cn
  3. 提取数据:完善spider,使用xpath等方法
  4. 保存数据:pipeline中保存数据

2、安装

安装scrapy命令:

pip install scrapy==2.5.1
 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scrapy==2.5.1 
 pip install scrapy-redis==0.7.2

如果安装失败. 请先升级一下pip. 然后重新安装scrapy即可.

最新版本的pip升级完成后. 安装依然失败, 可以根据报错信息进行一点点的调整, 多试几次pip. 直至success.

注意:

如果上述过程还是无法正常安装scrapy, 可以考虑用下面的方案来安装:

  1. 安装wheel
pip install wheel
  1. 下载twisted安装包, https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted

Spider理论系列--Scrapy浅应用_scrapy

  1. 用wheel安装twisted.
pip install Twisted‑21.7.0‑py3‑none‑any.whl
  1. 安装pywin32
pip install pywin32
  1. 安装scrapy
pip install scrapy

总之, 最终你的控制台输入scrapy version能显示版本号. 就算成功了

3、创建scrapy项目

创建scrapy项目的命令:scrapy startproject +<项目名字>

示例:scrapy startproject myspider

生成的目录和文件结果如下:

Spider理论系列--Scrapy浅应用_爬虫_02

scrapy的核心组件

  • 引擎(Scrapy) 用来处理整个系统的数据流处理, 触发事务(框架核心)
  • 调度器(Scheduler) 用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
  • 下载器(Downloader) 用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
  • 爬虫(Spiders) 爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
  • 项目管道(Pipeline) 负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。

4、创建爬虫

命令:在项目路径下执行:scrapy genspider +<爬虫名字> + <允许爬取的域名>

示例:

  • scrapy startproject duanzi01
  • cd duanzi01/
  • scrapy genspider duanzi duanzixing.com

生成的目录和文件结果如下:

Spider理论系列--Scrapy浅应用_scrapy_03

5、完善spider

完善spider即通过方法进行数据的提取等操作

在duanzi.py中修改内容如下:

import scrapy
 
 # 自定义spider类,继承scrapy.spider
 class DuanziSpider(scrapy.Spider):
     # 爬虫名字
     name = 'duanzi'
     # 允许爬取的范围,防止爬虫爬到别的网站
     allowed_domains = ['duanzixing.com']
     # 开始爬取的url地址
     start_urls = ['http://duanzixing.com/']
 
     # 数据提取的方法,接受下载中间件传过来的response 是重写父类中的parse方法
     def parse(self, response, **kwargs):
         # 打印抓取到的页面源码
         # print(response.text)
         # xpath匹配每条段子的article列表
         article_list = response.xpath('//article[@class="excerpt"]')
         # print(article_list)
         # 循环获取每一个article
         for article in article_list:
             # 匹配标题
             # title = article.xpath('./header/h2/a/text()')
             # [<Selector xpath='./header/h2/a/text()' data='一个不小心就把2000块钱的包包设置成了50包邮'>]
             # title = article.xpath('./header/h2/a/text()')[0].extract()
             # 等同于
             title = article.xpath('./header/h2/a/text()').extract_first()
 
             # 获取段子内容
             con = article.xpath('./p[@class="note"]/text()').extract_first()
             print('title', title)
             print('con', con)

启动爬虫命令: scrapy crawl duanzi

response响应对象的常用属性

  • response.url:当前响应的url地址
  • response.request.url:当前响应对应的请求的url地址
  • response.headers:响应头
  • response.request.headers:当前响应的请求头
  • response.body:响应体,也就是html代码,byte类型
  • response.text 返回响应的内容 字符串
  • response.status:响应状态码
注意:
  1. response.xpath方法的返回结果是一个类似list的类型,其中包含的是selector对象,操作和列表一样,但是有一些额外的方法
  2. extract() 返回一个包含有字符串的列表
    如果使用列表调用extract()则表示,extract会将列表中每一个列表元素进行extract操作,返回列表
  3. extract_first() 返回列表中的第一个字符串,列表为空没有返回None
  4. spider中的parse方法必须有
  5. 需要抓取的url地址必须属于allowed_domains,但是start_urls中的url地址没有这个限制
  6. 启动爬虫的时候注意启动的位置,是在项目路径下启动

6、配置settings文件

  • ROBOTSTXT_OBEY = False
    robots是一种反爬协议。在协议中规定了哪些身份的爬虫无法爬取的资源有哪些。
    在配置文件中setting,取消robots的监测:
  • 在配置文件中配置全局的UA:USER_AGENT='xxxx'
  • 在配置文件中加入日志等级:LOG_LEVEL = 'ERROR' 只输出错误信息
    其它日志级别
  • CRITICAL 严重错误
  • ERROR 错误
  • WARNING 警告
  • INFO 消息
  • DEBUG 调试

代码实例

# Scrapy settings for mySpider project
 USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36'
 
 ROBOTSTXT_OBEY = False
 
 LOG_LEVEL = 'ERROR'

7、数据存储

7.1、使用终端命令行进行存储

  • 代码配置
    ITSpider.py
class ITSpider(scrapy.Spider):
     name = 'ITSpider'
     # allowed_domains = ['www.xxx.com']
     start_urls = ['https://duanzixing.com/page/2/']
 
     # 通过终端写入文件的方式
     def parse(self, response):
         article_list = response.xpath('/html/body/section/div/div/article')
         # 创建列表, 存储数据
         all_data = []
         for article in article_list:
             title = article.xpath('./header/h2/a/text()').extract_first()
             con = article.xpath('./p[2]/text()').extract_first()
             dic = {
                 'title': title,
                 'con': con
             }
             all_data.append(dic)
         return all_data
  • 终端命令
    scrapy crawl ITSpider -o ITSpider.csv
    将文件存储到ITSpider.csv 文件中

7.2、利用管道pipeline来处理(保存)数据(写入文件中)

先跟着配置 后面会单讲

代码配置

  • 打开items.py文件 添加如下代码
    items.py
import scrapy
 
 
 class MyspiderItem(scrapy.Item):
     # define the fields for your item here like:
     # name = scrapy.Field()
     title = scrapy.Field()
     con = scrapy.Field()
  • ITSpider.py
import scrapy
 from myspider.items import MyspiderItem
 
 class ITSpiderSpider(scrapy.Spider):
     name = 'ITSpider'
     # allowed_domains = ['www.xxx.com']
     start_urls = ['https://duanzixing.com/page/2/']
 
     # 写入管道 持久化存储
     def parse(self, response):
         article_list = response.xpath('/html/body/section/div/div/article')
         for article in article_list:
             title = article.xpath('./header/h2/a/text()').extract_first()
             con = article.xpath('./p[2]/text()').extract_first()
             item = DuanziproItem()
             item['title'] = title
             item['con'] = con
             yield item

在爬虫文件ITSpider.py中parse()函数中最后添加

yield item

思考:为什么要使用yield?

  1. 让整个函数变成一个生成器,有什么好处呢?
  2. 遍历这个函数的返回值的时候,挨个把数据读到内存,不会造成内存的瞬间占用过高
  3. python3中的range和python2中的xrange同理

注意:yield能够传递的对象只能是:BaseItem,Request,dict,None

  • 打开管道文件 pipelines.py 添加如下代码
    pipelines.py
class ITSpiderPipeline:
     f = None
     def open_spider(self, spider):
         print('爬虫开始时被调用一次')
         self.f = open('./duanzi.text', 'w')
         
     # 爬虫文件中提取数据的方法每yield一次item,就会运行一次
     # 该方法为固定名称函数
     def process_item(self, item, spider):
         print(item)
         self.f.write(item['title']+item['con']+'\n')
         return item
 
     def close_spider(self, spider):
         print('爬虫结束时被调用')
         self.f.close()
  • open_spider方法
    重写父类中open_spider方法 只有爬虫开始十被调用一次
  • close_spider 方法
    重写父类中lose_spider方法 爬虫结束时被调用一次
  • 在settings.py设置开启pipeline
    将默认被注释的管道打开
ITEM_PIPELINES = {
    'myspider.pipelines.MyspiderPipeline': 300,
 }

其中数值代表优先级 数值越小优先级越高

8、运行scrapy

命令:在项目目录下执行scrapy crawl +<爬虫名字>

示例:scrapy crawl ITSpider

9、总结

  1. srapy的安装:pip install scrapy
  2. 创建scrapy的项目: scrapy startproject myspider
  3. 创建scrapy爬虫:在项目目录下执行 scrapy genspider ITSpider www.xxx.cn
  4. 运行scrapy爬虫:在项目目录下执行 scrapy crawl ITSpider
  5. 解析并获取scrapy爬虫中的数据:
  1. response.xpath方法的返回结果是一个类似list的类型,其中包含的是selector对象,操作和列表一样,但是有一些额外的方法
  2. extract() 返回一个包含有字符串的列表
  3. extract_first() 返回列表中的第一个字符串,列表为空没有返回None
  1. scrapy管道的基本使用:
  1. 完善pipelines.py中的process_item函数
  2. 在settings.py中设置开启pipeline

标签:xpath,--,爬虫,Spider,item,Scrapy,article,response,scrapy
From: https://blog.51cto.com/u_15915681/6363067

相关文章

  • 操作系统(2.8)--线程的实现
    线程的实现方式1.内核支持线程(KST)内核支持线程,与进程相同,是在内核的支持下运行的,即无论是用户进程中的线程,还是系统进程中的线程,他们的创建、撤消和切换等也是依靠内核,在内核空间实现的。这种线程实现方式主要有如下四个优点:(1)在多处理器系统中,内核能够同时调度同一进程中多个线......
  • 如何用C语言做一个三子棋游戏
    如何来做一个三子棋游戏呢,首先老规矩先来做一个简易的菜单下一步让这个菜单能够实现它的功能,选则1就开始游戏,选择0就退出游戏,不是1不是0 那就是选错了提示选择错误。创建一个变量input 用来存放我们输入的数字,利用do while(因为dowhile 循环最少可以循环一次,比较符......
  • 2023-05-27:给你一个只包含小写英文字母的字符串 s 。 每一次 操作 ,你可以选择 s 中两
    2023-05-27:给你一个只包含小写英文字母的字符串s。每一次操作,你可以选择s中两个相邻的字符,并将它们交换。请你返回将s变成回文串的最少操作次数。注意,输入数据会确保s一定能变成一个回文串。输入:s="letelt"。输出:2。答案2023-05-27:大体过程如下:1.定义结构体Index......
  • 行业信息科普
       三种互联网公司的运作模式1.ToC(Business-to-Customer):表示卖或服务的东西是给买东西的普通客人2.ToB(Business-to-Business):表示卖或服务的东西是给大公司的3.ToVC(Venturecapitalinvestment):风险投资,表示现在的这个公司不挣钱,但是这公司服务却很到位,于是......
  • 文心一言 VS 讯飞星火 VS chatgpt (23)-- 算法导论4.2 5题
    五、V.Pan发现一种方法,可以用132464次乘法操作完成68x68的矩阵相乘,发现另一种方法,可以用143640次乘法操作完成70x70的矩阵相乘,还发现一种方法,可以用155424次乘法操作完成72x72的矩阵相乘。当用于矩阵相乘的分治算法时,上述哪种方法会得到最佳的渐近运行时间?与......
  • 观点收录
    合理的工艺设计胜过牛逼的程序设计千万倍:计算机系统是辅助工艺实现,对于这种大型的设备制造,工艺真正决定了生产效能以及产品质量。——贺臣......
  • java后端开发流程总结
    流程简介:1、数据库见表(工具建表和cmd命令行(sql语言)两种方式)2、前端页面准备(html+css+js)3、controler层编写(针对具体功能编写,比如登录功能,在这一层获取前台输入的账号密码。这是就可以等待来自数据库里的数据了)4、接着编写serverdao层依据controler层的功能编写相应的get......
  • Odoo常用字段属性
     string是字段的默认标签,在用户界面中使用。除Selection和关联字段外,它都是第一个位置参数,所以大多数情况下它用作关键字参数。如未传入,将由字段名自动生成。default设置字段默认值。可以是具体值(如active字段中的default=True),或是可调用引用,有名函数或匿名函数均可。help提......
  • jmeter线程组之间数据共享
    jmeter添加环境变量,可使跨线程组访问该属性值,实现了数据共享使用函数setProperties实现思路:先创建两个线程组,第一个线程组设置环境变量,第二个线程组获取环境变量的值(1)第一个线程组:设置随机生成四位数字后,在将值赋值给环境变量将设置的变量${param}引用到环境变量,在添加......
  • 分布式机器学习(Parameter Server)
    分布式机器学习中,参数服务器(ParameterServer)用于管理和共享模型参数,其基本思想是将模型参数存储在一个或多个中央服务器上,并通过网络将这些参数共享给参与训练的各个计算节点。每个计算节点可以从参数服务器中获取当前模型参数,并将计算结果返回给参数服务器进行更新。为了保持......