zoukankan      html  css  js  c++  java
  • Scrapy爬取Ajax(异步加载)网页实例——简书付费连载

    这两天学习了Scrapy爬虫框架的基本使用,练习的例子爬取的都是传统的直接加载完网页的内容,就想试试爬取用Ajax技术加载的网页。

    这里以简书里的优选连载网页为例分享一下我的爬取过程。

    网址为:

    https://www.jianshu.com/mobile/books?category_id=284

    一、分析网页


    进入之后,鼠标下拉发现内容会不断更新,网址信息也没有发生变化,于是就可以判断这个网页使用了异步加载技术。

    f

     

    首先明确爬取的内容,本次我爬取的是作品名称、照片、作者、阅读量。然后将照片下载存储在文件夹中,然后将全部内容生成csv文件夹保存。

    查看网页源代码发现代码里只有已加载的作品的内容,编写爬虫代码发现爬取不到收录的信息。

    进入Network选项,勾选XHR选项,通过下滑网页发现Network选项卡会加载文件,如下图:

    注:这里我用的是火狐浏览器

    点击其中一个加载文件,可以在消息头看到请求网址:

     

    继续下滑,发现Headers部分请求的URL只是page后面的数字在改变,通过改变数字,我们就能在后面调用回调函数爬取多个网页了。

     

    二、Scrapy爬取


     1.在命令提示符输入:

    cd Desktop  #进入桌面
    scrapy startproject jian   #生成名为jian的Scrapy文件夹

    cd jian
    scrapy genspider lianzai jianshu.com #爬虫名为lianzai

    这里我用的是pycharm,打开文件夹。

    2.在items.py定义爬虫字段

    1 class JianItem(scrapy.Item):
    2     # define the fields for your item here like:
    3     # name = scrapy.Field()
    4     book_name=scrapy.Field()   
    5     img=scrapy.Field()
    6     author=scrapy.Field()
    7     readers=scrapy.Field()
    8     pass

    3.在lianzai.py编写爬虫代码,爬取数据

     1 # -*- coding: utf-8 -*-
     2 import scrapy
     3 from jian.items import JianItem
     4 import json
     5 import requests
     6 
     7 class LianzaiSpider(scrapy.Spider):
     8     name = 'lianzai'
     9     allowed_domains = ['jianshu.com']
    10     start_urls = ['https://www.jianshu.com/asimov/books?page=1&count=12&category_id=284']      #第一页的url
    11     def parse(self, response):
    12         data=json.loads(response.body)  #str转为json对象
    13         try:
    14             for i in range(0, 12):
    15                 item = JianItem()
    16                 img=data['books'][i]['image_url']
    17                 book_name=data['books'][i]['name']
    18                 author=data['books'][i]['user']['nickname']
    19                 readers=data['books'][i]['views_count']
    20 
    21                 item['img']=img
    22                 item['book_name']=book_name
    23                 item['author']=author
    24                 item['readers']=readers
    25                 yield item  #返回数据
    26         except IndexError:
    27             pass
    28         urls=['https://www.jianshu.com/asimov/books?page={}&count=12&category_id=284'.format(str(i))for i in range(2, 11)]  #
    29         for url in urls:
    30             yield scrapy.Request(url,callback=self.parse)  #回调函数

    这里特别要注意的是要爬取内容的所在位置。

                    

    上图中左图可以看出爬取的内容的位置在response里的['books']里面,且一个网页有12个作品,因此上面循环出为(0,12)。

    打开后如上右图,可以看到我们要爬取的作品名、图片地址、作者、阅读量都在里面,爬取就相对容易了。

     4.在setting.py设置爬虫配置

    1 USER_AGENT='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36'  #请求头
    2 DOWNLOAD_DELAY=0.5  #延时0.5
    3 FEED_URI='file:C:/Users/lenovo/Desktop/jianshulianzai.csv'  #在桌面生成CSV文件 
    4 FEED_FORMAT='csv'  #存入
    5 ITEM_PIPELINES={'jian.pipelines.JianPipeline':300}

     5.在pipelines.py处理照片数据

     1 # -*- coding: utf-8 -*-
     2 
     3 # Define your item pipelines here
     4 #
     5 # Don't forget to add your pipeline to the ITEM_PIPELINES setting
     6 # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
     7 import os
     8 import urllib.request
     9 
    10 class JianPipeline(object):
    11     def process_item(self, item, spider):
    12         headers = {
    13             'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36'
    14         }
    15         try:
    16             if item['img'] != None:
    17                 req=urllib.request.Request(url=item['img'],headers=headers)
    18                 res=urllib.request.urlopen(req)
    19                 file_name = os.path.join(r'C:UserslenovoDesktopmy_pic', item['book_name'] + '.jpg')
    20                 with open(file_name,'wb')as f:
    21                     f.write(res.read())
    22         except urllib.request.URLError:
    23             pass
    24         return item

    6.全部保存后,在命令行终端输入:

    scrapy crawl lianzai

    就将结果爬取下来并保存啦。

    三、结果


    .csv文件的内容:

     

     

     

     

    下载的照片:

     


    初入爬虫,还有很多不足需要改正,还有很多知识需要学习,希望有疑问或建议的朋友多多指正或留言。谢谢。

    世界那么大,那么美,我想留下点什么,分享点什么。
  • 相关阅读:
    2014-5-28 技能
    Python的包管理工具Pip
    vi 命令 使用方法
    oracle实例名,数据库名,服务名等概念差别与联系
    自己动手写操作系统--个人实践
    D3DXMatrixMultiply 函数
    port大全及port关闭方法
    原型模式
    ExecuteScalar
    第三章_JSP
  • 原文地址:https://www.cnblogs.com/berryguotoshare/p/10011729.html
Copyright © 2011-2022 走看看