爬取今日头条街拍图片

前言

本博客主要记录跟随崔庆才老师的分析Ajax抓取今日头条街拍美图学习的整个过程,更多精品文章,请参阅崔老师的博客,再次感谢崔老师教导。

3月15日更新,14日代码敲完了,今天主要总结整个过程

啰嗦心得

  • 个人觉得在掌握了Python的基础的前提下,爬虫的难点在于两点:

    • 分析网页结构,看要获取的数据获取的方式
    • 利用语言知识去匹配或者利用其它的方法,比如ajax等发起请求获取数据等等
  • 这两点前者更为复杂,因为有的网页比如本例中,街拍的索引页面的详情页面中,详情的数据是在页面的一个js的变量中,但是在我跟随视频学习的过程中发现,此时的页面很多已经不是存在一个变量中,而是存在于标签中,说明页面是有过改版,此时同一个详情页面就不能一概而论,要写不同的方法处理,不过由于爬虫功底还很薄弱,所以对于存在于标签中的链接,我并没有处理,而是进行了过滤,待到基础比较扎实以后,会对代码进行更新(March 15

开始爬取

索引页面

  • 前期要求

简单来说此次抓取氛围两部分,一部分是图片的索引页面,另外一部分是通过点击索引进入详情页面,抓取具体的图片的地址,并将其存储,最后下载图片资源

  • 索引页面分析

跟随视频学习,打开谷歌的工具查看索引页面的源代码,没有看到和素材相关的资源,这里略总结一下,以目前自己所学的这点知识,想要的链接信息主要存在于一下三方面的元素中

  • 存在于HTML的标签的链接中

  • 存在于CSS样式中

  • 存在于 页面的js代码中

  • 存在于ajax的请求中(索引页面就是这种)

  • 索引页数据分析

    • 通过分析所以页面是通过ajax请求获取到的,通过Google浏览器的工具filter工具的XHR过滤项可以看出


      xhr.png
    • 索引页面数据分析,参看下图


      data

      具体索引链接
    • 经过分析是通过ajax请求,获取回来的数据,其中article_url就是进入详情页面的链接,我们通过构建一个ajax请求,然后获取返回数据,在获取字段
  • 索引页抓取

    • 构建ajax请求获取数据

    • 代码 <b>由于markdown格式问题,我就不粘贴代码,用图片代替,博客末尾我会附上代码地址

      索引页面数据获取

    • 代码分析

      • data:是ajax的所需要的参数,这个参数是参看XHR中的


        参数
      • url : baseUrl + 经过转码的参数,成为完整的url【get请求】,其中转码函数urlencode包含在你from urllib import urlencode
      • 请求:本次的请求框架是requests,我一直以为requests是Python的原生库,其实属于第三方框架 ,故安装sudo pip install requests,导入import requests,具体访问参见代码
    • 解析索引页面返回的json数据

      • 根据之前的分析,ajax请求返回值的数据类型是json,故利用Python内部的json模块就可以解析import json
      • json 解析完成以后,就可以根据节点取出相应的值,通过遍历数据返回一个首页的索引的ur列表


        索引数据解析

详情页面

  • 详情页面分析

经过分析,在图片的详情页面图片数据是存储在页面的 var gallery变量中,这变量后面也是一个json数据,所以我们经过正则匹配来或者这个变量后边的json数据

  • 详情页面抓取
    这个比较简单,根据索引页的url,进行页面获取,与索引页的获取基本相同


    详情页面获取
  • 详情页面解析
    这里要做的工作就是在页面中通过正则匹配找到var gallery,然后获取后面的json数据
    gallery后边的json数据结构

    详情页面解析
    • 由于详情页面就是普通的HTML页面,可以通过BeautifulSoup框架解析, BeautifulSoup框架需要通过pip安装,然后导入from bs4 import BeautifulSoup
  • 将匹配完获取的数据用json框架进行解析,由于图片数据是一个数组,故需要遍历取值
  • 返回一个数组,包括详情页面的标题,详情页面的url,图片的url数组

存储到数据库

  • 下载安装mongoDB,这里不赘述
  • 配置mongoDB,可以参见我的博客
  • pycharm配置mongoDB
    • 创建config.py配置文件,然后配置一些参数,包括主机,数据库名,表名


    • 创建数据库,主要利用pymongo(import pymongo)框架,因为研究的不是很彻底,这里只写一些简单的代码,不要忘记导入配置文件from config import *
      创建数据库
    • 存储数据


      存储数据

下载图片

  • 通过url下载图片数据,是Python相关知识,不赘述


    下载图片
  • 将图片数据转换为图片


    转换数据

将以上代码整体串接调用

def main(offset):
    html = get_page_index(offset, KEYWORD)
    for url in parse_page_index(html):
        detail = get_page_detail(url)
        # 这里进行一下判断,如果能正常返回在进行解析
        if detail and parse_page_detail(detail, url):
            result = parse_page_detail(detail, url)
            if result:
                save_to_db(result)

if __name__ == "__main__":
       main()

代码地址

最后

无论从接触爬虫还是博客的编写都显得匆忙和粗糙,以后随着知识的完善,博客也会进行相应的更新,希望大家不吝赐教,提出问题指正,谢谢

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,650评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,273评论 19 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,301评论 4 61
  • 拍照或拍视频视频后,扫描把文件添加到系统媒体库,也就是更新系统图库/相册,以便使用ContentResolver查...
    lioilwin阅读 5,929评论 0 4
  • 我的心 在空中游动 寻找一个怒放着山茶花的山麓 抑或 一个散发着紫罗兰芬芳的幽谷 静静地扎根 然后 生成一团火 化...
    格尔黑阅读 335评论 14 30