python之爬虫scrapy框架开始一个小项目(七)

在安装了一系列的插件之后,我们就要正式踏上虫虫的幸福征程了,那么我们就先从最简单的一个项目开始吧

学过编程语言的都知道一个项目就是在一个文件夹里有不同类型的文件,其发挥的作用的也不同,就像是在HTML和CSS中,一个里面是内容,一个里面是结构,这样的话就算是很多的代码,我们也能很快找个每个部分的问题,对于需要大量的代码的程序就是很好的选择


而要将一个网站装进爬虫需要4个步骤:

  • 新建项目 (Project):新建一个新的爬虫项目
  • 明确目标(Items):明确你想要抓取的目标
  • 制作爬虫(Spider):制作爬虫开始爬取网页
  • 存储内容(Pipeline):设计管道存储爬取内容

故我们分4大块来正式描述


一、搭建项目
基本创建

window+r得到运行窗口,输入cmd得到exe窗口文件
输入
scrapy startproject 项目文件名
这里我的项目名称为Wechatproject
在这里插入图片描述
得到黄色框中,
cd Wechatproject
scrapy genspider example example.com
表示创建成功

查找目录

我们可以直接在我们的exe文件中在原来基础上先输入

   cd Wechatproject

再输入

 tree Wechatproject

即得到如图所示的目录
在这里插入图片描述

我们也可以在我们的路径中找到我们的文件夹Webchatproject,
其树状目录为:(我们在根目录中打开文件夹,可发现这些文件按均对应)
在这里插入图片描述
也可以直接将整个文件夹拖进我们的编辑器里面,得到如图所示的目录:
在这里插入图片描述

各文件作用

我们下面就介绍这些文件的作用

  • WeChatproject
    项目的Python模块,将会从这里引用代码
  • scrapy.cfg
    是整个项目的设置,主要用于部署scrapy的服务,一般不会涉及
  • items.py
    定义抓取结果中单个项所需要包含的所有内容。【目标】
  • piplines.py
    负责处理爬虫从网 页中抽取的实体,持久化实体、验证实体的有效 性、清除不需要的信息
  • settings.py
    是scrapy的设置文件,可对其行为进行调整。【设置】
  • spiders/
    存储爬虫的目录

二、明确目标

items是用来加载抓取内容的容器

创建一个 scrapy.Item 类, 并且定 义类型为 scrapy.Field 的类属性来定义一个Item。将需要爬取的内容与Field()定 义的属性对应

item模型

所需内容

  • 名称(name)
  • 链接(url)
  • 描述(description)

代码
打开原有的items.py文件,可观察到原来已经有class类了
在这里插入图片描述
可在后面添加自己的类即可

e.g.要抓取dmoz.org网站的内容,我们将其命名为DmozItem,要增加的类就为:

class DmozItem(Item):
    title = Field()
    link = Field()
    desc = Field()

但是我们使用了Field,我们就要修改一下import

from scrapy.item import Item, Field

看到这,我们可以把Item简单的理解成封装好的类对象,但是对于Items还是不是很明白,但当我们使用别的函数的时候,就会慢慢理解的


三、制作爬虫

即需要两步:先爬再取
就是我们前面提到过的基本思想,先得到整个网页的内容,再提取自己想要的部分

定义了用于下载的URL列表、跟踪链接的方案、解析网页内容的方式,以此来提取items

要编写第一个爬虫(Spider) ,必须创建一个继承 scrapy.Spider 的子类,且是用户自己编写的类,并且必须有三个属性:

  • name:爬虫的标识
    必须唯一,在不同的爬虫中必须定义不同的名字

  • start_urls:一个需要爬取的链接起始列表
    爬虫从这里开始抓取数据,故第一次下载的数据将会从这些urls开始。其他子URL将会从这些起始URL中继承性生成

  • parse():解析的方法
    调用的时候传入从每一个URL传回的Response对象作为唯一参数,负责解析并匹配抓取的数据(解析为item),跟踪更多的URL

我们现在就能开始写第一个爬虫程序啦!

由于在明确目标时我们已经确定要抓取dmoz.org网站的内容,故我们的搜索区域就确定了

首先新建一个文件为dmoz_spider.py,保存在spiders目录下

当然我们也可以直接在exe中
直接输入

scrapy genspider dmoz_spider

来产生我们期望的文件

import scrapy

class  DmozeSpider(scrapy.Spider):
	"""docstring for  DmozeSpider"""
	name = "dmoz"
	allowed_domains = ["domz.org"]
	#allow_domains是搜索的域名范围
	#也就是爬虫的约束区域
	#规定爬虫只爬取这个域名下的网页

	start_urls = [
		"http://www.domz.org/Computers/Programming/Languages/Python/Books/",
		"http://www.domz.org/Computers/Programming/Languages/Python/Resources/"
	]

	def parse(self, response):
		filename = response.url.split("/")[-2]
		#将链接的最后两个地址取出作为文件名进行存储
		open(filename, 'wb').write(response.body)

保存运行一下,没有报错
然后在原来的exe文件中输入

scrapy crawl dmoz

