zoukankan      html  css  js  c++  java
  • Scrapy中用xpath/css爬取豆瓣电影Top250:解决403HTTP status code is not handled or not allowed

    好吧,我又开始折腾豆瓣电影top250了,只是想试试各种方法,看看哪一种的方法效率是最好的,一直进行到这一步才知道 scrapy的强大,尤其是和selector结合之后,速度飞起。。。。 
    下面我就采用scrapy爬取豆瓣电影top250的方法记录一下,里面采用了selector的xpath和css两种各实现了一遍,其中xpath的选取路径较为清晰以及能够直接选到标签属性,css则较为有点小抽象,没有xpath直观,优点是结构简单,书写方便。于是我都实现了一遍,汗哒哒。。。

    步骤一:生成项目名称

    从windows的cmd命令行或者ubuntu的终端下进入你想保存项目的文件下,输入一下代码:

    scrapy startproject doubanmovie (注意:换成你的项目名称)
    cd doubanmovie
    • 1
    • 2

    cmd中进入doubanmovie后,也就是进入你的项目文件夹后,后面所有的在cmd下或者终端下进行的scrapy命令都是在这个目录下进行的。

    步骤二:配置settings.py文件

    这个文件就是一些基本的配置,比如访问网站的延迟代理等等,在这里我们设置下将爬取的数据以指定的格式保存到指定目录

    FEED_URI = u'file:///E:/python/wswp-code/MyExample/MyScrapy/douban3.csv'  #将抓取的数据存放到douban.csv文件中。(从E:/开始,换成你的目录)
    FEED_FORMAT = 'CSV'
    • 1
    • 2

    然后就是关闭代理了,默认使用代理,有些网页使用本地代理无法访问,否则会报错[scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023 
    [scrapy] DEBUG: Crawled (403)HTTP status code is not handled or not allowed 
    此时,修改setting.py如下:

    DOWNLOADER_MIDDLEWARES = {
        'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
    }
    • 1
    • 2
    • 3

    之后就可以正常爬取豆瓣电影网站了。

    步骤三:配置items.py文件

    import scrapy
    class Doubanmovie3Item(scrapy.Item):
        rank = scrapy.Field()#电影排名
        title = scrapy.Field()#标题--电影名
        link = scrapy.Field()#详情链接
        star = scrapy.Field()#电影评分
        rate = scrapy.Field()#评价人数
        quote = scrapy.Field() #名句
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    步骤四:生成spider文件夹下的爬虫douban.py文件

    在上面的cmd下或者终端下:

    scrapy genspider douban 
    • 1

    或者

    scrapy genspider douban  movie.douban.com 
    • 1

    步骤五:配置spider文件夹下的douban.py文件

    这里也就是重点了,爬取的规则和解析都在这里进行书写,我在这里采用了selector的xpath和css方法分别实现了一遍,就是想进行个对比,读者可以随便选择一个。 
    xpath方法:

    # -*- coding: utf-8 -*-
    import scrapy
    
    from doubanmovie.items import DoubanmovieItem
    class DoubanSpider(scrapy.Spider):
        name = "douban"
        allowed_domains = ["movie.douban.com"]
        start_urls = ['https://movie.douban.com/top250']
    
        def parse(self, response):
            for info in response.xpath('//div[@class="item"]'):
                item = DoubanmovieItem()
                item['rank'] = info.xpath('div[@class="pic"]/em/text()').extract()
                item['title'] = info.xpath('div[@class="pic"]/a/img/@alt').extract()
                item['link'] = info.xpath('div[@class="pic"]/a/@href').extract()
                item['star'] = info.xpath('div[@class="info"]/div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()').extract()
                item['rate'] = info.xpath('div[@class="info"]/div[@class="bd"]/div[@class="star"]/span[4]/text()').extract()
                item['quote'] = info.xpath('div[@class="info"]/div[@class="bd"]/p[@class="quote"]/span/text()').extract()
                yield item
    
                # 翻页
                next_page = response.xpath('//span[@class="next"]/a/@href')
                if next_page:
                    url = response.urljoin(next_page[0].extract())
                    yield scrapy.Request(url, self.parse)  
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    css方法:

    # -*- coding: utf-8 -*-
    import scrapy
    
    from doubanmovie.items import DoubanmovieItem
    class DoubanSpider(scrapy.Spider):
        name = "douban"
        allowed_domains = ["movie.douban.com"]
        start_urls = ['http://movie.douban.com/top250']
    
        def parse(self, response):
            for info in response.css('div.item'):
                item = DoubanmovieItem()
                item['rank'] = info.css('div.pic em::text').extract()
                item['title'] = info.css('div.pic a img::attr(alt)').extract()
                item['link'] = info.css('div.pic a::attr(href)').extract()
                item['star'] = info.css('div.info div.bd div.star span.rating_num::text').extract()
                rate = info.css('div.info div.bd div.star span')
                item['rate'] = rate[3].css('::text').extract()
                item['quote'] = info.css('div.info div.bd p.quote span::text').extract()
                yield item
    
                # 翻页
                next_page = response.xpath('//span[@class="next"]/a/@href')
                if next_page:
                    url = response.urljoin(next_page[0].extract())
                    yield scrapy.Request(url, self.parse)   
    """
    补充点关于css的用法
    Scrapy的中Css 选择器
    
    //通过 名为 video_part_lists 的Class 中下面的 li 标签
    
    liList = response.css('.video_part_lists li') 
    
    for li in liList:
    再通过li 标签获取 a 标签中得  href 属性
        name= li.css('a::attr(href)').extract()
    """
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    步骤六:启动爬虫,观察日志

    在上面的cmd中或者终端下:

    scrapy crawl douban -s LOG_LEVEL=INFO
    • 1

    或者

    scrapy crawl douban -s LOG_LEVEL=DEBUG
    • 1

    这个设置可以观察到详细的运行日志

    步骤七:解决乱码问题

    此时在你之前设定的保存文件的目录下,有了一个.csv文件,用window的记事本或者notepad++打开的话,可以正常显示;但是用excel打开的话则可能出来乱码,此时只需要重新用记事本打开然后另存为ANSI编码,然后就能用window的excel打开了。

    附上参考的链接: 
    http://www.jianshu.com/p/62e0a588ee0d 
    http://www.tuicool.com/articles/Un2MNfe 
    http://blog.csdn.net/heu07111121/article/details/50832999 
    http://www.tuicool.com/articles/eymema

  • 相关阅读:
    js插件zClip实现复制到剪贴板功能
    基于jQuery的滚动条插件-jquery.jscrollbar
    jquery mobile 开启开关
    html5 中audio 在safari上不支持自动播放
    开发人员常用的10个Sublime Text插件
    通过padding-bottom或者padding-top实现等比缩放响应式图片
    get请求下载json文件正常,但是不弹出status
    JSON错误
    对象与类
    数组(二)
  • 原文地址:https://www.cnblogs.com/xiaoleiel/p/8301509.html
Copyright © 2011-2022 走看看