美文网首页玩耍Pythonpython@IT·互联网
9.Python3爬虫实例——使用Scrapy重构代码爬取名著

9.Python3爬虫实例——使用Scrapy重构代码爬取名著

作者: KaelQ | 来源:发表于2016-08-06 16:46 被阅读3069次

    1.准备

    2.使用Scrapy重构代码

    2.1创建新项目

    • 使用cmd进入待建项目的文件夹中,输入:
      scrapy startproject 项目名
      项目就建好了,项目结构图如下:


    • spiders文件夹是存放各种爬虫的文件夹
      items是存储爬取对象的属性定义的文件
      settings是Scrapy设置的文件

    2.2 定义要爬取的对象的属性

    • 在items.py中添加:
    class BookName(Item):
        name=Field()
        url=Field()
    class BookContent(Item):
        id=Field()
        title=Field()
        text=Field()
    

    2.3 定义爬虫

    • 在Spider文件夹内添加文件book.py。并书写代码如下:
    class BookSpider(CrawlSpider):
        name="book"#爬虫名字
        allowed_domains=["shicimingju.com"]#允许的域名
        start_urls=[#开始爬取的网站
            "http://www.shicimingju.com/book/sanguoyanyi.html"
        ]
    
    • 我直接是使用的CrawlSpider,一个更加方便定义爬取连接规则的类型。
      allow对应爬取的网站,使用了正则,callback对应对于该网站使用的方法。
     rules=(
            Rule(LinkExtractor(allow=('http://www.shicimingju.com/book/sanguoyanyi.html',)),callback='bookMenu_item'),
            Rule(LinkExtractor(allow="http://www.shicimingju.com/book/.*?\d*?\.html"),callback="bookContent_item")
        )
    
    • 读取书的名字
        def bookMenu_item(self,response):
            sel=Selector(response)
            bookName_items=[]
            bookName_item=BookName()
            bookName_item['name']=sel.xpath('//*[@id="bookinfo"]/h1/text()').extract()
            print(bookName_item)
            bookName_items.append(bookName_item)
            return bookName_items
    
    • 读取每章内容并保存id顺序,因为Scrapy是异步的,所以需要保存章节顺序。
     def bookContent_item(self,response):
            global num
            print(num)
            num+=1
            sel = Selector(response)
            bookContent_items = []
            bookContent_item = BookContent()
            bookContent_item['id']=re.findall('.*?(\d+).*?',response.url)
            bookContent_item['title']=sel.xpath('//*[@id="con"]/h2/text()').extract()
            bookContent_item['text']="".join(sel.xpath('//*[@id="con2"]/p/descendant::text()').extract())
            bookContent_item['text']=re.sub('\xa0',' ',bookContent_item.get('text'))
            print(bookContent_item)
            bookContent_items.append(bookContent_item)
            return bookContent_items
    

    2.4 执行爬虫

    • 普通的执行方法,在cmd中输入:
      scrapy crawl book
    • 在pycharm中的执行方法 stackoverflow

    3.总结

    • 可能会出现的问题:
      1. ImportError : cannot import name '_win32stdio' 解决方法
    1. python3 使用scrapy的crawlspider问题 解决方法:查看最新的官方文档。
    2. xpath: 所有"< p >"标签下的内容:xpath('//p/descendant::text()')
      只需要< p >或者< strong >下内容:xpath('//p/text()|//p/strong/text()')
      xpath也是个大坑,改天把它填了。

    相关文章

      网友评论

        本文标题:9.Python3爬虫实例——使用Scrapy重构代码爬取名著

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