腊月的季节

scrapy爬虫技术一

编写我的第一个爬虫

1、创建项目
创建项目之前,博主想唠叨一下,不管你是在windows编程还是在linux编程,命令都是离不开的,所以scrapy有大量的命令要记,而且scrapy这个框架应用了大量的回调和继承父类并重写部分方法达到整个框架的运行,当然这是博主的理解。所以想要学好scrapy,就一定要对回调这种机制,继承并重写父类属性方法要有充分的理解。

1
$ scrapy startproject tutorial

scrapy startproject 项目名称。
该命令将会创建包含下列内容的tutorial(也就是项目名称)

1
2
3
4
5
6
7
8
9
10
tutorial/
scrapy.cfg
tutorial/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
...

说一下这些文件的用处吧!

  • scrapy.cfg:项目的配置文件
  • tutorial/:该项目的python模块。之后您将在此加入代码。
  • tutorial/items.py:该项目的item文件。
  • tutorial/pipelines.py:项目中的pipelines文件。
  • tutorial/settings.py:项目中的设置文件。
  • tutorial/spiders:放置spider代码的目录。
    2、定义Item
    Item是保存爬取到的数据的容器。它的使用方法跟python的字典是一样一样的,而且提供了额外保护机制来避免拼写错误导致的未定义字段错误。
    类似在ORM中做的一样,您可以通过创建一个scrapy.Item类,并且定义类型为scrapy.Field的类属性来定义一个Item。
    首先我们要决定爬取哪个网站,拿到他的域名。然后我们就针对dmoz.org吧,这个跟官网一样。
    我们先想好要从这个网站获取title,link,description,然后我们就可以开始编辑tutorial目录中的items.py文件。
    1
    2
    3
    4
    5
    6
    import scrapy

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

我们写了一个继承了scrapy.Item类的DmozItem类,然后用了scrapy.Field()方法分别创建了类属性title,link,desc。我的理解是scrapy.Field()方法要用到scrapy.Item这个类。所以要继承这个类。
我们定义好了数据字典,肯定要去拿数据了。
3、编写爬虫Spider
Spider是用户编写用于从单个网站(或者一些网站)爬取数据的类。
官网是先说明在写的代码,我的风格是先贴代码,再按照我的理解来说。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import scrapy

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

def parse(self, response):
filename = response.url.split("/")[-2]
with open(filename, 'wb') as f:
f.write(response.body)

可以看到我们导入了一个scrapy包
我们让DmozSpider继承了scrapy包下的Spider类,我在之前说了,应用scrapy的核心之一就是继承父类并重写父类的属性和方法,现在就开始吧!
先说一下属性的含义吧!

  • name:用于区别Spider。该名字必须是唯一的,您不可以为不同的Spider设定相同的名字。
  • start_urls:包含了spider在启动时进行爬取的url列表。因此,第一个被获取到的页面将是其中之一。后续的URL则从初始的URL获取到的数据中提取。
  • parse()是spider的一个放法。被调用时,每个初始URL完成下载后生成的Response对象将会作为唯一的参数传递给该函数。该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的request对象。
    说了这么多,还有不明白的,我来进一步说吧!
    首先我们重写Spider这个父类的name属性,这个属性就是你的spider的标识符。
    allowed_domains是你允许爬取的域名。
    start_urls是一个数组,是你需要爬取的地址。
    parse(self,response)是一个回调函数,他最终会接受一个response对象,这个包含了网页的所有内容。
    3、那么基本第一个爬虫我们已经搭建好了,接下来就应该开始爬了。
    同样还是命令,回到项目的根目录,有scrapy.cfg的就是项目的根目录。执行下列命令:
    1
    $ scrapy crawl dmoz

就这样你的爬虫就运行起来,也就是你的爬虫的helloworld。
4、说说这整个的详细过程吧
Scrapy为Spider的start_urls属性中的每个URL创建了scrapy.Request对象,并将parse方法作为回调函数赋值给了Request。
那么最终真正执行的是含有Request的方法,你写的都是配置文件,呜呜。
Request对象经过调度,执行生成scrapy.http.Response对象并送回给你写的Spider parse()方法。其实也就是你重写后的方法,现在是不是感觉你写的有点用了。
这样你应该了解你做了什么吧!

热评文章