Scrapy笔记

安装scrapy框架

  1. 安装scrapy: 通过pip install scrapy

  2. 如果是在Windows上面,还需要安装pypiwin32,如果不安装,那么以后运行scrapy项目的时候会报错。安装方式:pip install pypiwin32

  3. 如果是在Ubuntu下,还需要安装一些第三方库:`sudo apt-get install python-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev`

创建爬虫

  1. 创建项目scrapy startproject <spider_name>

  2. 创建爬虫:cd到项目所在的路径,创建爬虫,执行命令scrapy genspider [spider_name] [spider_domains] 注意!爬虫名字不能和项目名字相同

项目目录结构

  1. items.py: 用来从存放爬虫爬取下来的模型,也就是定义需要爬取的数据字段

  2. middlewares.py: 用来存放各种中间件的地方

  3. pipelines.py: 存储items模型数据的,比如存到磁盘,或者写入数据库

  4. spiders: 存放爬虫文件

  5. settings.py: 爬虫的一些配置信息(比如请求头,多久发送一次请求,ip代理池等)

  6. scrapy.cfg: 项目的配置文件

运行爬虫

  1. scrapy crawl [spider_name]

  2. 每次运行的时候都要到终端去执行,这样在调试的时候不太方便;这项目下创建一个文件run_spider.py文件,这里面写上:

  from scrapy import cmdline

  # cmdline.execute('scrapy crawl [spider_name]'.split()) # 运行的命令是一个切割的列表
  # 等价于
  cmdline.execute(['scrapy', 'crawl', '[spider_name]'])

