说明

在上一篇文章中,我们对PPT网站的模板进行了爬取,该网站中,每个模板的详情网页直接包含目标资源的链接,因此只需遍历列表中的模板,依次提取链接即可,是一种十分简单的爬虫程序。对于某些稍微复杂些的网页,他们的资源链接并不会直接显示在HTML代码中,本次介绍这种略复杂网页的资源爬取。

核心思路

其实对于这种网页中资源链接的查找,我认为也并不复杂。众所周知,一个网络资源的下载是通过网络间的通讯实现的,即计算机网络中的三次握手,request和response。而我们要找到的就是代码中的request请求,其中必然包含了目标资源的链接。找出request请求是我们的主要任务,其他环节则与上一章所述基本相同。

找到网页中隐藏的目标资源链接

我们以“巨潮资讯网”为例,网站链接为:http://www.cninfo.com.cn/new/index
任意输入一个企业的代码,如600018(上港集团),获得如下界面:

本次实践的目标是:从巨潮资讯网爬取给定代码列表所代表的企业的2018年年度报告。
具体分析过程如下:
1.查看该详情网页源代码,重点关注HTML代码中是否出现“2018年年度报告”的字样。最终定位到HTML代码中的如下部分:

可以看到,网页中上港集团的公告列表是通过分页插件实现的,包括我们想要的2018年年度报告在内的公告信息并没有在HTML代码中展示,我们想要的目标资源链接(2018年度报告的PDF文件)显然也无法直接通过HTML代码找到。
我们在该网页找到“2018年年度报告”的公告,并点击进入,发现该页面有PDF文件的下载按钮,继续查看源代码,定位“下载”按钮到如下位置:

同样无法直接看到资源的链接。
2.查看网页的JS代码
网页的网络请求通常都在JS代码中实现,因此我们确定无法从HTML中获取目标链接后应继续进行下一步,查看网页JS代码。
一个HTML中可能存在多个JS文件的链接,这些JS文件的命名通常都是有规律可循的,通过分析目标区域的位置、内容,结合JS文件名称,从最有可能的JS文件看起,寻找request请求。
我们最终想要的是PDF文件的下载链接,毫无疑问我们应优先研究公告详情界面的JS代码。依次查看最底端的三个JS文件。

在notice-detail.js中发现了下载资源的链接,如图:

但是,很显然我们并不知道bulletinId和announceTime这两个参数的取值。猜测这两个参数为公告ID与公告发布时间。浏览完这个JS文件后仍然找不到这两个参数,我们明智的选择去公告列表界面寻找想要的信息,因为,点击公告标题,跳转到详情界面,必然需要包含公告ID这个参数。

在样例HTML网页中,我最终锁定了名为search_new.js的代码文件,在该文件中找到了公告列表的获取代码,如下:

可以看到代码中利用ajax发送了一个get方式的request请求,通过继续查看该文件可以获取到其中每个参数的具体内容及赋值方式,将该请求拼接成一个完整的url(不知道怎么拼接的就去了解下request的两种方式),样例如下:
http://www.cninfo.com.cn/new/fulltextSearch/full?searchkey=600018&sdate=2019-01-01&edate=2019-04-25&isfulltext=true&sortName=nothing&sortType=desc&pageNum=1
需要注意的是,此处获取到的是代码为600018的公司第一页公告的列表,response返回的内容是一系列JSON字符串,如下:

我们需要依次查看该公司每一页公告列表直至找到我们需要的“2018年年度报告”的公告,如下:

我们最终获取到了需要的bulletinId和announceTime这两个重要参数。

代码示例

