美文网首页
Scrapy框架使用

Scrapy框架使用

作者: Birdy潇 | 来源:发表于2017-08-26 14:31 被阅读0次

    继图片爬虫之后学习使用Scrapy框架来爬取豆瓣9.0分以上的书单和Top250电影

    第一步创建工程

    在命令窗口输入如下命令:

    C:\Users\Administrator>scrapy startproject doubanbook
    

    再根据提示cd 进入doubanbook目录,设置爬虫名称为bookspider和爬取的网站
    在doubanbook初级目录下新建一个main.py文件用于执行爬虫

    from scrapy import cmdline
    cmdline.execute('spider crawl bookspider'.split())
    

    第二步编写爬虫

    1. 进入spiders目录,找到bookspider爬虫,编写xpath爬取,scrapy的xpath需要用Selector来解析response
    import scrapy
    
    class BookspiderSpider(scrapy.Spider):
        name = 'bookspider'
        #注释掉allowed_domains,防止递归爬取下一页式冲突
        #allowed_domains = ['www.douban.com/doulist/1264675/']
        start_urls = ['http://www.douban.com/doulist/1264675/']
        
        def parse(self,response):
            selector=scrapy.Selector(response)
            #抓取书单主体
            books= selector.xpath('//div[@class="bd doulist-subject"]')
            for each in books:
                #此时的xpath开始没有节点
                title=body.xpath('div[@class="title"]/a/text()').extract()[0]
                rating=body.xpath('div[@class="rating"]/span[@class="rating_nums"]/text()').extract()#注意有的书单没有评分
                author=body.xpath('div[@class="abstract"]/text()').extract()[0]
                title=title.replace(' ','').replace('\n','')
                author=author.replace(' ','').replace('\n','')
    
    1. 由于豆瓣网又反爬策略,需要进行模拟浏览器登陆,进入setting.py文件配置USER_AGENT:
    USER_AGENT= 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'
    

    第三步保存到本地

    进入item.py文件进行配置,由于需要作者,标题,得分,所以设置三个Field来存储,设置方式很简单:

    # name = scrapy.Field()
    title=scrapy.Field()
    rating=scrapy.Field()
    author=scrapy.Field()
    

    在到setting.py中,设置保存格式和保存路径
    FEED_FORMAT为保存格式
    FEED_URI为保存路径,可保存于本地也可保存于fttp

    FEED_URI='file:\\C:\\Users\\Administrator\\Desktop\\book.csv'
    FEED_FORMAT='CSV'
    

    由于用到了item模块,需要在bookspider中做些改动,在开头导入item中的类

    from doubanbook.items import DoubanbookItem
    

    同时创建item类,将数据保存到item中:

    item=DoubanbookItem()#创建item类
    item['title']=title
    item['rating']=rating
    item['author']=author
    yield item
    

    最后一步递归爬取下一页

    上面的代码只爬取了一页的内容,爬取整个书单需要将所有页数的内容爬取,思路是找到下一页的url,然后用scrapy的http.Request来递归爬取

    nextPage=selector.xpath('//span[@class="next"]/link/@href').extract()
    if nextPage:
        next_URL=nextPage[0]
        yield scrapy.http.Request(next_URL,callback=self.parse)
    

    大功告成!!

    bookspider的完整代码如下,items.py和setting.py中的设置按上述方法设置就行了

    import scrapy
    from doubanbook.items import DoubanbookItem
    
    class BookspiderSpider(scrapy.Spider):
        name = 'bookspider'
        #注释掉allowed_domains,防止递归爬取下一页式冲突
        #allowed_domains = ['www.douban.com/doulist/1264675/']
        start_urls = ['http://www.douban.com/doulist/1264675/']
    
        def parse(self, response):
    
            item=DoubanbookItem()#创建item类
            #用Scrapy的Selector来解析response
            selector=scrapy.Selector(response)
            #xpath提取书单主体
            books=selector.xpath('//div[@class="bd doulist-subject"]')
            for body in books:
                #此时的xpath开始没有节点
                title=body.xpath('div[@class="title"]/a/text()').extract()[0]
                rating=body.xpath('div[@class="rating"]/span[@class="rating_nums"]/text()').extract()#注意有的书单没有评分
                author=body.xpath('div[@class="abstract"]/text()').extract()[0]
                title=title.replace(' ','').replace('\n','')
                author=author.replace(' ','').replace('\n','')
                item['title']=title
                item['rating']=rating
                item['author']=author
                yield item
            #下一页的url
            nextPage=selector.xpath('//span[@class="next"]/link/@href').extract()
            #加if判断到最后一页时不执行
            if nextPage:
                next_URL=nextpage[0]
                #递归爬取
                yield scrapy.http.Request(next_URL,callback=self.parse)
    

    效果如下:

    书单.png

    ----------------------------------------------------分割线----------------------------------------------------------
    今天花了点时间把豆瓣电影top250的高分电影也爬出来了,但是对于电影评价的部分用xpath爬不出来,不知道什么原因,所以就用re正则,附上图:


    TIM图片20170827134624.png

    相关文章

      网友评论

          本文标题:Scrapy框架使用

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