美文网首页
scrapy爬虫笔记(一)

scrapy爬虫笔记(一)

作者: 陆壹610 | 来源:发表于2017-03-20 20:45 被阅读0次

    最近因为需要爬取豆瓣的排名250的榜单,所以打算用scrapy去爬取,现将学习的笔记整理为一篇笔记。
    这篇笔记是针对爬取豆瓣的榜单的,所以会偏向实践多一点,理论不会详细论述。利用scrapy爬取的步骤主要有三大步:
    1、新建scrapy的项目
    2、确定需要爬取的目标,编写好items模块
    3、这是最重要的一步,写爬虫的程序,也就是写好spider的模块

    一、首先第一步,新建scrapy需要在命令行输入:

    scrapy startproject 项目名
    

    然后就会在你的根目录下自动生成一个项目,你需要编写那个模块就可以在哪个模块下面编写代码了。

    二、确定好你所需要爬取的目标,比如说我现在要爬取豆瓣排名榜单上的书名,作者名和评分这三个,然后我就可以在items这个模块下编写好我需要的对象。具体步骤如下:
    进入items模块,import scrapy 的包
    新建一个类,这个类继承了scrapy包里面的Items这个类
    在这个类下面,用scrapy里面的Field方法去声明你需要爬取的对象,Field方法返回的是一个字典,用来存放你爬取以后的数据
    具体代码如下:

    class TutorialItem(scrapy.Item):
      # define the fields for your item here like:
    # name = scrapy.Field()
    BookName = scrapy.Field()
    Author = scrapy.Field()
    scores = scrapy.Field()
    

    三、编写爬虫程序。进入到spiders这个目录下,新建一个py文件,在里面编写你的爬虫程序。这里面也有主要的几步:

    1、新建一个类,这个类包含三块主要的部分:name、start_urls、parse方法,name是这个爬虫程序的名字,必须要命名好,在等下启动程序的时候就需要用到,start_urls是需要爬取网站的url ,parse方法是需要用来爬取的方法,他返回一个response对象,而这个response就是你爬取到网页的全部内容。

    2、下面详细说明parse的方法:parse方法具体是使用了request的方法把网站的内容爬取下来,然后利用scrapy的选择器把你所需要的内容选择下来。scrapy的选择器有xpath和css两个。这里我用的是xpath,所以我具体记录一下xpath的用法,css的用法可以参考scrapy的官网文档。xpath可以跟据网站上的HTML的符合匹配到你所需要找的内容的,如我在爬取豆瓣网站上的书名的时候,就可以用xpath匹配到书名是在(a/@title)这个属性下。

    ScreenClip.png

    匹配到书名之后,再调用extract()方法将他匹配到选择匹配到的第一个元素,就是我们想要得到的书名了。建议在找匹配信息的HTML的符合的时候,使用谷歌的浏览器,这会让你很容易就能找到。xpath的用法也简单,下面列举几个:
    1.‘/’是匹配到根节点,而‘//’从匹配当前的节点中选择文档的节点
    2.‘@’是选择属性。而‘@*’就是选择所有该属性的元素
    ......
    详细可以参考w3schoolhttp://www.w3school.com.cn/xpath/xpath_syntax.asp,列举得很详细
    具体代码如下

       def parse(self,response):
    #将全部图书的项目取出
    sites =response.xpath('//tr[@class="item"]') 
    

    将每一个图书item里面分别取出标题,作者和评分

    for site in sites:
      book = TutorialItem()
      book['BookName'] = site.xpath('//td[2]/div[1]/a/@title').extract()[0]
      book['Author'] = site.xpath('//td[2]/p[1]/text()').extract()[0]
      book['scores'] =site.xpath('//td[2]/div[2]/span[@class="rating_nums"]/text()').extract()[0] 
    

    爬取一页的步骤大概就是如此,要是我需要爬取多页又是如何操作呢?我们需要再写一个parse的方法,用这个方法去分析出网页底下页面数的url,再调用上面的爬取一页的代码块依次遍历每一页的url即可。

    这里解释一下,parse方法可以有两种返回值,一种是直接返回response对象,那么就可以会储存到items的字典里面,还有一种就是可以返回一个request请求,去解析你所要继续爬取的url,即可爬取所有n页的页面了
    当然,这个方法也可以用来爬取链接里面的链接的内容,道理跟爬取所有页是一样的。代码如下:
    #爬取当前页,并返回其他页面的url
    def parse(self,response):
    #返回请求去解析当前页
    yield scrapy.Request(response.url,callback=self.parse_page)

    #遍历取得第n页的url
    
    for site in response.xpath('//div[@class="paginator"]/a'): 
      page = site.xpath('@href').extract()[0] 
      yield scrapy.Request(page,callback = self.parse_page)  #返回请求解析这些url的页面,并调用下面的parse_page函数去解析
    
    
    #解析单页的函数
    

    def parse_page(self,response):

    sites =response.xpath('//tr[@class="item"]')
    
    for site in sites:
      book = TutorialItem() #book是我们储存爬取内容的实例
      #将我们爬取到的书名,作者和评分分别放到我们开始声明的字典里面
      book['BookName'] = site.xpath('//td[2]/div[1]/a/@title').extract()[0]
      book['Author'] = site.xpath('//td[2]/p[1]/text()').extract()[0]
      book['scores'] = site.xpath('//td[2]/div[2]/span[@class="rating_nums"]/text()').extract()[0]
    

    return book

    三、还有一步也是很重要的,就是设置’user agent’。’user agent’ 进行对爬虫进行伪装,伪装成为浏览器浏览的活动。具体操作如下是:在settings里面输入

    USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
    

    到这里,就可以在命令行运行运行你的爬虫了,首先cd 进入存放你的scrapy项目的路径,然后输入

    scrapy crawl ‘name的值’
    

    就可以运行你的爬虫了,一个简单的轻量级的爬虫就完成了,
    当然scrapy能做的远不止这些,还可以设置爬取的速度,并行,多线程等等,这些就留着下次再记录。

    参考:
    1.scrapy的官网文档
    2.http://www.hulufei.com/post/Some-Experiences-Of-Using-Scrapy

    相关文章

      网友评论

          本文标题:scrapy爬虫笔记(一)

          本文链接:https://www.haomeiwen.com/subject/acvinttx.html