pyhton爬虫学习(十四):scrapy简单实例的创建和运行

接下来我主要通过一个具体的scrapy实例具体讲解scrapy框架的创建和运行过程。

首先,使用scrapy startproject hello创建一个hello的scrapy爬虫项目。

此时会生成一个名为hello的文件夹。该文件夹下拥有一个同名的子文件和一个scrapy.cfg的文件。该同名子文件下放置的是爬虫项目的核心代码,scrapy.cfg主要是爬虫项目的配置文件。

这个我使用PyCharm编辑器打开工程文件,工程结构目录如下:

在这里插入图片描述
init.py: 爬虫项目的初始化文件,用来对项目做初始化工作。

items.py: 爬虫项目的数据容器文件,用来定义要获取的数据。

pipelines.py: 爬虫项目的管道文件,用来对items中的数据进行进一步的加工处理。

settings.py: 爬虫项目的设置文件,包含了爬虫项目的设置信息。

middlewares.py: 爬虫项目的中间件文件

spiders文件夹下面放置的是爬虫项目中的爬虫部分相关的文件。文件夹下的__init__.py是爬虫项目中爬虫部分的初始化文件,主要对spiders进行初始化。

通过cd命令进入该爬虫项目的目录,通过命令可以实现对该爬虫项目的管理。

通过scrapy startproject创建的项目文件,spiders文件夹里面是没有爬虫文件的,需要通过genspider命令创建一个爬虫文件,然后对该爬虫文件进行相应的修改和编写。

以下为命令行操作:

cd hello  #进入项目文件
scrapy list  #查看爬虫列表,可以发现为空。
scrapy genspider -l  #查看当前可以使用的爬虫模版
$ scrapy genspider -l
Available templates:
		basic
		crawl
		csvfeed
		xmlfeed

可以看到当前可以使用的爬虫模版有basic、crawl、csvfeed、xmlfeed。

可以基于其中任意一种爬虫模版生成一个爬虫文件,比如可以使用basic模版生成一个爬虫文件,命令格式:
scrapy genspider -t 模版名 新爬虫名 爬取的域名

比如我现在要爬取百度首页,创建一个爬虫文件

$ scrapy genspider -t basic baiduSpider baidu.com
Created spider  'baiduSpider' using template 'basic' in module:
hello.spiders.baiduSpider
$ scrapy list 
baiduSpider

通过scrapy list命令,可以查询到此时已经有一个爬虫文件存在了。此时可以发现工程目录spiders文件夹下面也多了一个baiduSpider.py的爬虫文件。内容如下:

# -*- coding: utf-8 -*-
import scrapy
class BaiduspiderSpider(scrapy.Spider):
    name = 'baiduSpider'
    allowed_domains = ['baidu.com']
    start_urls = ['http://baidu.com/']
    def parse(self, response):
        pass

上面的代码可以看到,爬虫文件中需要导入scrapy模块,然后创建一个爬虫类BaiduspiderSpider,该类继承了scrapy.Spider基类。name的属性值为”baiduSpider”,该属性代表的是爬虫名称,所以此时爬虫名称为”baiduSpider”。

Allowed_domains属性代表的是允许爬行的域名,如果启动了OffsiteMiddleware,非允许的域名对应的网址则会被自动过滤,不在跟进。这里我们设置的允许的域名为”baidu.com”。
Start_urls属性代码爬行的起始网址,如果没有特别指定需要爬取的网址,就会从该属性中定义的网址开始爬行,注意到该属性是一个数组,也就是可以有多个网址,即逗号隔开。

几个方法简介:

parse(): 处理scrapy爬虫爬行到的网页响应的默认方法,可以响应进行处理并返回处理后的数据,同时该方法也可以负责链接的跟进。

start_requests(): 该方法会默认读取start_urls属性(可以自定义)中定义的网址,为每个网址生成一个Request请求对象,并返回可迭代对象。

make_requests_from_url(url): 会被start_requests()调用,负责实现生成Request请求。

