scrapy 简单教程

  • Post author:
  • Post category:其他


首先,在教程(二)(

http://blog.csdn.net/u012150179/article/details/32911511

)中,研究的是爬取单个网页的方法。在教程(三)(

http://blog.csdn.net/u012150179/article/details/34441655

)中,讨论了Scrapy核心架构。现在在(二)的基础上,并结合在(三)中提到的爬取多网页的原理方法,进而进行自动多网页爬取方法研究。

并且,为了更好的理解Scrapy核心架构以及数据流,在这里仍采用scrapy.spider.Spider作为编写爬虫的基类。



首先创建project:



  1. scrapy startproject CSDNBlog




一. items.py编写

在这里为清晰说明,只提取文章名称和文章网址。



  1. # -*- coding:utf-8 -*-






  2. from


    scrapy.item


    import


    Item, Field




  3. class


    CsdnblogItem(Item):



  4. “””存储提取信息数据结构”””





  5. article_name = Field()

  6. article_url = Field()




二. pipelines.py编写



  1. import


    json



  2. import


    codecs




  3. class


    CsdnblogPipeline(object):




  4. def


    __init__(


    self


    ):



  5. self


    .file = codecs.open(


    ‘CSDNBlog_data.json’


    , mode=


    ‘wb’


    , encoding=


    ‘utf-8’


    )




  6. def


    process_item(


    self


    , item, spider):


  7. line = json.dumps(dict(item)) +

    ‘\n’





  8. self


    .file.write(line.decode(


    “unicode_escape”


    ))




  9. return


    item




其中,构造函数中以可写方式创建并打开存储文件。在process_item中实现对item处理,包含将得到的item写入到json形式的输出文件中。



三. settings.py编写

对于setting文件,他作为配置文件,主要是至执行对spider的配置。一些容易被改变的配置参数可以放在spider类的编写中,而几乎在爬虫运行过程中不改变的参数在settings.py中进行配置。



  1. # -*- coding:utf-8 -*-





  2. BOT_NAME =

    ‘CSDNBlog’





  3. SPIDER_MODULES = [

    ‘CSDNBlog.spiders’


    ]


  4. NEWSPIDER_MODULE =

    ‘CSDNBlog.spiders’






  5. #禁止cookies,防止被ban




  6. COOKIES_ENABLED =

    False





  7. ITEM_PIPELINES = {


  8. ‘CSDNBlog.pipelines.CsdnblogPipeline’


    :


    300




  9. }



  10. # Crawl responsibly by identifying yourself (and your website) on the user-agent





  11. #USER_AGENT = ‘CSDNBlog (+http://www.yourdomain.com)’



这里将COOKIES_ENABLED参数置为True,使根据cookies判断访问的站点不能发现爬虫轨迹,防止被ban。

ITEM_PIPELINES类型为字典,用于设置启动的pipeline,其中key为定义的pipeline类,value为启动顺序,默认0-1000。



四. 爬虫编写

爬虫编写始终是重头戏。原理是分析网页得到“下一篇”的链接,并返回Request对象。进而继续爬取下一篇文章,直至没有。

上码:



  1. #!/usr/bin/python





  2. # -*- coding:utf-8 -*-






  3. # from scrapy.contrib.spiders import  CrawlSpider,Rule






  4. from


    scrapy.spider


    import


    Spider



  5. from


    scrapy.http


    import


    Request



  6. from


    scrapy.selector


    import


    Selector



  7. from


    CSDNBlog.items


    import


    CsdnblogItem





  8. class


    CSDNBlogSpider(Spider):



  9. “””爬虫CSDNBlogSpider”””





  10. name =

    “CSDNBlog”






  11. #减慢爬取速度 为1s




  12. download_delay =

    1




  13. allowed_domains = [

    “blog.csdn.net”


    ]


  14. start_urls = [



  15. #第一篇文章地址





  16. “http://blog.csdn.net/u012150179/article/details/11749017”




  17. ]



  18. def


    parse(


    self


    , response):


  19. sel = Selector(response)



  20. #items = []





  21. #获得文章url和标题




  22. item = CsdnblogItem()


  23. article_url = str(response.url)

  24. article_name = sel.xpath(

    ‘//div[@id=”article_details”]/div/h1/span/a/text()’


    ).extract()



  25. item[

    ‘article_name’


    ] = [n.encode(


    ‘utf-8’


    )


    for


    n


    in


    article_name]


  26. item[

    ‘article_url’


    ] = article_url.encode(


    ‘utf-8’


    )




  27. yield


    item




  28. #获得下一篇文章的url




  29. urls = sel.xpath(

    ‘//li[@class=”next_article”]/a/@href’


    ).extract()



  30. for


    url


    in


    urls:



  31. print


    url


  32. url =

    “http://blog.csdn.net”


    + url



  33. print


    url



  34. yield


    Request(url, callback=


    self


    .parse)




慢慢分析:

(1)download_delay参数设置为1,将下载器下载下一个页面前的等待时间设置为1s,也是防止被ban的策略之一。主要是减轻服务器端负载。

(2)从response中抽取文章链接与文章题目,编码为utf-8。注意yield的使用。

(3)抽取“下一篇”的url,由于抽取后缺少http://blog.csdn.net部分,所以补充。两个print只为调试,无实际意义。重点在于



  1. yield


    Request(url, callback=


    self


    .parse)

也就是将新获取的request返回给引擎,实现继续循环。也就实现了“

自动下一网页的爬取

”。



五. 执行



  1. scrapy crawl CSDNBlog




部分存储数据截图:


原创,转载注明:

http://blog.csdn.net/u012150179/article/details/34486677