自动采集编写(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=&#39;li_txt&#39;]"): # 将我们得到的数据封装到一个 `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[&#39;name&#39;] = name[0] item[&#39;title&#39;] = title[0] item[&#39;info&#39;] = 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=&#39;li_txt&#39;]"):

# 将我们得到的数据封装到一个 `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[&#39;name&#39;] = name[0]

item[&#39;title&#39;] = title[0]

item[&#39;info&#39;] = 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(&#39;//title&#39;)

[

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线