closed(reason): 关闭spider时,该方法会被调用。
log(message[,level,component]): 实现在spider中添加log
** init(): ** 实现爬虫的初始化,为构造函数。

先简单走一个流程,在items.py里面添加一个title的字段,主要是获取百度地址的标题

class HelloItem(scrapy.Item):
    # define the fields for your item here like:
    title = scrapy.Field()

然后编辑baiduSpider.py,如下

class BaiduspiderSpider(scrapy.Spider):
    name = 'baiduSpider'
    allowed_domains = ['baidu.com']
    start_urls = ['http://baidu.com/']
    def parse(self, response):
        item = HelloItem()
        item["title"] = response.xpath("/html/head/title/text()")
        print(item["title"])

xpath可以自行百度了解以下。然后通过命令运行爬虫baiduSpider。

$ scrapy crawl baiduSpider --nolog
['/html/head/title/text()' data='百度一下,你就知道'>]

注:setting文件里面的ROBOTSTXT_OBEY = True需要改成False。否则可能打印不出日志。
通俗来说, robots.txt 是遵循 Robot协议 的一个文件,它保存在网站的服务器中,它的作用是,告诉搜索引擎爬虫,本网站哪些目录下的网页 不希望 你进行爬取收录。在Scrapy启动后,会在第一时间访问网站的 robots.txt 文件,然后决定该网站的爬取范围。当然,我们并不是在做搜索引擎,而且在某些情况下我们想要获取的内容恰恰是被 robots.txt 所禁止访问的。所以,某些时候,我们就要将此配置项设置为 False ,拒绝遵守 Robot协议 !

如果不想用默认的start_urls的起始网址属性,也可以用其他的,需要通过重写start_requests()方法来实现。将上面的代码改为如下,运行。

class BaiduspiderSpider(scrapy.Spider):
    name = 'baiduSpider'
    allowed_domains = ['baidu.com']
    start_urls = ['http://www.sina.com/']
    url = 'http://www.baidu.com/'
    def start_requests(self):
        yield self.make_requests_from_url(self.url)

    def parse(self, response):
        item = HelloItem()
        item["title"] = response.xpath("/html/head/title/text()")
        print(item["title"])

我将start_urls改成新浪的网址,url为一个百度的网址。然后在start_requests方法里面用make_requests_from_url调用百度地址url。
运行结果如下

$ scrapy crawl baiduSpider --nolog
['/html/head/title/text()' data='百度一下,你就知道'>]

可以看到这个时候网址没有从start_urls取了,而是爬取了url里面的网址。
同样,spider类中的其他方法,如果有需要我们也可以重写。

xpath基础
在网络爬虫中经常会用XPath表达是进行数据的筛选和提取。xpath是一种xml路径语言,可以在xml文档中迅速的查到响应的信息。
在xpath表达式中,可以使用”/”选择某个标签,并且通过“/”进行多层标签的查找。

比如如下:

<head><title>首页</title></head>
<body>
<h2>哈哈</h2>
<p>你好</p>
<p>我是</p>
<p>你是哪里人</p>
<div class=”page”> nihao </div>
</body>
</html>
  • 获取标签对应的内容,可以使用”/”选用某个标签
    xpath表达式 “/html/body/h2”

  • 想获取该标签的文本信息
    xpath表达式 “/html/body/h2/text()”

使用“//”可以提取某个标签的所有信息。如上方出现多个p标签。
xpath表达式 “//p” ,该表达式可以获取所有p标签对应的内容组成的数组。如果想获取所有属性x的值为y的标签内容,可以通过//z[@x=”y”]的方式获取。如上图的有属性的标签可以这样获取//div[@class=”page”]

以上就是xpath表达式的基础内容。其实有时候也可以直接在浏览器直接进行获取。比如谷歌浏览器,可以右键,检测调出调试的界面,在代码位置右键,即可以选择copy对应的xpath表达式代码,非常方便快捷。

欢迎关注本人公众号和小程序,谢谢
在这里插入图片描述

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值