zoukankan      html  css  js  c++  java
  • python语法动态页面爬取

    动态页面爬取

      好久没有写爬虫了,今天敲了一份爬虫出来——爬取百度百科的历史记录,结果在时隔四个月之后再次遇到的对手居然是一个动态页面(一开始把百度想的太简单了),不过在一番努力之后还是达到了我的目标,然后就当复习似的写了篇博客。

    一、概念

      动态页面其实是相对于静态页面而言的。在面对静态页面的时候直接查看response一般就是网页的全部代码了,但是动态页面不然,一般动态页面的response再打开的时候和你在网页看的不一样了。

    二、实践及实践之前

      因为本人超喜欢实践,所以二话不说进行上实践,实践出真知,多实践就懂了。

    目标网页:万科百度百科历史版本 
    实现环境:win32 
    version : python 3.6.2 
    实践目标:获取万科百度百科历史版本的历史修改时间,做成图表或者csv文件

    三、流程阐述

      和所有的爬虫一样,我们第一步会进行网页的分析,因为我们目标选取了一个动态网页,所以我们还需要对json文件等进行追踪。 
      流程:

    1、网页分析 
    2、查询、追踪json等文件或者xhr 
    3、进行文本匹配 
    4、画图或者制作csv

    四、工具准备

      我们所需要的库有(都是最新版):

    1.requests 
    2.re 
    (以下的库不是爬虫必须的,但是是我这次所需要) 
    3.matplotlib(进行可视化) 
    4.datetime(对时间进行操作) 
    5.Pandas(python强大的数据处理库) 
    6.os(对系统进行操作) 
    (本人更偏爱原始的re库,当然这里使用正则表达式已经能够解决所有问题了)

      所需了解的知识:

    1.python语法基础 
    2.正则表达式的匹配规则 
    (以下非爬虫必要) 
    3.datetime一些基本功能 
    4.matplotlib可视化的操纵(虽然此项为非爬虫必要,但是很多时候数据可视化出来会让数据更为直观,让人更容易做出判断) 
    5.pandas库的基本使用(此项为非爬虫必要,但是为数据分析必学)

    五、网页分析

      首先我们打开我们的目标网页→万科百度百科历史版本。 
    这里写图片描述
       看上去一切正常,然后我们查看url,也有之前所讲的规律,但是真的一切正常了吗? 
    这里写图片描述
    这里写图片描述
       如果你把这个网页当作静态页面来做那肯定完蛋了,因为我一开始就是这么做的,当你查询第一页的代码时候你会发现一切正常,然而在你查询第二页的代码的时候,你会发现一个事实就是——你所看到的第二页甚至直到最后一页的最后代码都是相同的,有没有觉得违背了常识?

    六、追踪

      其实不然,这是很正常的事情,很多页面都会做成动态的,使用json或其他等文件来传输数据(不尽准确,也可能是用java、JavaScript等代码调用端口等等),这样子更安全些。 
      到了这一步很多人都会选择使用fiddle等第三方软件来抓包这样子方便点,但是这里笔者比较难,直接在控制者平台上看就好了。 
      在一番查找之后我们锁定了我们需要的几个文件和xhr文件。

    这里写图片描述 
      很多网页的数据会藏在json里面,莫非这个也是?当然,查看之后就失败了,那么我们看到xhr里面,发现这个很熟悉的字段(当然可能是我比较熟悉)

    这里写图片描述
      明显的答案在此了,简单解读一下这条

    get historylist , 获得历史数据 
    tk 这个东西我猜是万科的quantio语句(不知道这个单词有没有拼错,实在是自己用的少,搞前后端的朋友可能认识) 
    lemmald 这不就是万科在百度里面的号码嘛 
    from 一眼就看出是第七页 
    size 显示25条消息

      这个发现非常的棒,解决了许多问题。

    七、伪装

      作为玩爬虫的人,了解反爬虫的套路是非常必要的,在这里如果你对xhr进行正常的爬虫你会发现,返回给你的是{error:xxxxx},这个时候就要警觉了,这证明你机器人的身份被百度识破了,它拒绝把数据给你,那么我们就需要进行一些简单伪装。之前讲过更改headers头,这次讲多一些。

    1.headers伪装,服务器使用这个判断你使用的浏览器,当有这个的时候,服务器会认为是浏览器正常的请求。 
    2.Referer:浏览器通过此来判断你从哪一个网页跳转过来。 
    3.ip伪装,这个只要构建好ip池就没有问题了,推荐去西刺代理查看一些所需 
    4.Cookie伪装,cookie是服务器用来辨别你此时的状态的,比如你已经登录啊,什么的,每一次向服务器请求cookie都会随之更新。

      最常用的就是上面几个了,上面从上到下越来越难整,在此面对百度,仅仅只是改变headers显然是不行的,于是我添加了Referer和cookie码(关键是两个月前建立的IP池已经废掉了,懒得整)。 
      好,做到这里我们发现我们可以正常的获得数据了。

    八、文本匹配

      不得不说,解决上面的问题之后,文本匹配成为了最为简单的事情了。 
    这里写图片描述

      其实这是一个类似词典的格式了,但是懒得思考的笔者,决定使用简单粗暴的正则表达式。

    九、转化时间戳

      这个时候我们会发现,再creattime那里给的时间是个什么鬼? 
      但是仔细一思考你会发现这是一个时间戳

    python的时间戳:从1970年1月1日上午12:00到现在的秒数

      是不是很崩溃? 
      不过还好决解这个问题只需要几段简短的代码 
    这里写图片描述 
      输入时间戳,好了,问题解决了。

    十、画图、做csv

      图

    这里写图片描述

      csv

    这里写图片描述

    十一、总结和代码

      感觉这次爬虫还行,时隔两个多月我还能想起来实属不易

  • 相关阅读:
    AC 自动机
    [P4735] 最大异或和
    [HNOI2006] 最短母串问题
    [SHOI2002] 取石子游戏
    [NOI2014] 动物园
    [BZOJ2839] 集合计数
    【Spark】object not serializable (class: A)
    【Hbase】Master startup cannot progress, in holding-pattern until region onlined.
    Hbase 各个角色的工作。
    hbase region均衡机制
  • 原文地址:https://www.cnblogs.com/xinxihua/p/13855591.html
Copyright © 2011-2022 走看看