Scrapy框架之一个小项目带你上路

前言

上一篇章讲解了如何新建一个 Scrapy 项目,带大家了解了 Scrapy 框架的基本结构,还没了解的各位可以看这里
Scrapy框架之新建Scrapy项目详解

这篇主要讲解 Scrapy 框架中的一些基本配置,以及通过一个爬虫来进一步的了解 Scrapy 的工作原理

顺便提一下,这次爬取的是维基百科上的各国演员姓名,而爬取维基百科的首要条件就是需要翻墙,没有购买VPS的小伙伴该怎么办呢?

由于审核问题...如何免费翻墙请关注公众号后,在后台回复大写【FQ】

正文

先来接着看看 settings.py 中常用的配置
BOT_NAME

  • 默认: 'scrapybot'
  • 当使用 startproject 命令创建项目时其也被自动赋值

ROBOTSTXT_OBEY

  • 默认: ROBOTSTXT_OBEY = True
  • 遵守网站的机器人协议,但是一般我们都会改为False,或者注释掉这句

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 = {
    'myscrapy.pipelines.MyscrapyPipeline': 300,
    }
    

USER_AGENT

  • 默认: 'myscrapy (+http://www.yourdomain.com )'
  • 爬取的默认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

除了这些配置参数, settings.py 中还有很多参数可以配置,也可以在其中自己定义数据库的配置连接参数

接下来就是开始我们的爬虫案例的第一部分

我们从这个各国演员分类开始
https://zh.wikipedia.org/wiki/Category:%E5%90%84%E5%9C%8B%E6%BC%94%E5%93%A1

而对应的在爬虫文件中,我们把 allowed_domains 换成了维基百科的域名,这样爬虫运行时就不会采集其他域名链接的内容

这里我们不用原来的start_urls,而是重写了一个start_requests方法,在方法中定义开始爬取的链接等等,然后调用scrapy.Request来发送请求,请求中的几个参数,简单地讲,url就是请求的链接, callback就是回调到parse这个方法,然后可以打印输出,meta可以传递参数,这里是为了添加本地的代理(添加代理后才可以正常访问到维基百科)

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


class FirstSpider(scrapy.Spider):
    name = 'first'
    allowed_domains = ['wikipedia.org']

    def start_requests(self):
        start_urls = 'https://zh.wikipedia.org/wiki/Category:%E5%90%84%E5%9C%8B%E6%BC%94%E5%93%A1'
        yield scrapy.Request(url=start_urls, callback=self.parse, meta={'proxy': 'http://localhost:1080'})

    def parse(self, response):
        print(response.text)

那么我们现在就来运行看看,到底能不能获取返回的响应,在这里如何运行一个 Scrapy 项目呢?

第一种方法:命令行运行

首先打开命令行,进入到你的项目文件夹下,注意,一定要是进入你的项目文件夹,否则命令找不到你的爬虫文件,就没有办法执行

接着输入命令,我这里依旧是python3 -m,不多提了,需要注意的是,我这里的 first 就是 name = 'first',中的 name的值,是你自己定义的爬虫的名称,输完命令后回车即可

scrapy crawl first

这就是我们得到响应的html源码

第二种方法:pycharm中的终端执行

打开 pycharm 找到左下角的 Terminal ,或者点击在菜单栏中找

2019-02-27_222432.png

同样我们需要进入到项目的文件夹下

然后运行

当然有人会问这前面一大堆的加载的信息是什么?这些其实是项目运行时读取的配置信息,在后续也会讲到

第三种方法:代码运行

每次都要输一遍命令来执行吗,有点麻烦啊......那么你可以试试,加入这些代码,来让执行变得更加自动化

# -*- coding: utf-8 -*-
import scrapy
# 导入这俩
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings


class FirstSpider(scrapy.Spider):
    name = 'first'
    allowed_domains = ['wikipedia.org']

    def start_requests(self):
        start_urls = 'https://zh.wikipedia.org/wiki/Category:%E5%90%84%E5%9C%8B%E6%BC%94%E5%93%A1'
        yield scrapy.Request(url=start_urls, callback=self.parse, meta={'proxy': 'http://localhost:1080'})

    def parse(self, response):
        print(response.text)

# 从这里开始执行,其它不用变动
if __name__ == "__main__":
    process = CrawlerProcess(get_project_settings())
    process.crawl('first')
    process.start()

这样就可以直接右键运行了,怎么样,是不是变得简单了点!

要是执行了命令,却怎么也获取不到响应呢?别急,好好看看,有没有在设置中禁用机器人协议!

ROBOTSTXT_OBEY = False

以上就是今天的内容,后续会接着以这个项目为例来一起学习 Scrapy!


print('微信公众号搜索 "猿狮的单身日常" ,Java技术升级、虫师修炼,我们 不见不散!')
print('也可以扫下方二维码哦~')
猿狮的单身日常

你可能感兴趣的:(Scrapy框架之一个小项目带你上路)