python新手实践1——使用scrapy爬取dmoz目录

本文参考借鉴scrapy官方教程和小甲鱼python教程

之前安装好了scrapy,现在开始试着进行一个小任务:

爬取dmoz上的一个网页:

'http://www.dmoztools.net/Computers/Programming/Languages/Python/Books/' 'http://www.dmoztools.net/Computers/Programming/Languages/Python/Resources/

Scarpy爬取网站的四个步骤:

1 创建Scarpy项目
2 定义Item容器
3 编写爬虫
4 存储内容

Scarpy框架

第一步:创建创建Scarpy项目

在cmd中输入:
scrapy startproject SpiderNO1

输入后的结果

此时桌面生成一个文件夹
spider文件夹

其中scrapy.cfg为项目配置文件,默认保存即可;

(1)子文件夹SpiderNO1中存放着模块的代码
(2)SpiderNO1 /: 项目python模块, 之后您将在此加入代码
(3)SpiderNO1 /items.py: 项目items文件
(4)SpiderNO1 /pipelines.py: 项目管道文件
(5)SpiderNO1 /settings.py: 项目配置文件
(6)SpiderNO1 /spiders: 放置spider的目录

第二步:定义Item容器

  • Item是保存爬取到的内容的容器,其使用方法和python字典类似,并且提供了额外的保护机制来避免拼写错误导致的未定义字段错误。
  • 然后是对自己需要的数据进行建模。编辑SpiderNO1中的items.py
class DmozItem(scrapy.Item):
    # define the fields for your item here like:
        # name = scrapy.Field()
        title = scrapy.Field()   #标题
        link = scrapy.Field()    #链接
        desc = scrapy.Field()    #描述

保存关闭

第三步:编写爬虫

  • 编写Spider,Spider是用户编写用于从网站上爬取数据的类,其中包含用于下载的初始URL,然后是如何跟进网页中的链接以及如何分析页面中的内容,还有提取item的方法。
  • 创建一个名为“dmoz_spider.py”的文件
import scrapy

class DmozSpider(scrapy.Spider):
    name = "dmoz"                   #蜘蛛编号,唯一
    allowed_domains = [' http://www.dmoztools.net']     #蜘蛛爬取的范围          
    start_urls = ['http://www.dmoztools.net/Computers/Programming/Languages/Python/Books/',
 'http://www.dmoztools.net/Computers/Programming/Languages/Python/Resources/']  #爬取网址

    def parse(self,response):           #定义分析方法
        filename = response.url.split("/")[-2]
        with open(filename,'wb') as f:
            f.write(response.body)

接下来试一试蜘蛛能不能正常工作:
在cmd中进入工程SpiderNO1文件夹,输入命令scrapy crawl dmoz
我这里出了问题,报错

缺少win32api

ModuleNotFoundError:No module named ‘win32api’

只需要用pip安装一下 pypiwin32即可

安装pypiwin32

...


安装过程

出现

安装结果

并且同时在项目文件夹中产生了

生成了网页代码

两个文件,打开后发现是两个网页的审查元素代码。
以上就是“爬”的过程
之后就是从上面生成的Books文件和Resources文件中找出title、link、desc然后分别保存起来。
提取过程使用一种基于XPath和CSS的表达式机制:Scrapy Selectors。
Selectors是一个选择器,它有四个基本方法:

(1) xpath()——传入xpath表达式,返回该表达式所对应的所有节点的selector list列表。
(2) css()——传入CSS表达式,返回该表达式所对应的所有节点的selector list列表。
(3) extract()——序列化该节点为unicode字符串并返回list
(4) re()——根据传入的正则表达式对数据进行提取,返回unicode字符串list列表

在cmd中进入根文件夹,运行指令
scrapy shell “http://www.dmoztools.net/Computers/Programming/Languages/Python/Books/”
结果为以下代码

shell

此时就得到了response的回应,就可以通过shell对其进行操作,如response.body就是全部网页的代码,response.headers就是网页的头,接下来通过selector选择器,对body中的内容进行分析提取,将用到

response.selector.xpath()
response.selector.css()
response.selector.extract()
response.selector.re
()这四个方法

XPath

