Python爬虫爬取动态页面思路+实例(一)

2023-05-16

简介

有时候,我们天真无邪的使用urllib库或Scrapy下载HTML网页时会发现,我们要提取的网页元素并不在我们下载到的HTML之中,尽管它们在浏览器里看起来唾手可得。

这说明我们想要的元素是在我们的某些操作下通过js事件动态生成的。举个例子,我们在刷QQ空间或者微博评论的时候,一直往下刷,网页越来越长,内容越来越多,就是这个让人又爱又恨的动态加载。

爬取动态页面目前来说有两种方法

  1. 分析页面请求(这篇介绍这个)
  2. selenium模拟浏览器行为(霸王硬上弓,以后再说)

言归正传,下面介绍一下通过分析页面请求的方法爬取动态加载页面的思路。中心思想就是找到那个发请求的javascript文件所发的请求。

举两个例子,京东评论和上证股票。

后注:本文的两个例子都是get请求,可以显示的在浏览器中查看效果,如果是post请求,需要我们在程序中构造数据,构造方法可以参考我从前的一篇博文Scrapy定向爬虫教程(六)——分析表单并回帖。

京东评论

这是一个比较简单的例子。

首先我们随便找一个热卖的商品,评论比较多。

就这个吧威刚(ADATA) SU800 256G 3D NAND SATA3固态硬盘。

点进去看看这个页面现在的状况

图一

滚动条给的第一印象感觉这页仿佛没多少内容。

键盘F12打开开发者工具,选择Network选项卡,选择JS(3月12日补:除JS选项卡还有可能在XHR选项卡中,当然也可以通过其它抓包工具),如下图

图二

然后,我们来拖动右侧的滚动条,这时就会发现,开发者工具里出现了新的js请求(还挺多的),不过草草翻译一下,很容易就能看出来哪个是取评论的,如下图

图三

好,复制出js请求的目标url

图四

在浏览器中打开,发现我们想要的数据就在这里,如下图

图五

这整个页面是一个json格式的数据,对于京东来说,当用户下拉页面时,触发一个js事件,向服务器发送上面的请求取数据,然后通过一定的js逻辑把取到的这些json数据填充到HTML页面当中。对于我们Spider来说,我们要做的就是把这些json数据整理提取。

在实际应用中,当然我们不可能去每个页面里找出来这个js发起的请求目标地址,所以我们需要分析这个请求地址的规律,一般情况下规律是比较好找的,因为规律太复杂服务方维护也难。那我们就来看一下京东这个请求:

https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv337&productId=3311073&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0

挺长的一个GET请求,不过参数命名都很规范,产品ID,评论页码什么的,因为我这里只是举个例子,我就不一个一个去研究了~

思路有了,就按照正常的爬虫去写就好了,发请求,得到响应,解析数据,后续处理等等……

上证股票

这是前段时间一位道友问我的一个问题,感觉还是挺有嚼头的,比上例要难。

目标网址:上海证券交易所

目的是把每一页的股票信息都得到,看似很简单,但是通过查看源代码发现,每一页的链接在源代码里是看不到的。如下图

图六

ok,又是js动态加载,在源代码里不显示,不过一定躲不过我们的开发者工具,按照上面京东的思路,切到Network、js选项卡,点击页码,获得请求地址,一切行云流水,如下图

图七

然而,当我们复制出这个url,在浏览器中打开的时候,浏览器呈现的信息却是:

图八

403错误!奇哉怪也!

究其原因,403状态码什么意思呢?意思就是说,本服务器知道你发来这一串url想找啥呢,但是老子就不给你!

怎么办,有办法~

想想看,为什么我们在那个页面上点击第二页第三页的时候能够正常的获取到数据?为什么我们直接请求不行?都是同一个浏览器呀。

问题就在于,浏览器通过上一个页面发起的请求和单独发的请求,头信息(request header)是不同的,比方说cookie、refer这些字段,服务器就通过这些就把我们的请求过滤掉了。

浏览器如此,我们的爬虫也是如此,最后我解决这个问题的方法是给爬虫设定详细的请求头(从我们能请求到的原始页获得),包括cookie,refer等,终于成功的得到了返回的json数据。