即如图所示以及其结果
在这里插入图片描述
且输出最后
INFO: Closing spider (finished)
表明爬虫已经成功运行并且自行关闭了
在这里插入图片描述
我们可先试着分析一下
在这里插入图片描述

  1. start_urls中定义的每个URL都有日志行
  2. 由于这些URL是起始页面,没有引用(referrers),所以在它们的每行末尾会看到 (referer: ‘None’)

注意:(刚刚发生了啥捏)
3. Scrapy为爬虫的start_urls属性中的每个url创建了一个scrapy.http.Request对象
4. 这些scrapy.http.Request被调度,执行
5. 通过爬虫的parse()方法作为回调函数
6. scapy.http.Response对象被返回
7. 结果也被反馈给爬虫

我们这里学习了两种方法:
法一:
通过 shell 来获取网页元素,再通过css选择器来选择所需的元素
法二:
使用一种叫做 XPath selectors的机制,它基于 XPath表达式,其官方文档为:不要小看我

在此之前,我们熟悉一下scrapy中的4种selectors方法

Selector对象展示了文档的节点结构,故第一个实例化的selector必与根节点或者是整个目录有关

方法返回值
xpath()返回一系列的selectors,每一个select表示一个xpath参数表达式选择的节点
css()返回一系列的selectors,每一个select表示一个css参数表达式选择的节点
extract()返回一个unicode字符串,为选中的数据
re()返回一串一个unicode字符串,为使用正则表达式抓取出来的内容

法一:
先在命令提示符exe里面输入

scrapy shell http://www.dmoz.org/Computers/Programming/Languages/Python/Books/

得到如下内容
在这里插入图片描述
而再输入下述内容,可得到其对应的结果
在这里插入图片描述
由于我的浏览器的问题,是由于这段网址无法打开,所以显示这个问题

response.css('title::text').extract_first()
  • title:标签,即我们需要的部分
  • extrac_first()
    相当于返回title中的第一个值,因为css返回的是一个列表

法二:
同样将Shell载入,并且将获得response回应存储在本地变量 response中
此时再输入

response.body
或
response.headers

可分别得到body部分(抓取到的页面)和head部分

由于Shell为我们准备好的selector对象,sel,可以根据返回的数据类型自动选择最佳的解析方案(XML or HTML)

在此之前,我们先来学习一下Xpath的一些路径表达式

表达式描述
/从根节点选取
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
.选取当前节点
选取当前节点的父节点
@选取属性
nodename选取此节点的所有子节点

e.g.

例子描述
/html/head/title选择HTML文档<head元素下面的<title 标签。
/html/head/title/text()选择前面提到的<title 元素下面的文本内容
//td选择所有 <td元素
//div[@class=“mine”]选择所有包含 class=“mine” 属性的div 标签元素

故我们可以输入

sel.xpath('//title')

但我的提示

 "sel" shortcut is deprecated. Use "response.xpath()", "response.css()" or "response.selector" instead

仍然和css的结果一样,也会报错403,故应该是我的浏览器问题,查看过官方文档,该表示方式并没有问题

当然我们就要真正提取有用的东西,即要利用Xpath和CSS

下面介绍XPath和CSS部分的提取部分的用法
该部分可参考文档:别点我

e.g.

>>> response.xpath('//span/text()').get()
'good'
>>> response.css('span::text').get()
'good'
>>> response.xpath('//title/text()')
[<Selector xpath='//title/text()' data='Example website'>]

实际提取文本数据

>>> response.css('title::text').get()
'Example website'
>>> response.xpath('//title/text()').getall()
['Example website']
>>> response.xpath('//title/text()').get()
'Example website'
  • .get()始终返回单个结果
    如果有多个匹配,则返回第一个匹配的内容;如果没有匹配,则不返回任何匹配。
  • .getall()返回包含所有结果的列表。

嵌套及其扩展的内容可自行参看文档,学习更强大的使用方法

学到这,我们就可以学会将抓取到的数据放到Items里面去了

首先了解一下
e.g.
sel.xpath(’//ul/li/a/text()’).extract()
将获取网站标题

sel.xpath(’//ul/li/a/@href’).extract()
将获取网站超链接
故我们的parse内部的内容,链接,描述均有对应的实体了

开始修改代码
加上import

from webchatproject.items import DmozItem

改变parse内部即可,但是xpath中应为我们实际所找的信息的所有标签,故根据实际情况来修改
在这里插入图片描述
保存运行这部分不报错之后我们就可以在命令符窗口输入

scrapy crawl dmoz

得到我们期望爬取的东西

注意:
在执行上面的这些命令之前,我们的命令提示符窗口如果关闭,需要重新进入我们的目录,即重新输入下述,再操作即可

scrapy shell http://www.dmoz.org/Computers/Programming/Languages/Python/Books/
四、存储内容

即将结果导出保存,有4种JSON,JSON lines,CSV,XML

以最常用的json格式为例:

scrapy crawl dmoz -o items.json -t json
  • -o 后面是导出文件名
  • -t 后面是导出类型

该篇文章是参考了一位大神的博客,然后加上了自己的补充
原博客链接为:爬虫的一个简单项目

第七篇爬虫的scrapy框架的学习就到此结束啦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值