码迷,mamicode.com
首页 > 编程语言 > 详细

Python爬虫

时间:2016-05-10 23:23:28      阅读:313      评论:0      收藏:0      [点我收藏+]

标签:

scrapy安装

1,安装pywin32,选择对应的版本

2,安装twisted,选择对应版本

3,安装zope.interface,测试安装是否成功import zope.interface

4,安装pyopenssl,验证安装情况import OpenSSL

5,安装lxml

6,安装easytool,安装完成,将python安装目录下的Scripts目录路径添加到系统环境变量中

7,下载scrapy,解压文件,cd进入该目录,运行easy_install Scrapy,输入scrapy进行验证

创建项目

创建一个新的Scrapy项目。进入工程目录,在命令行下运行

scrapy startproject tutorial

该命令将会创建tutorial目录,这些文件分别是:

  • scrapy.cfg:项目的配置文件
  • tutorial/:该项目的python模块,在此加入代码
  • tutorial/items.py:项目中的item文件
  • tutorial/pipelines.py:项目中的pipelines文件
  • tutorial/setting.py:项目的设置文件
  • tutorial/spiders/:放置spider代码的目录

定义Item
Item是保存爬取到的数据的容器;其使用方法和python字典类似,并且提供了额外保护机制来避免拼写错误导致的未定义字段错误。类似在ORM中做的一样,通过创建一个scrapy.Item类,并定义类型为scrapy.Field的类属性来定义一个Item。

首先根据需要从dmoz.org获取到的数据对item进行建模。需要从dmoz中获取名字、url,以及网站的描述。对此,在item中定义相应的字段。编辑tutorial目录下的items.py文件:

import scrapy

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

第一个爬虫

Spider是用户编写用于从单个网站(或一些网站)爬取数据的类。其包含了一个用于下载的初始URL,如何跟进网页中的链接以及如何分析页面中的内容,提取生成item的方法。

创建一个Spider,必须继承scrapy.Spider类,且定义以下三个属性:

  • name:用于区别Spider。该名字必须是唯一的,不可以为不同的Spider设定相同的名字。
  • start_urls:包含了Spider在启动时进行爬取的url列表。因此,第一个被获取到的页面将是其中之一。后续的URL则从初始的URL获取到的数据中提取。
  • parse()是spider的一个方法。被调用时,每个初始URL完成下载后生成的Response对象将会作为唯一的参数传递给该函数。该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的Response对象。

以下为第一个Spider代码,保存在tutorial/spiders目录下的dmoz_spider.py文件中:

import scrapy

class DmozSpider(scrapy.spiders.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)

爬取
进入项目的根目录,执行下列命令启动spider,crawl dmoz启动用于爬取dmoz.org的spider

scrapy crawl dmoz

在PyCharm中运行配置,run --> Edit Configurations...

1,Script项填入python安装目录下的C:\Python2.7\Lib\site-packages\Scrapy
2,Script parameters填入crawl 爬虫名字
3,Working directory填入工作目录

查看包含dmoz的输出,可以看到输出的log中包含定义在start_urls的初始URL,并且与spider中一一对应。在log中可以看到其没有指向其他页面(referer:None)。除此之外,就像parse方法所指定的,有两个包含url所对应的内容的文件被创建了:Book,Resources。

Scrapy为Spider的start_urls属性中的每个URL创建了scrapy.Request对象,并将parse方法作为回调函数(callback)赋值给了Request。

Request对象经过调度,执行生成scrapy.http.Response对象并送回给spiderparse()方法。

提取Item

Selector选择器
Scrapy使用了一种基于XpathCSS表达式机制:Scrapy Selector

Xpath表达式的例子及对应的含义:

  • /html/head/title:选择HTML文档中<head>标签内的<title>元素
  • /html/head/title/text():选择上面提到的<title>元素的文字
  • //td:选择所有的<td>元素
  • //div[@class="mine"]:选择所有具有class="mine"属性的div元素

更多内容在Xpath教程

Scrapy除了提供了Selector之外,还提供了方法来避免每次从Response中提取数据时生成Selector的麻烦。