这份代码是用python3的urllib写的,我只帮他写了取一页的数据,逻辑他自己去写了。如下,看官不妨试试将头信息去掉~

import urllib.request

Cookie = "PHPStat_First_Time_10000011=1480428327337; PHPStat_Cookie_Global_User_Id=_ck16112922052713449617789740328; PHPStat_Return_Time_10000011=1480428327337; PHPStat_Main_Website_10000011=_ck16112922052713449617789740328%7C10000011%7C%7C%7C; VISITED_COMPANY_CODE=%5B%22600064%22%5D; VISITED_STOCK_CODE=%5B%22600064%22%5D; seecookie=%5B600064%5D%3A%u5357%u4EAC%u9AD8%u79D1; _trs_uv=ke6m_532_iw3ksw7h; VISITED_MENU=%5B%228451%22%2C%229055%22%2C%229062%22%2C%229729%22%2C%228528%22%5D"

url = "http://query.sse.com.cn/security/stock/getStockListData2.do?&jsonCallBack=jsonpCallback41883&isPagination=true&stockCode=&csrcCode=&areaName=&stockType=1&pageHelp.cacheSize=1&pageHelp.beginPage=3&pageHelp.pageSize=25&pageHelp.pageNo=3&pageHelp.endPage=31&_=1480431103024"

headers = {
    'User-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36',
    'Cookie': Cookie,
    'Connection': 'keep-alive',
    'Accept': '*/*',
    'Accept-Encoding': 'gzip, deflate, sdch',
    'Accept-Language': 'zh-CN,zh;q=0.8',
    'Host': 'query.sse.com.cn',
    'Referer': 'http://www.sse.com.cn/assortment/stock/list/share/'
}

req = urllib.request.Request(url,None,headers)
response = urllib.request.urlopen(req)
the_page = response.read()
print(the_page.decode("utf8"))

结语

还是那句话,通过分析页面请求的方法爬取动态加载页面的思路。中心思想就是找到那个发请求的javascript文件所发的请求。然后利用我们既有的爬虫知识去构造请求就可以了。

临近考试,写作较为匆忙。如果本文有叙述不清或者不正确的地方,还请批评指正。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python爬虫爬取动态页面思路+实例(一) 的相关文章

