前言
上一篇章讲解了如何新建一个 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
,或者点击在菜单栏中找
同样我们需要进入到项目的文件夹下
然后运行
当然有人会问这前面一大堆的加载的信息是什么?这些其实是项目运行时读取的配置信息,在后续也会讲到
第三种方法:代码运行
每次都要输一遍命令来执行吗,有点麻烦啊......那么你可以试试,加入这些代码,来让执行变得更加自动化
# -*- 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('也可以扫下方二维码哦~')