一.scrapy简介

   Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍。所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式
,解析,持久化等)的具有很强通用性的项目模板。对于框架的学习,重点是要学习其框架的特性、各个功能的用法即可。
  五大核心组件工作流程:

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

二.安装

  Linux:

      pip3 install scrapy

  Windows:

      a. pip3 install wheel

      b. 下载twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted

      c. 进入下载目录,执行 pip3 install Twisted‑17.1.0‑cp35‑cp35m‑win_amd64.whl

      d. pip3 install pywin32

      e. pip3 install scrapy
其实:应该还要装一个lxml,这之前在使用xpath的时候已经装了

三.基础使用

  1.创建项目

1.在命令行中使用命令进入即将创建爬虫项目的文件夹

2.在命令行执行 scrapy starproject 爬虫项目名称(就会在当前文件夹创建项目名称的文件夹) ---->创建项目

3.在命令行执行 cd 项目名称文件夹

4.在命令行执行 scrapy genspider 爬虫文件名称 www.xxx.com  -----创建爬虫文件(存放在spider文件夹)
  执行完毕后,会在项目的spiders中生成一个应用名的py爬虫文件

5.

  5.

注:各个文件描述:
  scrapy.cfg 项目的主配置信息。(真正爬虫相关的配置信息在settings.py文件中)
  items.py 设置数据存储模板,用于结构化数据,如:Django的Model pipelines 数据持久化处理
  settings.py 配置文件,如:递归的层数、并发数,延迟下载等
  spiders 爬虫目录,如:创建文件,编写爬虫解析规则
  scrapy.cfg 项目的主配置信息。(真正爬虫相关的配置信息在settings.py文件中)
  items.py 设置数据存储模板,用于结构化数据,如:Django的Model pipelines 数据持久化处理
  settings.py 配置文件,如:递归的层数、并发数,延迟下载等 spiders 爬虫目录,如:创建文件,编写爬虫解析规则

    2.查看一下爬虫文件的内容

import scrapy

class QiubaiSpider(scrapy.Spider):
name = 'qiubai' #应用名称
#允许爬取的域名(如果遇到非该域名的url则爬取不到数据)
allowed_domains = ['https://www.qiushibaike.com/']
#起始爬取的url
start_urls = ['https://www.qiushibaike.com/'] #访问起始URL并获取结果后的回调函数,该函数的response参数就是向起始的url发送请求后,获取的响应对象.该函数返回值必须为可迭代对象或者NUll
def parse(self, response):
print(response.text) #获取字符串类型的响应内容
print(response.body)#获取字节类型的相应内容

  3.修改配置

在stttings文件中:修改配置:
  1.修改robots协议,表示我们不准从robots协议
    ROBOTSTXT_OBEY = False   2.UA伪装
    默认是这样的:
USER_AGENT = 'firstblood (+http://www.yourdomain.com)'
    修改:USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
           Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6821.400 QQBrowser/10.3.3040.400'

  4.执行爬虫程序

1.在命令行进入所在项目文件夹

2. 执行scrapy crawl 爬虫文件名称 --nolog  (表示不打印日志)

  5.本地持久化存储

# -*- coding: utf-8 -*-
import scrapy class QiubaiSpider(scrapy.Spider):
name = 'qiubai'
# allowed_domains = ['www.xxx.com']
start_urls = ['https://www.qiushibaike.com/text/'] def parse(self, response):
all_data = []
div_list=response.xpath('//div[@id="content-left"]/div')
for div in div_list:
# author=div.xpath('./div[1]/a[2]/h2/text()')[0].extract()
#这边xpath解析出来的是一个select对象列表,我们要从select对象拿出数据data
#必须执行extract,extract_first这种方法你必须保证,select对象只有一个数据
#当你的解析写的不对的话,返回给你的是一个None值
author=div.xpath('./div[1]/a[2]/h2/text()').extract_first()
#extract(),这个方法是取出select对象的所有data
content=div.xpath('./a[1]/div/span//text()').extract()
content=''.join(content)
dic={
'author':author,
'content':content
}
all_data.append(dic)
# 1.基于终端命令的持久化存储,不支持txt,支持csv,jsason等等
#返回给终端执行命令进行终端本地持久化存储
return all_data 执行命令:scrapy crawl qiubai -o qiushibaike.csv scrapy框架的我们常用的xpath并不是同一个,有点差别,器解析出来的是select对象,数据存放在select对象的data当中

支持的本地存储格式


  debug信息的认识

  

  6.管道本地持久化储存

#还有大前提就是要使用管道持久化存储,必须去settings.py把这边的注释给放开
#要通过中间件持久化存储必须放开这个注释,字典后面的数字表示优先级
#数字越小优先级越高
ITEM_PIPELINES = {
'QiuBaiPRO.pipelines.QiubaiproPipeline': 300,
}
#爬虫文件