随机推荐

  • Windows update 0x8024401c 0x80244019

    Windows 更新失败 报错 0x8024401c 0x80244019 以系统管理员身份运行 net stop wuauserv reg delete f HKEY LOCAL MACHINE span class token punc
  • K8s常见面试题20问

    K8s常见面试题19问 收集了一些K8s常见问题和同学们面试常被问到的问题 如果有新的面试题私聊或者留言给我 1 Docker和虚拟机有那些不同 虚拟化环境下每个 VM 是一台完整的计算机 xff0c 在虚拟化硬件之上运行所有组件 xff0
  • Dockerfile常用命令

    Dockerfile常用命令 1 Dockerfile Dockerfile是一个文本文件 用一组指令来完成镜像的构建 每一条指令构建一层镜像 所有尽量将相同的命令合并成一行以减少中间镜像的层数 2 From 必须 指定基础镜像即我从哪里可
  • Kubesphere流水线实现蓝绿发布

    Kubesphere流水线实现蓝绿发布 1 Gitlab仓库准备 1 1 创建仓库 新建空白项目 名字随便取 greenweb 复制克隆地址 http 192 168 31 199 deploy greenweb git 1 2 初始化并上
  • 【NetWorkX实例(3)】图、边、节点等相关方法

    更全面的NetworkX中文使用手册 xff0c 请收藏 xff1a NetworkX中文使用手册 在 NetWorkX实例 1 基础操作一文中 xff0c 介绍了networkx中图的生成 xff0c 下面就介绍一下图 边 节点等相关方法
  • Python调用外部EXE程序遍历窗体及控件并获取控件信息。

    背景 我的工作中经常手工运行一个windows程序 xff08 密码生成工具 xff09 xff0c 获取该程序的计算结果 xff0c 手工填到登录表单的中 该程序非常久远 xff0c 已无人维护 根据凡是重复2次以上的工作都应该自动化原则
  • J-Link RTT Viewer使用教程(附代码)

    目录 RTT Real Time Transfer 简介 使用教程 常用API介绍 RTT缓冲大小修改 使用printf重定向 官方例程 RTT Real Time Transfer 简介 平常调试代码中使用串口打印log xff0c 往往
  • [问题记录]JNI的整型数组返回出现stack corruption

    问题记录 JNI的整型数组返回出现stack corruption 在项目中编写了一个返回整型数组的JNI代码 xff0c 但是在测试时发现问题 xff0c 会产生stack corruption错误 xff0c debug之后发现是ret
  • Android逆向系列--JDWP协议

    Android逆向系列 JDWP协议 背景简介使用源码调用参考 背景 经常会遇到各种各样需要使用jdwp知识的场景 xff0c 比如调试Java源码 比如抓帧等等 xff0c 这些关联知识点通常都会极其复杂 xff0c 如果不能很好的了解j
  • 银河麒麟V10桌面版系统将用户开发Qt界面程序添加为开机自启动

    银河麒麟V10桌面版系统将用户开发Qt界面程序添加为开机自启动 银河麒麟V10桌面版系统允许用户开发自己的qt界面程序并将其添加为开机自启动 这样 xff0c 每次开机后 xff0c 用户开发的qt界面程序会自动启动 xff0c 无需手动打
  • 环境搭建-Linux-Mysql安装-10.3.7-MariaDB-log MariaDB Server

    10 3 7 MariaDB log MariaDB Server 安装记录 linux 系统 CentOS7 无脑安装 sudo yum install y redhat lsbsudo yum install y net tools关闭
  • 200506--iOS之NSAttributedString类

    Class NSAttributedString A string that has associated attributes such as visual style hyperlinks or accessibility data f
  • 批处理文件(bat)之全彩滚动我爱你

    前言 xff1a 本文章分享利用bat文件制作炫彩的全屏滚动文字效果 xff0c 具体效果可关注我的抖音 xff0c 查看短视频介绍 代码实现 xff1a 64 echo off amp setlocal enabledelayedexpa
  • @Bean放入其引用Bean中初始化失败分析

    以下讨论的问题及术语均在SpringBoot框架下 xff0c 问题十分小众 xff0c 仅做整理记录 1 先说重点 Bean依赖属性的注入顺序 xff0c 与代码定义顺序无关 xff1b 最好是将 64 Bean注解配置的Bean放在 6
  • 使用BeanCopier抛出NullPointerException溯源

    问题 使用cglib提供的net sf cglib beans BeanCopier进行对象拷贝时 xff0c 抛出如下异常 xff1a Exception in thread span class token string 34 main
  • 自制Alfred/Wox插件推荐

    最近上手Alfred的使用 xff0c 日常工作中存在很多需要高频执行的连续性动作 xff0c 将这一系列动作封装成Workflow xff0c 通过命令触发 xff0c 对提升效率确有很大帮助 自己封装了一些简单的Workflow xff
  • Python删除某一目录下的空文件(夹)

    Python删除某一目录下的空文件 夹 用途 输入文件夹路径 xff0c 将此文件夹下所有的空文件夹和空文件删除 xff0c 算是文件操作的一个习作吧 我拿它做什么就不广而告之了 代码 span class hljs comment cod
  • Win10下pip的安装

    pip简介 pip 是一个安装和管理 Python 包的工具 xff0c 通过pip我们能够轻松地下载和卸载python的第三方包 原料 64位Windows10 专业版python 2 7 12 下载安装包 进入python官方网站 xf
  • Windows10通过一根网线进行远程桌面连接

    目的 xff1a 想要通过笔记本访问我台式机 给台式机设置IP地址 xff1a IP xff1a 192 168 0 2 子网掩码 xff1a 255 255 255 0 默认网关 xff1a 192 168 0 2 给笔记本设置ip地址
  • Python爬虫爬取动态页面思路+实例(一)

    简介 有时候 xff0c 我们天真无邪的使用urllib库或Scrapy下载HTML网页时会发现 xff0c 我们要提取的网页元素并不在我们下载到的HTML之中 xff0c 尽管它们在浏览器里看起来唾手可得 这说明我们想要的元素是在我们的某