在安装了一系列的插件之后,我们就要正式踏上虫虫的幸福征程了,那么我们就先从最简单的一个项目开始吧
学过编程语言的都知道一个项目就是在一个文件夹里有不同类型的文件,其发挥的作用的也不同,就像是在HTML和CSS中,一个里面是内容,一个里面是结构,这样的话就算是很多的代码,我们也能很快找个每个部分的问题,对于需要大量的代码的程序就是很好的选择
而要将一个网站装进爬虫需要4个步骤:
故我们分4大块来正式描述
window+r得到运行窗口,输入cmd得到exe窗口文件
输入
scrapy startproject 项目文件名
这里我的项目名称为Wechatproject
得到黄色框中,
cd Wechatproject
scrapy genspider example example.com
表示创建成功
我们可以直接在我们的exe文件中在原来基础上先输入
cd Wechatproject
再输入
tree Wechatproject
我们也可以在我们的路径中找到我们的文件夹Webchatproject,
其树状目录为:(我们在根目录中打开文件夹,可发现这些文件按均对应)
也可以直接将整个文件夹拖进我们的编辑器里面,得到如图所示的目录:
我们下面就介绍这些文件的作用
items是用来加载抓取内容的容器
创建一个 scrapy.Item 类, 并且定 义类型为 scrapy.Field 的类属性来定义一个Item。将需要爬取的内容与Field()定 义的属性对应
所需内容
代码
打开原有的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)
表明爬虫已经成功运行并且自行关闭了
我们可先试着分析一下
注意:(刚刚发生了啥捏)
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()
法二:
同样将Shell载入,并且将获得response回应存储在本地变量 response中
此时再输入
response.body
或
response.headers
可分别得到body部分(抓取到的页面)和head部分
由于Shell为我们准备好的selector对象,sel,可以根据返回的数据类型自动选择最佳的解析方案(XML or HTML)
在此之前,我们先来学习一下Xpath的一些路径表达式
表达式 | 描述 |
---|---|
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
. | 选取当前节点 |
… | 选取当前节点的父节点 |
@ | 选取属性 |
nodename | 选取此节点的所有子节点 |
e.g.
例子 | 描述 | |
---|---|---|
/html/head/title | 选择HTML文档 | |
/html/head/title/text() | 选择前面提到的 | |
//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'
嵌套及其扩展的内容可自行参看文档,学习更强大的使用方法
学到这,我们就可以学会将抓取到的数据放到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
该篇文章是参考了一位大神的博客,然后加上了自己的补充
原博客链接为:爬虫的一个简单项目
第七篇爬虫的scrapy框架的学习就到此结束啦!