zoukankan      html  css  js  c++  java
  • Python爬虫

    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.7Libsite-packagesScrapy
    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:Python27Scripts

    进入项目根目录,执行命令启动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 © 吴华锦
    雅致寓于高阁渔舟唱晚,古典悠然
    格调外发园林绿树萦绕,馥郁清香

  • 相关阅读:
    LeetCode c++-- 118.杨辉三角
    LeetCode c++ --896. 单调数列
    LeetCode c++--1551. 使数组中所有元素相等的最小操作数
    LeetCode c++:1550. 存在连续三个奇数的数组
    LeetCode c++--字符串转换整数 (atoi)
    c++ 顺序容器常用知识总结
    c++基础知识之容器一:顺序容器
    小菜鸡c++ LeetCode初级算法之一——数组(删除排序数组中的重复项)
    JVM
    BATCH、事务、CLOB、BLOB
  • 原文地址:https://www.cnblogs.com/hanqing/p/5479575.html
Copyright © 2011-2022 走看看