# -*- coding: utf-8 -*-
"""
Created on Mon Dec  3 16:16:24 2018@author: Wang
"""import re
import requests
import hashlib
import time
import json
import os
from concurrent.futures import ThreadPoolExecutorp = ThreadPoolExecutor(1)  # 定义线程池最多容纳30个线程
codelist = []# 检测连接是否成功
def get_Index(url):respose = requests.get(url)if respose.status_code == 200:print("网站链接成功")#解析JSONres = respose.textdata = json.loads(res)#获取每一界面for i in range(1, int(data['totalpages']) + 1):page_url = url[0:len(url)-1]+str(i)page_respose = requests.get(page_url)if page_respose.status_code == 200:page_res=page_respose.textpage_data=json.loads(page_res)for item in page_data['announcements']:temp=item['announcementTitle'].split(':')if temp[1]=="2018年年度报告":announcementId=item['announcementId']timeStamp = float(item['announcementTime']/1000)timeArray = time.localtime(timeStamp)announcementTime=time.strftime("%Y-%m-%d", timeArray)#下载链接downloadUrl='http://www.cninfo.com.cn/new/announcement/download?bulletinId='+announcementId+'&announceTime='+announcementTime#下载announcement=requests.get(downloadUrl)if announcement.status_code==200:m = hashlib.md5();m.update(downloadUrl.encode('utf-8'))m.update(str(time.time()).encode('utf-8'))#filename = r'%s.pdf' % m.hexdigest()filename = r'%s.pdf' %item['secName']filepath = r'D:\\report\\%s' % filenamewith open(filepath, 'wb') as f:f.write(announcement.content)print("下载成功")breakelse:print("无法下载")breakelse:print("获取界面失败")else:print("无法链接")return# 将文件保存
def save(ppt_url):ppt = requests.get(ppt_url)if ppt.status_code == 200:m = hashlib.md5();m.update(ppt_url.encode('utf-8'))m.update(str(time.time()).encode('utf-8'))filename = r'%s.zip' % m.hexdigest()filepath = r'D:\\ppt\\%s' % filenamewith open(filepath, 'wb') as f:f.write(ppt.content)else:print("无法下载")returndef main():f=open('codelist.txt','r')lines=f.readlines();for line in lines:line=line.strip().replace('\n','')codelist.append(line)f.close()#存储路径if not os.path.exists('d:/report'):os.makedirs('d:/report')for i in codelist:p.submit(get_Index, 'http://www.cninfo.com.cn/new/fulltextSearch/full?searchkey=%s&sdate=2019-01-01&edate=2019-04-25&isfulltext=true&sortName=nothing&sortType=desc&pageNum=1' % i)if __name__ == '__main__':main()

本小节到此结束,后续如果继续研究爬虫,本文会适时更新。

