自动采集编写(Scrapy框架Scrapy架构图)
优采云 发布时间: 2022-04-18 14:20自动采集编写(Scrapy框架Scrapy架构图)
Scrapy 框架 Scrapy 架构图(绿线为数据流向):
Scrapy 的工作原理
代码写好了,程序开始运行了……
发动机:嗨!蜘蛛,你在对付哪个网站?
蜘蛛:老板要我处理。
引擎:给我第一个需要处理的 URL。
Spider:在这里,第一个 URL 是。
发动机:嗨!调度员,我有一个请求,请求您帮我排序并加入队列。
调度程序:好的,正在处理您等一下。
发动机:嗨!调度员,给我你处理的请求。
调度器:给你,这是我处理的请求
发动机:嗨!下载者,请帮我按照老板下载中间件的设置下载这个请求
下载者:好的!给你,这是下载的东西。(如果失败:sorry,这个请求下载失败。然后引擎告诉调度器这个请求下载失败,你记录一下,我们稍后下载)
发动机:嗨!蜘蛛,这是一个下载的东西,已经按照老大的下载中间件进行了处理,你可以自己处理(注意!这里的响应默认由def parse()函数处理)
蜘蛛:(处理数据后需要跟进的URL),嗨!Engine,我这里有两个结果,这是我需要跟进的URL,这是我得到的Item数据。
发动机:嗨!我这里有一件物品,请帮我处理!调度器!这个是需要你跟进的网址帮我处理的。然后从第四步开始循环,直到得到boss需要的所有信息。
Pipes ``调度器:好的,现在就做!
注意!只有当调度器中没有请求时,整个程序才会停止,(即对于下载失败的URL,Scrapy也会重新下载。)
制作一个Scrapy爬虫一共需要4步: Scrapy安装介绍
Scrapy框架官网:
Scrapy中文维护网站:
Windows安装方式Ubuntu需要9.10以上的安装方式
安装完成后,只要在命令终端输入scrapy,就会出现类似如下的结果,说明已经安装成功
具体Scrapy安装过程参考:每个平台都有安装方法
入门案例学习目标一. 新项目(scrapy startproject)
scrapy startproject mySpider
下面简单介绍一下各个主文件的作用:
scrapy.cfg :项目的配置文件
mySpider/ :项目的 Python 模块,将从中引用代码
mySpider/items.py :项目的目标文件
mySpider/pipelines.py :项目的管道文件
mySpider/settings.py :项目的设置文件
mySpider/spiders/ : 蜘蛛代码存放的目录
信息。
打开 mySpider 目录下的 items.py
Item 定义了一个结构化的数据字段来保存爬取的数据,有点像 Python 中的 dict,但提供了一些额外的保护来减少错误。
可以通过创建一个scrapy.Item类并定义一个scrapy.Field类型的类属性来定义一个Item(可以理解为一种类似于ORM的映射关系)。
接下来,创建一个 ItcastItem 类,并构建项目模型。
import scrapy
class ItcastItem(scrapy.Item):
name = scrapy.Field()
level = scrapy.Field()
info = scrapy.Field()
三、制作蜘蛛 (spiders/itcastSpider.py)
爬虫功能分为两步:
1. 爬取数据
scrapy genspider itcast "itcast.cn"
import scrapy
class ItcastSpider(scrapy.Spider):
name = "itcast"
allowed_domains = ["itcast.cn"]
start_urls = (
'http://www.itcast.cn/',
)
def parse(self, response):
pass
其实我们也可以自己创建itcast.py,写上面的代码,不过使用命令可以省去写固定代码的麻烦
要创建 Spider,您必须继承 scrapy.Spider 类并定义三个强制属性和一个方法。
将start_urls的值改为第一个要爬取的url
start_urls = ("http://www.itcast.cn/channel/teacher.shtml",)
修改 parse() 方法
def parse(self, response):
filename = "teacher.html"
open(filename, 'w').write(response.body)
然后运行看看,在mySpider目录下执行:
scrapy crawl itcast
是的,它是itcast。看上面代码,是ItcastSpider类的name属性,是唯一使用scrapy genspider命令的爬虫名称。
运行后,如果打印日志显示[scrapy] INFO: Spider closed (finished),则表示执行完成。之后,当前文件夹中出现了一个teacher.html文件,里面收录了我们刚要抓取的网页的所有源码信息。
# 注意,Python2.x默认编码环境是ASCII,当和取回的数据编码格式不一致时,可能会造成乱码;
# 我们可以指定保存内容的编码格式,一般情况下,我们可以在代码最上方添加:
import sys
reload(sys)
sys.setdefaultencoding("utf-8")<br /><br /># 这三行代码是Python2.x里解决中文编码的*敏*感*词*,经过这么多年的吐槽后Python3学乖了,默认编码是Unicode了...(祝大家早日拥抱Python3)
2. 获取数据
xxx
xxxxx
xxxxxxxx
是不是一目了然?只需转到 XPath 并开始提取数据。
from mySpider.items import ItcastItem
from mySpider.items import ItcastItem
def parse(self, response): #open("teacher.html","wb").write(response.body).close() # 存放老师信息的集合 items = [] for each in response.xpath("//div[@class='li_txt']"): # 将我们得到的数据封装到一个 `ItcastItem` 对象 item = ItcastItem() #extract()方法返回的都是unicode字符串 name = each.xpath("h3/text()").extract() title = each.xpath("h4/text()").extract() info = each.xpath("p/text()").extract() #xpath返回的是包含一个元素的列表 item['name'] = name[0] item['title'] = title[0] item['info'] = info[0] items.append(item) # 直接返回最后数据 return items
保存数据有四种最简单的方法scrapy保存信息,-o输出指定格式的文件,命令如下:
# json格式,默认为Unicode编码
scrapy crawl itcast -o teachers.json
# json lines格式,默认为Unicode编码
scrapy crawl itcast -o teachers.jsonl
# csv 逗号表达式,可用Excel打开
scrapy crawl itcast -o teachers.csv
# xml格式
scrapy crawl itcast -o teachers.xml
想想如果把代码改成下面的形式,结果是完全一样的。考虑产量在这里的作用:
from mySpider.items import ItcastItem
def parse(self, response):
#open("teacher.html","wb").write(response.body).close()
# 存放老师信息的集合
#items = []
for each in response.xpath("//div[@class='li_txt']"):
# 将我们得到的数据封装到一个 `ItcastItem` 对象
item = ItcastItem()
#extract()方法返回的都是unicode字符串
name = each.xpath("h3/text()").extract()
title = each.xpath("h4/text()").extract()
info = each.xpath("p/text()").extract()
#xpath返回的是包含一个元素的列表
item['name'] = name[0]
item['title'] = title[0]
item['info'] = info[0]
#items.append(item)
#将获取的数据交给pipelines
yield item
# 返回数据,不经过pipeline
#return items
废壳
Scrapy 终端是一个交互式终端。我们可以在不启动蜘蛛的情况下尝试调试代码。它还可以用于测试 XPath 或 CSS 表达式,了解它们是如何工作的,并促进从我们抓取的网页中提取数据。
如果安装了 IPython,Scrapy 终端将使用 IPython(代替标准 Python 终端)。IPython 终端比其他终端更强大,提供智能自动完成、突出显示和其他功能。(推荐安装IPython)
启动 Scrapy Shell
进入项目根目录,执行以下命令启动shell:
scrapy shell "http://www.itcast.cn/channel/teacher.shtml"
Scrapy Shell 会根据下载的页面自动创建一些方便的对象,例如 Response 对象,Selector 对象(用于 HTML 和 XML 内容)。
Selectors 选择器 Scrapy Selectors 内置 XPath 和 CSS 选择器表达式机制
Selector有四种基本方法,最常用的是xpath:
XPath 表达式及其对应含义的示例:
/html/head/title: 选择文档中 标签内的 元素
/html/head/title/text(): 选择上面提到的 元素的文字
//td: 选择所有的 元素
//div[@class="mine"]: 选择所有具有 class="mine" 属性的 div 元素
试试选择器
我们以腾讯招聘的网站为例:
<p># 启动
scrapy shell "http://hr.tencent.com/position.php?&start=0#a"
# 返回 xpath选择器对象列表
response.xpath('//title')
[