【Scrapy02】第一个例子

在上一篇文章中,笔者已经搭建好了Scrapy框架,那么本文的主要目的是记录Scrapy框架的简单使用,也就是第一个例子。

注意:上文用到的最新的python3.7和Twisted中的一个函数存在冲突,属于版本问题,目前还没有较好的解决办法(存在一个解决办法,但是觉得不太合适),所以在此处更正,建议使用python3.6,重新搭建环境,除了下载python版本有变化,其余步骤都没有区别。

在本文中,我们将看到如何爬取CSDN博客首页(https://www.csdn.net/)的文章的信息,具体内容为标题,详细页面的链接。无论是使用Scrapy框架,BS4,或者其他的种种跟爬虫有关的东西,都可以很轻松地达到我们的目的。如果你对Scrapy框架已经有一些了解,可以直接跳过这篇文章。

一,目标页面的结构

当我们需要爬取某个站点的数据时,无论你使用怎样的爬虫手段,优先要做的事情是要确定网站的结构,确定你想要的数据处在网站的哪个位置,具体在那个标签下面。

这个标签既是特殊的,也是通用的。

特殊在于,它可以区分它所包含的某类型的数据与其他类型的数据不同。

通用在于,该标签能标出当前页面所有的该类型的数据。

这种解释,不够清晰,举个例子(查看网页元素):

通过上图可以看出,进入文章详细页面,CSDN博客首页的每一条文章信息的详细访问链接基本上都在“<div class=”title”>的“<a>”标签中,而<div class=”title”>的“<a>”标签中也不可能识别到别的数据。

解释起来有一种故弄玄虚的感觉,实际操作时,只需要看一眼,试一试,基本上就会很清晰。

二,spiders

创建一个项目,打开终端,你可以进入你想要的目录,此处我直接将项目新建到我的桌面上。

进入桌面:

cd Desktop

创建一个Scrapy项目:

scrapy  startproject demo01

值得注意的是,为了让读者更关注Scrapy本身,我不在使用上一篇文章提到的pycharm,使用记事本去编写脚本,已经足够了。

打开项目文件夹可以看到里面的结构。

demo01/

    scrapy.cfg

    demo01/

        __init__.py

        items.py

        pipelines.py

        settings.py

        spiders/

            __init__.py

     如果是初次使用scrapy框架,对这些文件夹和文件自然是十分陌生的,不明白他们的来历和用途,即使想利用Scrapy框架写一个最简单的爬虫,也会无从下手。

索性我们暂时不去了解他们的用途,毕竟这是第一个例子,绝大部分还用不到,笔者会在以后的文章中,逐一解析。如果想提前学习,可以查看http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutorial.html

Spider意为蜘蛛,可见我们所写的爬虫都将在这个文件夹获得统一的管理,所以,在该文件夹下,新建第一个爬虫01.py

在编写代码之前,需要确定几个问题:1,爬虫叫什么名字?(demo01吗?不对,那是项目的名字,一个项目可以有多个爬虫);2,爬取的链接是哪个;3,爬取哪些内容。

在本例中以上三个问题的答案是:
1,名字:name=‘01’

2,起始链接:start_urls=‘https://blog.csdn.net/’

3,解析内容(统一放在一个函数里):def parse()

于是,编辑01.py,首先导入scrapy,然后自定义爬虫继承爬虫基类scrapy.Spider。

#coding=utf-8

import scrapy


class myspider01(scrapy.Spider):

    name='01'

    start_urls=['https://blog.csdn.net/']

    def parse(self,response):

        print('正在解析!'+response.url)

        title=response.selector.xpath('//div[@class="title"]//h2//a/text()').extract()

        href=response.selector.xpath('//div[@class="title"]//h2//a/@href').extract()

        print('题名:',title)

        print('详细链接:',href)    

可以看到,在我们继承爬虫基类,自定义的爬虫中,主要回答了上述三个问题,另外:

  1. 起始地址:start_urls是一个列表,意味着,我们可以在里面放多个链接。
  2. 在解析函数中,接收了response参数,并且利用response的selector解析出了我们想要的内容。

在运行爬虫之前,还需要解决两个问题:

  1. 因为是用文本写的,首先要改变文本文件的编码,单击文件-》另存为,保存为utf-8

  1. 找到demo01文件夹下的setting.py文件,将ROBOTSTXT_OBEY设置为False。

 

然后我们就可以运行这个爬虫了。进入demo01项目的根目录,执行命令

scrapy crawl 01

打印结果显示

一直到此处,想必心中已经积攒了不少的疑问,我做了哪些事情,scrapy又做了些什么。

笔者将在下篇文章中一一解析,本文的目的只是给出一个简单的例子,能有一个初步的认识,最好在看完下一小节关于xpath的使用之后,写几个雷同的爬虫去抓一抓其他的新闻网站。

 

三Xpath

在上一小节中,从response中解析出了想要的内容。Selector为response的选择器,在该选择器中有多种方式去解析得到的页面,此处使用的是xpath。关于xpath的用法有很多,本小节只记录了常用的几种用法,以01.py为例。

1,简单的理解为:’//’用来选择一个节点,’[]’判断条件,‘@’用来表示一个属性,‘/’获取该对象的值。在上图中,要拿到标题的话,显而易见:class为title的div标签中的h2标签中的a标签的文本。

写下来就是:’//div[@class=”title”]//h2//a/text()’

去除标签的纯文本的值:text()

2,同上,如果要获得属性的值就要‘/@属性名’,在上述例子中就是:

‘//div[@class=”title”]//h2//a/@href’

3,还有一种比较常用的方式就是contains,用在判断条件中,假设div标签改为<div class=’first title’>。那么div的判断条件就可以写成’//div[contains(@title,”title”)]//h2//a/@href’

解释起来就是:class属性值中包含“title”字段的div标签中的h2标签中的a标签的链接。

 

注意:某些情况下,a标签包含的不是完整的url,那么如果使用‘//a/@href‘,会报错。那么直接使用‘//a’,不去指定属性值即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值