小白学Python之爬虫篇(二)——隐式资源链接查找与爬取相关推荐

  1. 小白学Python之爬虫篇(一)——爬取PPT网站模板

    说明 菜狗大学生一枚,本着用什么学什么的原则,对之前简单学习的爬虫进行略微系统的整理,一方面方便以后复习,另一方面也希望给需要的人一点参考,毕竟看了那么多大佬的博客,是时候开始回报社会了哈哈哈(尴尬笑 ...

  2. Python网络爬虫数据采集实战(八):Scrapy框架爬取QQ音乐存入MongoDB

    通过前七章的学习,相信大家对整个爬虫有了一个比较全貌的了解 ,其中分别涉及四个案例:静态网页爬取.动态Ajax网页爬取.Selenium浏览器模拟爬取和Fillder今日头条app爬取,基本涵盖了爬虫 ...

  3. 小白学python(爬虫写着玩系列1)

    最近周末没啥事情,跟着bilbil大学里面的视频跟着敲,从爬虫到数据处理再到数据可视化,感觉把python前端的知识大概了解下吧(大佬勿喷).现在头大不行,一堆东西都只是浅尝辄止,感觉这样不太行,毕竟 ...

  4. Python高级特性与网络爬虫(二):使用Selenium自动化测试工具爬取一号店商品信息

    上一篇介绍了Ajax动态渲染的页面的分析和爬取,通过JavaScript动态渲染的页面的方式不只有ajax这一种,还有很多其他的方式,分析他们的网页结构和加密参数难度非常大,为了解决这样的页面的数据爬 ...

  5. python网络爬虫学习笔记(十一):Ajax数据爬取

    文章目录 1.基本介绍 2.基本原理 3.实战 有时候我们在用requests抓取页面的时候,得到的结果可能和在浏览器中看到的不一样:在浏览器中可以看到正常显示的页面数据,但是使用requests得到 ...

  6. Python网络爬虫与信息提取(9)—— scrapy实战之爬取黑马程序员网页讲师信息

    前言 之前是使用request库爬取网页,但是大型的网络爬虫使用框架爬取会事半功倍,今天实战爬取这个网页讲师的信息:https://www.itcast.cn/channel/teacher.shtm ...

  7. Python网络爬虫与信息提取(14)—— 百度搜索关键字爬取并整理摘要、标题、关键字等

    前言 百度搜索的内容一般包含标题.摘要.网址.时间信息,本次主要实现根据搜索整理30页左右百度的搜索条例成csv文档. 原理 百度爬虫比较简单,模拟浏览器访问就可以爬取到所要的数据,访问某个关键字第几 ...

  8. 【零基础学Python】爬虫篇 :第十四节--爬虫+词云解决实际问题

    十行代码帮助小姐姐给偶像送上最真挚的礼物----爬虫词云齐上阵,熬夜精心制作 905.png#pic_center) 故事背景 最近嘛,有位朋友找我帮忙嘛,希望我帮她做一份礼物,送给一直鼓舞着她不断向 ...

  9. 小白学python(爬虫知识1(大体框架)

    定义框架 主函数: 1.初始网址 2.获取数据 3.保存数据 大体流程 from bs4 import BeautifulSoup # 解析网页 import re # 正则提取 import url ...

最新文章

  1. OSI模型第四层传输层--TCP协议
  2. 浅析网络推广外包公司如何完成营销型网站建设完成网络推广外包?
  3. Java的TheadLocal使用
  4. idea 新建的java项目没发run_IDEA 如何创建一个普通的 Java 项目,及创建 Java 文件并运行...
  5. 岗位推荐 | 百度招聘计算机视觉、深度学习算法工程师(可实习)
  6. maven 配置文件 settings.xml
  7. java中userservice是什么,【图片】求助大神~~我在Reaml中注入userService对象启动tomcat就报错【java吧】_百度贴吧...
  8. Ubuntu下Arm-Linux-GCC交叉编译环境的搭建
  9. Atitit 事务的一些概念 目录 1. 事务的另一个特性:数据隔离级别 1 2. Spring五个事务隔离级别和七个事务传播行为 1 3. 在TransactionDefinition接口中定义了
  10. 【课程作业|图论】第四章课后习题
  11. 企业网站建设流程是什么?三个流程要知道
  12. 探索 Sa-Token (三) 权限认证原理
  13. 基于ssm+shiro+activiti的办公自动化系统
  14. 前端技术(7) : 省市区联动并设置默认值II
  15. 微信怎么关闭wifi定位服务器,WiFi定位到底怎么做的,看完这个你就知道了
  16. 《策略驱动型数据中心——ACI技术详解》一1.3 数据中心设计
  17. 关于我用python表白成功这件事【表白成功】
  18. BIOS密码清除方法--unlock6的使用.
  19. 超强下载神器,解决你的文档下载焦虑(下载百度文库)
  20. pgadmin数据输出不存在了?

热门文章

  1. Java 2.3(将英尺转换成米)编写程序,读入英尺数,将其转换为米数并显示结果。一英尺等于0.305米。下面是运行示例:
  2. Meet Surprise品牌饰品让你展现自己的美
  3. 如何根据包名屏蔽全面屏手势
  4. MinIO未授权SSRF漏洞(CVE-2021-21287)复现
  5. 宁波银行技术面经-2021.8
  6. 【Java】数据存储单位换算关系
  7. 还敢用手机吗!手机也能炸爆米花?!视频!
  8. 遥感影像数据集-DOTA
  9. StopWatch的使用
  10. java 润乾报表打印4.5_润乾报表中常见的打印类问题的总结| 润乾软件 | 学步园...