Spider下的爬虫文件

  • 在使用`scrapy genspider <spider_name> <spider_domains> 创建好一个爬虫文件后,爬虫文件如下:

  # -*- coding: utf-8 -*-
  import scrapy

  class TestSpider(scrapy.Spider):
     name = 'test'  # 爬虫名字 [scrapy crawl test] 此命令运行爬虫
     allowed_domains = ['www.baidu.com']   # 运行爬虫爬取的范围
     start_urls = ['http://www.baidu.com']  # 爬虫最开始爬取的url

     def parse(self, response):
         print(response)  # 接收到的response响应对象
         print(response.body)  # 二进制数据,对应request的response.content
         print(response.text)  # 文本数据,对应request的response.text
         pass
  • 自动帮我们定义了一个TestSpider类,继承自scrapy.Spider类

  • name: 爬虫运行时的名字 scrapy crawl name

  • allwoed_domains 允许爬去的范围,scrapy运行的速度太快,防止爬到别的网站去,定义了此爬虫只能在这个域名下面爬取数据

  • start_urls: 是一个列表,爬虫最开始爬取的url

  • parse方法: 当爬虫从互联网上请求到数据之后,返回的响应数据会默认调用这个方法来解析,参数response就是接收到的响应

    • response.text 返回文本数据,解码好的文本

    • response.body 返回网页二级制数据,需要我们手动指定编码

    • response可以调用的解析方法

      • xpath: response可以直接调用xpath来来解析数据返回一个selector对象

      print(resposne.xpath('//title/text'))
      # 返回一个xpath的selector对象
      [<Selector xpath='//title/text()' data='百度一下,你就知道'>]
      # 我们需要从这个selector对象中取出数据时,使用extract()提取全部文本内容,等价与getall()
      # extract_first()提取一个文本内容,等价于get()
  • parse方法名不能更改,这是默认的start_url请求默认的回调函数,返回的响应会调用这个函数来解析,没有会报错

items.py文件

  • 定义我们需要爬取的字段信息,可以理解为字典,用法和字典是一样的

  import scrapy

  class MyspiderItem(scrapy.Item):
     # define the fields for your item here like:
     # name = scrapy.Field()
     baidu_title = scrapy.Field()  # 定义爬取的字段
  • 使用items:在爬虫文件中from ..items import MyspiderItem

# -*- coding: utf-8 -*-
import scrapy
from ..items import MyspiderItem

class TestSpider(scrapy.Spider):
   name = 'test'
   # allowed_domains = ['www.baidu.com']
   start_urls = ['http://www.baidu.com']

   def parse(self, response):
       items = MyspiderItem()  # 实例化items,items的使用方法和字典的使用方法是一样的
       items['baidu_title'] = response.xpath('//title/text()').extract_first()      
  • 注意,当我们在items文件中定义了需要爬取的字段后,在实例化使用items时,如果使用的字段

    在items中没有定义,就会报错

pipelines.py 文件

  • 管道文件,用于处理Spider返回的数据,保存到本地或者数据库等

class MyspiderPipeline(object):
   def open_spider(self, spider):  # 爬虫打开的时候执行,Spider就是你所编写的爬虫类
       pass
   
   def process_item(self, item, spider):  # 处理item
       return item  # 这里的return必须有

   def close_spider(self, spider):  # 爬虫关闭的时候执行
       pass
  • items怎么返回数据到pipelines中呢?在爬虫文件中yield items就可以了

# -*- coding: utf-8 -*-
import scrapy
from myspider.items import MyspiderItem

class TestSpider(scrapy.Spider):
   name = 'test'
   # allowed_domains = ['www.baidu.com']
   start_urls = ['http://www.baidu.com']

   def parse(self, response):
       items = MyspiderItem()
       items['baidu_title'] = response.xpath('//title/text()').extract_first()
       yield items
  • 把返回的item存到本地baidu_test.txt中

class MyspiderPipeline(object):
   def open_spider(self, spider):  # 爬虫打开的时候执行
       self.f = open('baidu_test.txt', 'w', encoding="utf-8")  # 在爬虫打开的时候打开一个文件

   def process_item(self, item, spider):  # 处理item,传递item的时候调用
       self.f.write(str(item))  # 返回的item需要转为str,把返回的item写入到文件中
       return item

   def close_spider(self, spider):  # 爬虫关闭的时候执行
       self.f.close()  # 在爬虫关闭的时候把文件关闭
  • 注意!要使用pipelines,必须在setting中把ITEM_PIPELINES打开,就是把前面的注释去掉

ITEM_PIPELINES = {
  'myspider.pipelines.MyspiderPipeline': 300,
}

setting.py 文件

  • BOT_NAME

    • 默认: 'scrapybot'

    • 当您使用 startproject 命令创建项目时其也被自动赋值。

  • CONCURRENT_ITEMS

    • 默认: 100

    • Item Processor(即 Item Pipeline) 同时处理(每个response的)item的最大值。

  • CONCURRENT_REQUESTS
    • 默认: 16

    • Scrapy downloader 并发请求(concurrent requests)的最大值。

  • DEFAULT_REQUEST_HEADERS
    • 默认: 如下

      {
      'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
      'Accept-Language': 'en',
      }

      Scrapy HTTP Request使用的默认header。

  • DEPTH_LIMIT

    • 默认: 0

    • 爬取网站最大允许的深度(depth)值。如果为0,则没有限制。

  • DOWNLOAD_DELAY
    • 默认: 0

    • 下载器在下载同一个网站下一个页面前需要等待的时间。该选项可以用来限制爬取速度, 减轻服务器压力。同时也支持小数:

    DOWNLOAD_DELAY = 0.25 # 250 ms of delay

    • 默认情况下,Scrapy在两个请求间不等待一个固定的值, 而是使用0.5到1.5之间的一个随机值 * DOWNLOAD_DELAY 的结果作为等待间隔。
  • DOWNLOAD_TIMEOUT

    • 默认: 180

    • 下载器超时时间(单位: 秒)。

  • ITEM_PIPELINES
    • 默认: {}

    • 保存项目中启用的pipeline及其顺序的字典。该字典默认为空,值(value)任意,不过值(value)习惯设置在0-1000范围内,值越小优先级越高。

      ITEM_PIPELINES = {
      'mySpider.pipelines.SomethingPipeline': 300,
      'mySpider.pipelines.ItcastJsonPipeline': 800,
      }
  • LOG_ENABLED

    • 默认: True

    • 是否启用logging。

  • LOG_ENCODING

    • 默认: 'utf-8'

    • logging使用的编码。

  • LOG_LEVEL

    • 默认: 'DEBUG'

    • log的最低级别。可选的级别有: CRITICAL、 ERROR、WARNING、INFO、DEBUG 。

  • USER_AGENT
    • 默认: "Scrapy/VERSION (+http://scrapy.org)"

    • 爬取的默认User-Agent,除非被覆盖。

  • PROXIES: 代理设置
    • 示例:

      PROXIES = [
      {'ip_port': '111.11.228.75:80', 'password': ''},
      {'ip_port': '120.198.243.22:80', 'password': ''},
      {'ip_port': '111.8.60.9:8123', 'password': ''},
      {'ip_port': '101.71.27.120:80', 'password': ''},
      {'ip_port': '122.96.59.104:80', 'password': ''},
      {'ip_port': '122.224.249.122:8088', 'password':''},
      ]
  • COOKIES_ENABLED = False
    • 禁用Cookies
  • 目的配置文件,常用的设置可以在里面定义或者设置

实现翻页

  • 匹配到下一页的url,使用scrapy.Request(url,callback,headers,cookies)

    • 参数url,访问的url

    • callback 回调函数,会调用哪个函数来处理

    • 后面的headers和cookies等就是你要添加的请求头信息了

  • 实例

  • import scrapy
    
    def parse(self, response):
    '''
    提取详情页url和下一页url
    :param response:
    :return:
    '''
    # 所有详情页的url,返回的是一个selectorList
    deatai_urls = response.xpath('//ul[@class="seeWell cf"]/li/a/@href').extract()
    for deatai_url in deatai_urls:
    yield scrapy.Request(deatai_url, callback=self.parse_detail,headers=headers) next_url = response.xpath('//a[@class="next"]/@href').extract_first()
    yield scrapy.Request(next_url, callback=self.parse)

      

scrapy基本使用的更多相关文章

  1. Scrapy框架爬虫初探——中关村在线手机参数数据爬取

    关于Scrapy如何安装部署的文章已经相当多了,但是网上实战的例子还不是很多,近来正好在学习该爬虫框架,就简单写了个Spider Demo来实践.作为硬件数码控,我选择了经常光顾的中关村在线的手机页面 ...

  2. scrapy爬虫docker部署

    spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...

  3. scrapy 知乎用户信息爬虫

    zhihu_spider 此项目的功能是爬取知乎用户信息以及人际拓扑关系,爬虫框架使用scrapy,数据存储使用mongo,下载这些数据感觉也没什么用,就当为大家学习scrapy提供一个例子吧.代码地 ...

  4. ubuntu 下安装scrapy

    1.把Scrapy签名的GPG密钥添加到APT的钥匙环中: sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 6272 ...

  5. 网络爬虫:使用Scrapy框架编写一个抓取书籍信息的爬虫服务

      上周学习了BeautifulSoup的基础知识并用它完成了一个网络爬虫( 使用Beautiful Soup编写一个爬虫 系列随笔汇总 ), BeautifulSoup是一个非常流行的Python网 ...

  6. Scrapy:为spider指定pipeline

    当一个Scrapy项目中有多个spider去爬取多个网站时,往往需要多个pipeline,这时就需要为每个spider指定其对应的pipeline. [通过程序来运行spider],可以通过修改配置s ...

  7. scrapy cookies:将cookies保存到文件以及从文件加载cookies

    我在使用scrapy模拟登录新浪微博时,想将登录成功后的cookies保存到本地,下次加载它实现直接登录,省去中间一系列的请求和POST等.关于如何从本次请求中获取并在下次请求中附带上cookies的 ...

  8. Scrapy开发指南

    一.Scrapy简介 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. Scrapy基于事件驱动网络框架 Twis ...

  9. 利用scrapy和MongoDB来开发一个爬虫

    今天我们利用scrapy框架来抓取Stack Overflow里面最新的问题(),并且将这些问题保存到MongoDb当中,直接提供给客户进行查询. 安装 在进行今天的任务之前我们需要安装二个框架,分别 ...

  10. python3 安装scrapy

    twisted(网络异步框架) wget https://pypi.python.org/packages/dc/c0/a0114a6d7fa211c0904b0de931e8cafb5210ad82 ...

随机推荐

  1. Django数据同步过程中遇到的问题:

    1.raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__ve ...

  2. Excel关联xml文件

    1.新建没传值的xml文件,变量名称自己定义好 2.打开excel,如果之前没有设置过,点击选项 如果当前Excel菜单栏中没有开发工具项,在自定义功能区先勾选上开发选项 3.点右下角的xml映射 弹 ...

  3. Django_简单的数据库交互案例

    https://www.jianshu.com/p/bd0af02e59ba 一.页面展示 做一个简单的数据库交换的练习案例   页面.png 二.创建mysql 表 (1)创建django (2)创 ...

  4. python中的unique()

    a = np.unique(A) 对于一维数组或者列表,unique函数去除其中重复的元素,并按元素由大到小返回一个新的无元素重复的元组或者列表 import numpy as np A = [1, ...

  5. 说一说js中的闭包

    不说官方给的定义,感觉自己刚开始看也不是很理解. 闭包 : 其实就是 该函数能使用函数外定义的变量. 为什么要使用闭包? 首先来说一下局部变量和全局变量的危害: 全局变量容易全局污染,局部变量又无法共 ...

  6. Android四大组件之 --- Service入门

    在前面了解了什么是多线程和异步消息处理机制后,我们来看一下到底什么是Service. 1. 什么是service(service的作用)一个服务是一个具有较长生命周期但没有用户界面的程序,例如:一个正 ...

  7. 常忽略的css技巧

    1.利用 CSS 的伪类中的content属性获取attr中的信息 效果图:鼠标放上去出现提示 css代码: .box{position:relative;display:inline-block;m ...

  8. selenium中iframe的切换

    #第一层是默认层, 第二层是新建标签的层,第三层是百度的那层from selenium import webdriverimport timedriver=webdriver.Chrome()driv ...

  9. .net 服务因为GC时遇到的问题和解决办法

    1.问题: .net单一服务中,大量的请求访问后台服务,多线程处理请求,但每个线程都可能出现超时的现象.记录超时日志显示,超时可能在序列化时,Socket异步发送AsyncSend数据时,普通业务处理 ...

  10. Inside a low budget consumer hardware espionage implant

    The following analysis was performed on a S8 data line locator which replied to the hidden SMS comma ...