Scrapy初步使用
在windows上安装scrapy是一个很痛苦的事情. 可能会出现各种各样的异常BUG.
scrapy 2.5.1 -> scrapy-redis(0.7.2)
注意, 由于scrapy的升级. 导致scrapy-redis无法正常使用.所以这里我们选择2.5.1这个版本作为学习. 后期各位可以根据scrapy-redis的升级而跟着升级scrapy.
先使用pip直接安装看看报错不
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scrapy==2.5.1
pip install scrapy==2.5.1
如果安装成功, 直接去创建项目即可
如果安装失败. 请先升级一下pip. 然后重新安装scrapy即可.
最新版本的pip升级完成后. 安装依然失败, 可以根据报错信息进行一点点的调整, 多试几次pip. 直至success.
如果上述过程还是无法正常安装scrapy, 可以考虑用下面的方案来安装:
安装wheel
pip install wheel
下载twisted安装包 https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted

用wheel安装twisted.
pip install Twisted‑21.7.0‑py3‑none‑any.whl
安装pywin32
pip install pywin32
安装scrapy
pip install scrapy
总之, 最终你的控制台输入scrapy version
Scrapy实例
接下来, 我们用scrapy来完成一个超级简单的爬虫, 目标: 深入理解Scrapy工作的流程, 以及各个模块之间是如何搭配工作的.
-
创建项目:
scrapy startproject 项目名称示例:
scrapy startproject mySpider_2创建好项目后, 我们可以在pycharm里观察到scrapy帮我们创建了一个文件夹, 里面的目录结构如下:
mySpider_2 # 项目所在文件夹, 建议用pycharm打开该文件夹 ├── mySpider_2 # 项目跟目录 │ ├── __init__.py │ ├── items.py # 封装数据的格式 │ ├── middlewares.py # 所有中间件 │ ├── pipelines.py # 所有的管道 │ ├── settings.py # 爬虫配置信息 │ └── spiders # 爬虫文件夹, 稍后里面会写入爬虫代码 │ └── __init__.py └── scrapy.cfg # scrapy项目配置信息,不要删它,别动它,善待它. -
创建爬虫
cd 文件夹 # 进入项目所在文件夹 scrapy genspider 爬虫名称 允许抓取的域名范围示例:
cd mySpider_2 scrapy genspider youxi 4399.com效果:
(base) sylardeMBP:第七章 sylar$ cd mySpider_2 (base) sylardeMBP:mySpider_2 sylar$ ls mySpider_2 scrapy.cfg (base) sylardeMBP:mySpider_2 sylar$ scrapy genspider youxi http://www.4399.com/ Created spider 'youxi' using template 'basic' in module: mySpider_2.spiders.youxi (base) sylardeMBP:mySpider_2 sylar$至此, 爬虫创建完毕, 我们打开文件夹看一下.
├── mySpider_2 │ ├── __init__.py │ ├── items.py │ ├── middlewares.py │ ├── pipelines.py │ ├── settings.py │ └── spiders │ ├── __init__.py │ └── youxi.py # 多了一个这个. └── scrapy.cfg -
编写数据解析过程
完善youxi.py中的内容.
import scrapy class YouxiSpider(scrapy.Spider): name = 'youxi' # 该名字非常关键, 我们在启动该爬虫的时候需要这个名字 allowed_domains = ['4399.com'] # 爬虫抓取的域名,注意:域名前面是没有 www 的 # 限制该spider抓取的域名, 只要不符合该域名的一概过掉 start_urls = ['http://www.4399.com/flash/'] # 起始url # 起始url, 在引擎开始工作的时候. 自动的包装成一个请求对象 # 引擎进行调度. 交给下载器获取页面源代码,帮你封装成响应对象 # 引擎把响应对象交给spider进行解析, 解析函数就是 下面的parse # 此函数的名字不能改,固定写法 def parse(self, response, **kwargs): # parse是解析 start_urls的响应 # 以前的做法 # from lxml import etree # tree = etree.HTML(resp.text) # tree.xpath("xxx") # 现在的做法(scrapy中) li_list = response.xpath("//ul[@class='n-game cf']/li") for li in li_list: name = li.xpath("./a/b/text()").extract_first() category = li.xpath("./em/a/text()").extract_first() date = li.xpath("./em/text()").extract_first() dic = { "name": name, "category": category, "date": date } # 将提取到的数据提交到管道内. # 注意, 这里只能返回 request对象, 字典, item数据, or None yield dic注意:
==spider返回的内容只能是字典, requestes对象, item数据或者None. 其他内容一律报错==
setting.py 中配置日志级别# 配置日志级别 LOG_LEVEL = "WARNING" # 最大限度的保留错误信息. 而又不会被一些乱七八糟的日志影响 # CRITICAL 50=> 非常非常严重的错误. 解析器级别的 # ERROR 40=> 报错, 程序挂了 # WARNING 30=> 警告, 过时警告, 不会影响程序的执行. # INFO 20=> 一些提示信息, print("下载成功") # DEBUG 10=> 所有内容都记录 -
运行爬虫:
scrapy crawl 爬虫名字实例:
scrapy crawl youxi -
编写pipeline.对数据进行简单的保存
数据传递到pipeline, 我们先看一下在pipeline中的样子.
首先修改settings.py文件中的pipeline信息
ITEM_PIPELINES = { # 前面是pipeline的类名地址 # 后面是优先级, 优先级月低越先执行 'mySpider_2.pipelines.Myspider2Pipeline': 300, }然后我们修改一下pipeline中的代码:
class Myspider2Pipeline: # 这个方法的声明不能动!!! 在spider返回的数据会自动的调用这里的process_item方法. # 你把它改了. 管道就断了 def process_item(self, item, spider): print(item) return item
自定义数据传输结构item
在上述案例中, 我们使用字典作为数据传递的载体, 但是如果数据量非常大. 由于字典的key是随意创建的. 极易出现问题, 此时再用字典就不合适了. Scrapy中提供item作为数据格式的声明位置. 我们可以在items.py文件提前定义好该爬虫在进行数据传输时的数据格式. 然后再写代码的时候就有了数据名称的依据了.
item.py文件
import scrapy
class GameItem(scrapy.Item):
# 定义数据结构
name = scrapy.Field()
category = scrapy.Field()
date = scrapy.Field()
class Person:
private String name;
private int age;
dic = {name: "alex", age: 18}
p = Person( "alex", 18)
spider中. 这样来使用:
from mySpider_2.items import GameItem
# 以下代码在spider中的parse替换掉原来的字典
item = GameItem()
item["name"] = name
item["category"] = category
item["date"] = date
yield item
scrapy使用小总结
至此, 我们对scrapy有了一个非常初步的了解和使用. 快速总结一下. scrapy框架的使用流程:
-
创建爬虫项目.
scrapy startproject xxx -
进入项目目录.
cd xxx -
创建爬虫
scrapy genspider 名称 抓取域 -
编写
item.py文件, 定义好数据item -
修改spider中的parse方法. 对返回的响应response对象进行解析. 返回item
-
在pipeline中对数据进行保存工作.
-
修改
settings.py文件, 将pipeline设置为生效, 并设置好优先级 -
启动爬虫
scrapy crawl 名称
浙公网安备 33010602011771号