zoukankan      html  css  js  c++  java
  • Python爬虫之一 PySpider 抓取淘宝MM的个人信息和图片

    ySpider 是一个非常方便并且功能强大的爬虫框架,支持多线程爬取、JS动态解析,提供了可操作界面、出错重试、定时爬取等等的功能,使用非常人性化。

    本篇通过做一个PySpider 项目,来理解 PySpider 的运行流程。

    PySpider具体安装参照:http://www.cnblogs.com/shaosks/p/6840039.html

    本篇目标

    1.抓取淘宝MM的姓名,头像,年龄

    2.抓取每一个MM的资料简介以及写真图片

    3.把每一个MM的写真图片按照文件夹保存到本地

    4.熟悉文件保存的过程

    1.URL的格式

    在这里我们用到的URL是 http://mm.taobao.com/json/request_top_list.htm?page=1,问号前面是基地址,后面的参数page是代表第几页,可以随意更换地址。点击开之后,会发现有一些淘宝MM的简介,并附有超链接链接到个人详情页面。

    我们需要抓取本页面的头像地址,MM姓名,MM年龄,MM居住地,以及MM的个人详情页面地址。

    2.抓取过程

      1、首先在命令行下运行pyspider all命令:

      

      2、接下来在浏览器中输入 http://localhost:5000,可以看到 PySpider 的主界面,点击右下角的 Create,命名为 spider_taobaomm,当然名称你可以随意取,继续点击 Create。

       

       

      接着修改代码。

      依然是上一节的那个网址,https://mm.taobao.com/json/request_top_list.htm?page=1,其中 page 参数代表页码。所以我们暂时抓取前 5 页。页码到最后可以随意调整。

    首先我们定义基地址,然后定义爬取的页码和总页码。

      代码如下:

     1 #!/usr/bin/env python
     2 # -*- encoding: utf-8 -*-
     3 # Created on 2017-05-16 13:57:04
     4 # Project: spider_taobaomm
     5 
     6 from pyspider.libs.base_handler import *
     7 
     8 
     9 class Handler(BaseHandler):
    10     crawl_config = {
    11     }
    12     def __init__(self):
    13         self.base_url = 'https://mm.taobao.com/json/request_top_list.htm?page='
    14         self.page_num = 1
    15         self.total_num = 5
    16         
    17     @every(minutes=24 * 60)
    18     def on_start(self):
    19         while self.page_num <= self.total_num:
    20             url = self.base_url + str(self.page_num)
    21             self.crawl(url, callback=self.index_page)
    22             self.page_num += 1
    23 
    24     @config(age=10 * 24 * 60 * 60)
    25     def index_page(self, response):
    26         for each in response.doc('a[href^="http"]').items():
    27             self.crawl(each.attr.href, callback=self.detail_page)
    28 
    29     @config(priority=2)
    30     def detail_page(self, response):
    31         return {
    32             "url": response.url,
    33             "title": response.doc('title').text(),
    34         }

       点击保存按钮保存代码:

      

      点击“run"按钮

      

      这样就找到5条记录,点击“follows”

      

      选择一条记录,点击右边的三角按钮

      

      出现错误如下:

      

      针对这个错误,参照:http://www.cnblogs.com/shaosks/p/6856086.html

      实际上就是在on_start方法的self.crawl里面增加,validate_cert=False

      

      

      然后保存代码再重新执行,成功

      

      点击之后,再查看下方的 web 页面,可以预览实时页面,这个页面被我们爬取了下来,并且回调到 index_page 函数来处理,

      目前 index_page 函数我们还没有处理,所以是继续构建了所有的链接请求。

      

      

      点击下面的html出现:

      

      爬取到了 MM 的列表,接下来就要进入到 MM 详情页了,修改 index_page 方法。

      

      我们继续点击 run 按钮,开始下一个页面的爬取。得到的结果是这样的。

      

      

      有些页面没有加载出来,这是为什么?这个页面比较特殊,右边的页面使用 JS 渲染生成的,而普通的抓取是不能得到 JS 渲染后的页面的,幸运的是,PySpider 提供了动态解析 JS 的机制。

      这时要用到PhantomJS了。在最开始运行 PySpider 的时候,使用了pyspider all命令,这个命令是把 PySpider 所有的组件启动起来,其中也包括 PhantomJS。

      所以修改代码如下:

    @config(age=10 * 24 * 60 * 60)
        def index_page(self, response):
             for each in response.doc('.lady-name').items():
                self.crawl(each.attr.href, callback=self.detail_page,fetch_type='js',validate_cert=False)

      保存代码,重新运行,结果如下:

      

      

      好,继续修改 detail_page 方法,然后增加一个 domain_page 方法,用来处理每个 MM 的个性域名。

  • 相关阅读:
    类成员指针
    css图片旋转
    px转化rem
    flexible.js页面布局
    SpringBoot-静态资源映射
    Springboot-日志框架
    Springboot-配置文件
    spring的xml和注解整合
    在mysql中将JSON数组转换为行数据[转]
    php 拼音
  • 原文地址:https://www.cnblogs.com/shaosks/p/6860954.html
Copyright © 2011-2022 走看看