Selector有四个基本的方法(相应方法链接到详细的API文档):

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

在Shell中尝试Selector选择器
使用内置的Scrapy shell。需要预先安装IPython(一个扩展的Python终端)

下载IPython,解压完成进入目录,在cmd中安装python setupegg.py install,添加环境变量C:\Python27\Scripts

进入项目根目录,执行命令启动shell:

scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"

注意:当在终端运行Scrapy时,必须给url地址加上引号,否则包含参数的url(例如&字符)会导致Scrapy运行失败。

当shell载入后,得到一个包含response数据的本地response变量。输入response.body将输出response的包体,输出response.headers可以看到response的包头。

当输入response.selector时,将获取到一个可以用于查询返回数据的selector(选择器),以及映射到response.selector.xpath()response.selector.css()的快捷方法(shortcut):response.xpath()response.css()

同时,shell根据response提前初始化了变量sel。该selector根据response的类型自动选择最合适的分析规则(XML vs HTML)。

提取数据
在终端中输入response.body来观察HTML源码并确定合适的XPath表达式。可以考虑使用Firebug扩展来使得工作更为轻松。详情可参考使用Firebug进行爬取借助Firefox进行爬取

在查看网页的源码后,发现网站的信息被包含在第二个<ul>元素中。

可以通过这段代码选择该页面中网站列表里所有<li>元素:

sel.xpath(‘//ul/li‘)

网站的描述:

sel.xpath(‘//ul/li/text()‘).extract()

网站的标题:

sel.xpath(‘//ul/li/a/text()‘).extract()

网站的链接:

sel.xpath(‘//ul/li/a/@href‘).extract()

每个.xpath()调用返回selector组成的list,因此可以拼接更多的.xpath()来进一步获取某个节点。将在下面使用这样的特性:

for sel in response.xpath(‘//ul/li‘):
        title = sel.xpath(‘a/text()‘).extract()
        link = sel.xpath(‘a/@href‘).extract()
        desc = sel.xpath(‘text()‘).extract()
        print title,link,desc

在spider中加入这段代码:

import scrapy

class DmozSpider(scrapy.Spider):
    ...

    def parse(self, response):
        for sel in response.xpath(‘//ul/li‘):
            title = sel.xpath(‘a/text()‘).extract()
            link = sel.xpath(‘a/@href‘).extract()
            desc = sel.xpath(‘text()‘).extract()
            print title, link, desc

尝试再次爬取dmoz.org,将看到爬取到的网站信息被成功输出

关于嵌套selector的更多详细信息,参考嵌套选择器(selector)以及选择器(Selector)文档中的使用相对XPaths部分。

使用Item
Item对象是自定义的python字典,可以使用标准的字典语法来获取每个字段的值。(字段即用Field赋值的属性):

item = DmozItem()
item[‘title‘] = ‘Example title‘
item[‘title‘]

一般来说,Spider将爬取的数据以Item对象返回。为了将爬取的数据返回,最终的代码将是:

import scrapy
from tutorial.items import DmozItem

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):
        for sel in response.xpath(‘//ul/li‘):
            item = DmozItem()
            item[‘title‘] = sel.xpath(‘a/text()‘).extract()
            item[‘link‘] = sel.xpath(‘a/@href‘).extract()
            item[‘desc‘] = sel.xpath(‘text()‘).extract()
            yield item

可以在dirbot项目中找到一个具有完整功能的spider。

dmoz.org进行爬取将会产生DmozItem对象

保存数据
最简单存储爬取数据的方式是使用Feed exports

scrapy crawl dmoz -o items.json

该命令将采用JSON格式对数据进行序列化,生成items.json文件。
如果需要对爬取的item做更多复杂的操作,可以编写Item Pipeline。类似于在创建项目时对Item做的,编写的tutorial/pipelines.py也被创建。


Copyright © 吴华锦
雅致寓于高阁渔舟唱晚,古典悠然
格调外发园林绿树萦绕,馥郁清香

Python爬虫

标签:

原文地址:http://www.cnblogs.com/hanqing/p/5479575.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!