XPath是一门在网页中查找特定信息的语言,用它来筛选数据更准确方便高效。
/html/head/title——选择HTML文档中<head>标签内的<title>元素。
/html/head/title/text()——选择上面提到的<title>元素的文字
//td——选择所有的<td>元素。
//div[@class=“mine”]——选择所有具有class=“mine”属性的div元素
在cmd中继续输入
response.xpath(‘//title’)
返回一个selector对象的列表

返回selector

使用
response.xpath(‘//title’).extract()将列表字符串化

列表字符串化

不想要(title)的标签,就加入/text()就可以,即
response.xpath('//title/text()').extract()

第四步:提取数据

1、 由网页审查元素可知,

F12审查元素

我们要提取的所有信息全都在在class=“title-and-desc”的标签中,描述在其/div中,链接在a标签href中,标题在a标签的div中。
标题:在shell中输入
response.xpath('//div[@class=" title-and-desc"]/a/div/text()').extract()
得到所有的标题,如下图(sel.xpath也可以得到下图)

标题信息

描述:在shell中输入
response.xpath(‘//div[@class=” title-and-desc ”]/div/text()’).extract()
得到所有的描述,如下图(sel.xpath也可以得到下图)

描述信息


链接:在shell中输入
response.xpath(‘//div[@class=”title-and-desc”]//a/@href’).extract()
得到所有的链接,如下图(sel.xpath也可以得到下图),提取a标签下的href标签需要使用@href

链接信息

使用for循环依次打印title

sites = sel.xpath(‘//div[@class=”title-and-desc”]’)
for site in sites:
        title = site.xpath(‘a/div/text()’) .extract()
link = site.xpath(‘a/@href’) .extract()
        desc = site.xpath(‘div/text()’) .extract()
        print(title,link,desc)

有效信息提取成功

验证成功,把它放回dmoz_spider.py的parse()方法

def parse(self,response):
    sel = scrapy.selector.Selector(response) #shell帮我们初始化好sel,这里我们需要自己将其初始化
    sites = sel.xpath('//div[@class="title-and-desc"]')
    for site in sites:
        title = site.xpath('a/div/text()').extract()
        link = site.xpath('a/@href').extract()
        desc = site.xpath('div/text()').extract()
    print(title,link,desc)

在cmd中运行scrapy crawl dmoz
如果报错

错误信息

把循环体内的语句空格删掉,重新换行即可
正常运行结果(部分运行图):

正常运行结果(部分运行图)

可见我们需要的东西全部找出来了。

第五步:存储最后的结果

使用之前提到的item容器,将爬取的结果进行存储。
Spider代码为:

import scrapy

from SpiderNO1.items import DmozItem
#导入items

class DmozSpider(scrapy.Spider):
    name = "dmoz"
    allowed_domains = ['www.dmoztools.net']
    start_urls = ['http://www.dmoztools.net/Computers/Programming/Languages/Python/Books/'
               ,'http://www.dmoztools.net/Computers/Programming/Languages/Python/Resources/']

    def parse(self,response):
        #shell帮我们初始化好sel,这里我们需要自己将其初始化
        sel = scrapy.selector.Selector(response)
        sites = sel.xpath('//div[@class="title-and-desc"]')
        items = []
        for site in sites:
            item = DmozItem()
            item['title'] = site.xpath('a/div/text()').extract()
            item['link'] = site.xpath('a/@href').extract()
            item['desc'] = site.xpath('div/text()').extract()
            items.append(item)
        return items

在cmd中使用
scrapy crawl dmoz –o items.json –t json
导出JSON格式文件
-o后面是文件名 –t指定导出类型
之后在根目录下就会出现items.json的文件

生成了json文件
文件详情

至此一个简单的爬虫就结束啦!

本博客所有文章均为作者原创,享有版权所有权,未经许可,严禁转载或修改!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • scrapy学习笔记(有示例版) 我的博客 scrapy学习笔记1.使用scrapy1.1创建工程1.2创建爬虫模...
    陈思煜阅读 12,653评论 4 46
  • 此环节是在MAC OS中进行搭建 安装scrapy pip install scrapy即可快速完成安装 创建项目...
    abeb6ca9bb86阅读 606评论 0 2
  • 这两天摸索了下scrapy,刚看文档的时候觉得有点生无可恋,scrapy框架个人还是觉得比较难懂的,需要学习的地方...
    Treehl阅读 5,623评论 7 10
  • 长久的黑暗,终于,光明咬破黑暗的唇,朝阳如血,普照朗朗乾坤。 唐明眯着双眼,张开双臂向四周摸去。...
    Bethebestone阅读 159评论 0 0
  • 今天开始,身体上算是比较轻松了(小宝断奶到今晚为止,才没有那么闹了),精神上还要绷紧起来,因为眼看着孩子们期末考试...
    张子洋妈妈阅读 106评论 0 0