# -*- coding: utf-8 -*-
import scrapy
from QiuBaiPRO.items import QiubaiproItem class QiubaiSpider(scrapy.Spider):
name = 'qiubai'
# allowed_domains = ['www.xxx.com']
start_urls = ['https://www.qiushibaike.com/text/'] # 2.基于管道的持久化存储(基于管道的持久化存储必须写下管道文件当中)
def parse(self,response):
div_list=response.xpath('//div[@id="content-left"]/div')
for div in div_list:
author=div.xpath('./div[1]/a[2]/h2/text()')[0].extract()
content=div.xpath('./a[1]/div/span//text()').extract()
content=''.join(content) #实例话一个item对象(容器)
item=QiubaiproItem()
item['author']=author
item['content']=content
#返回给pipline去持久化存储
yield item #items.py
import scrapy class QiubaiproItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field() 创建容器
author=scrapy.Field()
content=scrapy.Field() #piplines.py
# -*- coding: utf-8 -*- # Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
from scrapy.exceptions import DropItem
class QiubaiproPipeline(object): 
  f=None # 开启爬虫时执行程序执行一次,重写父类的方法,可以开启数据库等,要记得参数有一个spider不要忘记了
  def open_spider(self,spider):
    self.f=open('./qiushibaike.txt','w',encoding='utf-8') #提取处理数据(保存数据)
  def process_item(self, item, spider): self.f.write(item['author']+':'+item['content']+'\n')
     #raise DropItem() # 后续的 pipeline的process_item方法不再执行
     return item #要记得把数据返回给下一个存储的,要不然下一个存储的就拿不到数据了     
#.关闭爬虫时执行也是只执行一次,重写父类方法,可以关闭数据库等,重写父类要要有参数spider,不要忘记了
def colse_spider(self,spider):
self.f .close()

     7.管道mysql储存


#还有大前提就是要使用管道持久化存储,必须去settings.py把这边的注释给放开

#要通过中间件持久化存储必须放开这个注释,字典后面的数字表示优先级
#数字越小优先级越高
ITEM_PIPELINES = {
'QiuBaiPRO.pipelines.QiubaiproPipeline': 300,
}

爬虫文件:

# -*- coding: utf-8 -*-
import scrapy
from QiuBaiPRO.items import QiubaiproItem class QiubaiSpider(scrapy.Spider):
name = 'qiubai'
# allowed_domains = ['www.xxx.com']
start_urls = ['https://www.qiushibaike.com/text/']
# 2.基于管道的持久化存储(基于管道的持久化存储必须写下管道文件当中)
def parse(self,response):
div_list=response.xpath('//div[@id="content-left"]/div')
for div in div_list:
try :
author = div.xpath('./div[1]/a[2]/h2/text()')[0].extract() except Exception as e:
print(e)
continue
content = div.xpath('./a[1]/div/span//text()').extract()
content = ''.join(content) # 实例话一个item对象(容器)
item = QiubaiproItem()
item['author'] = author
item['content'] = content
# 返回给pipline去持久化存储
yield item #pipline.py
class Mysql_PipeLine(object):
conn=None
cursor=None
def open_spider(self,spider):
self.conn=pymysql.connect(host='127.0.0.1',port=3306,user='root',password='',db='qiubai') def process_item(self, item, spider):
self.cursor=self.conn.cursor()
print(item['author'])
try:
self.cursor.execute('insert into qiubai values ("%s","%s")'% (item['author'],item['content']))
self.conn.commit()
except Exception as e:
# print(e)
       return item  #要记得把数据返回
  def close_spider(self,spider):
  self.cursor.close()
  self.conn.close()
 

  8.redis同理

class Redis_PipeLine(object):
conn=None
def open_spider(self,spider):#m没有设置密码就先不设置了
self.conn=Redis(host='127.0.0.1',port=6379,)
def process_item(self,item,spider):
dic={
'author':item['author],
'content':item['content']
}
self.conn.lpush('qiubai',dic)
    return item #要记得把数据返回
#不要关闭,局部用重写方法,也不需要提交 #redis如果使用不了要指定redis的版本
pip install -U redis==2.10.6

  9.scrapy中一些常用的属性

我们所有自己写的爬虫都是继承与spider.Spider这个类

name

定义爬虫名字,我们通过命令启动的时候用的就是这个名字,这个名字必须是唯一的

allowed_domains

包含了spider允许爬取的域名列表。当offsiteMiddleware启用时,域名不在列表中URL不会被访问
所以在爬虫文件中,每次生成Request请求时都会进行和这里的域名进行判断 start_urls 起始的url列表
这里会通过spider.Spider方法中会调用start_request循环请求这个列表中每个地址。 custom_settings 自定义配置,可以覆盖settings的配置,主要用于当我们对爬虫有特定需求设置的时候 设置的是以字典的方式设置:custom_settings = {} from_crawler 这是一个类方法,我们定义这样一个类方法,可以通过crawler.settings.get()这种方式获取settings配置文件中的信息,同时这个也可以在pipeline中使用 start_requests()
这个方法必须返回一个可迭代对象,该对象包含了spider用于爬取的第一个Request请求
这个方法是在被继承的父类中spider.Spider中写的,默认是通过get请求,如果我们需要修改最开始的这个请求,可以重写这个方法,如我们想通过post请求 make_requests_from_url(url)
这个也是在父类中start_requests调用的,当然这个方法我们也可以重写 parse(response)
这个其实默认的回调函数
负责处理response并返回处理的数据以及跟进的url
该方法以及其他的Request回调函数必须返回一个包含Request或Item的可迭代对象或者dict或者None对象(解析完成的数据要构造成这几种格式才能发送给pipeline处理,否则会报错)

 Spider must return Request, BaseItem, dict or None

 

scrapy框架初识的更多相关文章

  1. Python学习---爬虫学习[scrapy框架初识]

    Scrapy Scrapy是一个框架,可以帮助我们进行创建项目,运行项目,可以帮我们下载,解析网页,同时支持cookies和自定义其他功能. Scrapy是一个为了爬取网站数据,提取结构性数据而编写的 ...

  2. scrapy框架初识及使用

    一.什么是Scrapy? Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等) ...

  3. 爬虫Ⅱ:scrapy框架

    爬虫Ⅱ:scrapy框架 step5: Scrapy框架初识 Scrapy框架的使用 pySpider 什么是框架: 就是一个具有很强通用性且集成了很多功能的项目模板(可以被应用在各种需求中) scr ...

  4. scrapy框架系列 (1) 初识scrapy

    Scrapy 框架 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页 ...

  5. 爬虫(十四):Scrapy框架(一) 初识Scrapy、第一个案例

    1. Scrapy框架 Scrapy功能非常强大,爬取效率高,相关扩展组件多,可配置和可扩展程度非常高,它几乎可以应对所有反爬网站,是目前Python中使用最广泛的爬虫框架. 1.1 Scrapy介绍 ...

  6. Python爬虫Scrapy框架入门(2)

    本文是跟着大神博客,尝试从网站上爬一堆东西,一堆你懂得的东西 附上原创链接: http://www.cnblogs.com/qiyeboy/p/5428240.html 基本思路是,查看网页元素,填写 ...

  7. Python爬虫Scrapy框架入门(1)

    也许是很少接触python的原因,我觉得是Scrapy框架和以往Java框架很不一样:它真的是个框架. 从表层来看,与Java框架引入jar包.配置xml或.property文件不同,Scrapy的模 ...

  8. Scrapy框架使用—quotesbot 项目(学习记录一)

    一.Scrapy框架的安装及相关理论知识的学习可以参考:http://www.yiibai.com/scrapy/scrapy_environment.html 二.重点记录我学习使用scrapy框架 ...

  9. Python爬虫从入门到放弃(十一)之 Scrapy框架整体的一个了解

    这里是通过爬取伯乐在线的全部文章为例子,让自己先对scrapy进行一个整理的理解 该例子中的详细代码会放到我的github地址:https://github.com/pythonsite/spider ...

随机推荐

  1. DataAnnotationsModelValidator-基于数据注解方式的model验证器

    http://www.cnblogs.com/artech/archive/2012/04/10/how-mvc-works.html http://www.cnblogs.com/artech/ar ...

  2. [原创]java:Stream、Socket等源码分析

    一.对于java启动之后的线程的说明 java在启动后会有几个特殊线程: 1.main线程,主线程 2.JVM线程,虚拟机的线程 3.GC垃圾回收线程,是个守护线程 4.EDT&Toolkit ...

  3. HTML 5与CSS 3权威指南(第2版·上册) 中文pdf扫描版​

    HTML5与CSS3权威指南(第2版·上册)已经成为HTML 5与CSS 3图书领域的一个标杆,被读者誉为“系统学习HTML 5与CSS 3技术的最佳指导参考书之一”和“Web前端工程师案头必备图书之 ...

  4. Android日期时间选择器DatePicker、TimePicker日期时间改变事件响应(Android学习笔记)

    activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...

  5. linux chmod对文件权限的操作

    在Unix和Linux的各种操作系统下,每个文件(文件夹也被看作是文件)都按读.写.运行设定权限. 例如我用ls -l命令列文件表时,得到如下输出: -rw-r--r-- 1 apple users ...

  6. 什么时候调用dealloc

    什么时候回调用dealloc? 1.这个类被release的时候会被调用: 2.这个对象的retain count为0的时候会被调用: 3.或者说一个对象或者类被置为nil的时候:

  7. VMware虚拟机下安装CentOS系统超详细教程

    链接:https://jingyan.baidu.com/article/fdffd1f8736173f3e98ca1e3.html 1.步骤一.工具准备 1.物理计算机一台 配置要求: 操作系统:w ...

  8. luoguP1401 城市

    https://www.luogu.org/problemnew/show/P1401 二分答案网络流判断是否可行即可 #include <bits/stdc++.h> using nam ...

  9. 16、OpenCV Python 腐蚀和彭胀

    __author__ = "WSX" import cv2 as cv import numpy as np def erode_demo(image): print(image. ...

  10. postgresql编译安装与调试(一)

    因为最近组里的项目和postgresql有关,并且需要查看和调试源码,所以专门学习了一下如何安装和调试postgresql,此博文用来记录自己的安装和调试过程.安装环境是CentOS6(CentOS7 ...