利用 Requests 简单获取行行查的行业数据

仅供学习,勿作他用,如违反相关规定请联系本人删除
首先放行行查链接:https://www.hanghangcha.com

这是一个关于行业报告数据库查询的网站

目标

我们的目标是将里面的行业报告pdf数据全部保存至本地,并且可以实现相应的按分类、关键字查询功能。

1. 前期准备

为了防止违反相关规定,我们直接请求了 https://www.hanghangcha.com/robots.txt 查看到行行查是没有禁止爬虫的,所以可以放心爬取。

首先这个网站的数据是不能直接获取的,需要微信登陆。登录后刷新页面,我们发现了两个问题

  1. 接口都是加密的
  2. 非会员只能看到很少的数据

由于本次爬虫仅供学习用途,部分数据已经足够了,所以我们可以忽略第二个问题直接解决第一个

2. 接口加密问题

我们随便点开一个接口就发现,返回的数据都是经过加密的,所以我们的第一个问题就是如何破解加密数据。

首先常规套路,直接去返回的js文件里面找到对应的加密方式,破解即可。
我们直接打开js文件夹,找到第一个js文件。
这里注意一个编程习惯

一般而言,我们的加解密方法无非就是加密、解密的英文表述,直接翻译后搜索几次页面就可以找到了

美化过js之后,我们查询一下有没有 ecryp 相关的方法,如果找不到可以减少前后字母去匹配,这里我就大概找了一下,去掉了首位字母。果然,我们发现了加密方法。

虽然js经过了压缩,但是我们还是可以辨认出一些关键信息。

  1. 加密方式是 AES,模式是ECB,填充方式是 Pkcs7
  2. 4383 行的方法我们可以看出 密钥是 aos 三个字符串拼接而成,而这三个变量在上面都定义好了,所以可以直接得到密钥为 3sd&d24h@$udD2s*

有了这些数据,我们就可以先尝试获取一下数据了。

3. 尝试获取接口数据

有了上面的信息,其实下面的过程就是按部就班的了,我在这里简单写一下,就拿 https://api.hanghangcha.com/hhc/tag 这个接口做一下实验。

  1. 先找到接口的Cookies,复制到我们的代码中,由于request的Cookies参数是一个字典,我们可以稍微转换一下,切分字符串转成字典。
  2. 将请求回来的加密部分通过AES解密出来,然后 json转list,这里需要注意解密出来的json需要去除结尾的控制字符,否则会出现转换失败的情况。

下面附上源码

import base64
import json
import reimport requests
from Crypto.Cipher import AESdef format_cookies() -> dict:"""格式化cookies:return:"""result = {}cookies_str = '**********************************************************'for el in cookies_str.split(';'):key, value = el.split("=")result[key.strip()] = valuereturn resultdef deal_control_char(s):# 去除控制字符temp = re.sub('[\x00-\x09|\x0b-\x0c|\x0e-\x1f]', '', s)return tempdef decrypt(info: str) -> list:"解密"key = '3sd&d24h@$udD2s*'.encode(encoding='utf-8')cipher = AES.new(key, mode=AES.MODE_ECB)json_str = str(cipher.decrypt(base64.b64decode(info)), encoding='utf-8')return json.loads(deal_control_char(json_str))if __name__ == '__main__':cookies = format_cookies()res = requests.get("https://api.hanghangcha.com/hhc/tag", cookies=cookies)if res.ok:#  获取加密信息payload = json.loads(res.content)['data']data = decrypt(payload)print(data)
{'id': 38, 'createdDate': '2018-12-01 15:40:28.000', 'lastModifiedDate': '2018-12-01 15:40:28.000', 'tagType': 'category', 'lv': 1, 'name': '信息科技','parentId': None, 'defaultFile': False}

通过分析数据我们可以知道,这是获取所有菜单数据的接口,并且是通过树状结构组织数据的。

4.获取 pdf 的json数据

下面我们开始获取pdf数据
重复的部分就不说了,利用上面的方法获取 https://api.hanghangcha.com/hhc/api/member/pdfResources/pdfWithTags 这个接口的数据,说一下需要注意的地方

  1. 把参数也复制过来,这个接口的参数是通过get请求传一个json字符串作为参数的
  2. 需要传 User-Agent,否则会出现401的情况

然后我们就获得了如下格式的数据

{"id": 74887,"md5": "dd4a47cd8ac6a4be592183f8c030b50e","lastmodifieddate": "2021-05-13T02:15:32.000Z","pdfdate": "2021-05-11T16:00:00.000Z","pdfname": "20210512-渤海证券-食品饮料行业月报:白酒批价有望持续上行大众食品成本压力仍存.pdf","pdfurl": "/home/data/PDF/2021/dd4a47cd8ac6a4be592183f8c030b50e.pdf","tags": [39,83,86,88],"hasStore": false,"articles": []
}

将数据存入es中。

分析数据我们可以知道,tags 字段其实存的就是菜单的id,这样可以直接通过 id查询对应菜单下的pdf,而 pdf 的存储路径,需要我们进一步获取。

4.下载pdf

我们随便打开一个pdf,虽然在网址上看不到url,但是我们打开控制台,还是可以找到形如 https://data.hanghangcha.com/PDF/2021/6f237313bb55a465a9085b2a1971221d.pdf 这样的url,这就是存储pdf的真实路径,我们只需要将上面的路径替换为我们之前爬取的 pdfurl 字段就,就可以利用python 批量下载了。

(完)

Python爬虫-行行查相关推荐

  1. Python 爬虫数据写入csv文件中文乱码解决以及天眼查爬虫数据写入csv

    python爬虫数据写入csv文件中文乱码,用'utf-8'在pycharm中打开文件没有问题,但是用excel打开却出现了问题,以下为解决方法. (最近在练习爬虫,这个博文是对自己学习的记录和分享, ...

  2. Python常用网络爬虫速查表下载

    Python常用网络爬虫速查表下载 Post方法: Get方法: css选择器 beautiful soup选择器 xpath选择器 可以将图片打印出来,放在桌面看 下载地址: 一天掌握python网 ...

  3. Python爬虫(9)selenium爬虫后数据,存入mongodb实现增删改查

    之前的文章有关于更多操作方式详细解答,本篇基于前面的知识点进行操作,如果不了解可以先看之前的文章 Python爬虫(1)一次性搞定Selenium(新版)8种find_element元素定位方式 Py ...

  4. 基于python爬虫数据处理_基于Python爬虫的校园数据获取

    苏艺航 徐海蛟 何佳蕾 杨振宇 王佳鹏 摘要:随着移动时代的到来,只适配了电脑网页.性能羸弱的校园教务系统,已经不能满足学生们的移动查询需求.为此,设计了一种基于网络爬虫的高实用性查询系統.它首先通过 ...

  5. python简介怎么写-python爬虫简历怎么写

    python爬虫简历怎么写? python爬虫简历如下: 1. 基本信息 求职岗位:Python爬虫工程师(全职) 期望薪资:15000以上 姓名:xx 手机号码:xxxx 邮箱:xxxx@qq.co ...

  6. python 爬虫 scrapy 和 requsts 哪个快_Scrapy爬虫框架结构以及和Requests库的比较

    爬虫框架 *爬虫框架是实现爬虫功能的一个软件结构和功能组件集合 *爬虫框架是一个半成品,能够帮助用户实现专业网络爬虫 Scrapy爬虫框架结构 "5+2"结构 Spiders(用户 ...

  7. python爬虫企业级技术点_Python爬虫必备技术点(二)

    Python爬虫必备技术点[续] 一.非爬虫框架 1.1 爬虫的认知 数据请求(网络请求库) 数据解析(re/xpath/bs4) 数据存储(csv/pymysql/json??) 反反爬的策略 ip ...

  8. 【猪哥】Python爬虫入门系列

    ​学完Python基础感觉迷茫?来一起学爬虫吧,一起做些有趣的事情! 一.教程目录 二.文章汇总 第一章.爬虫介绍 1.六月分享主题:爬虫 2.HTTP详解 3.网页结构简介 4.一文带你了解爬虫 5 ...

  9. Python爬虫爬取美剧网站

    一直有爱看美剧的习惯,一方面锻炼一下英语听力,一方面打发一下时间.之前是能在视频网站上面在线看的,可是自从广电总局的限制令之后,进口的美剧英剧等貌似就不在像以前一样同步更新了. 但是,作为一个宅dia ...

最新文章

  1. 常用MySQL函数存储过程_解析MySQL存储过程、常用函数代码
  2. Android Studio编写运行测试纯java代码可带main()函数
  3. R语言使用ggplot2包使用geom_dotplot函数绘制分组点图(改变分组的次序)实战(dot plot)
  4. 提高SQLite每秒INSERT的性能?
  5. 前端笔记之NodeJS(四)MongoDB数据库Mongoose自制接口MVC架构思想|实战
  6. php restful yii,yii2 restful 风格搭建(一)
  7. wxWidgets:wxSystemOptions类用法
  8. GIT 团队协作快速入门使用
  9. go strconv
  10. 使用Prometheus和Grafana监视开放自由
  11. 音视频中的CBR,VBR,ABR
  12. JavaScript新手入门教程大全~~~
  13. CCF NOI1023 最大跨度
  14. 怎样才能容易更换DB
  15. SpringBoot 嵌入式web容器的启动原理
  16. 毕设系列之 -- 基于大数据的全国热门旅游景点数据分析与可视化
  17. c语言判断字符串是否对称,c语言 判断字符串是否中心对称
  18. nexus 启动报错 The nexus service was launched, but failed to start
  19. 实现微信公众号微信头像上传
  20. [编译原理随记]正则表达式转为NFA状态图(Thompsion构造法)

热门文章

  1. vscode配置使用教程
  2. c语言指针和结构体(B站鹏哥讲解版)
  3. 功能测试Ⅶ——WEB项目抢购与非功能测试
  4. java调用office_java 调用word
  5. 在线作图丨数据降维方法①——主成分分析PCA
  6. php输出lt;scriptgt;,4php常量
  7. 如何提升设计的层次感
  8. jsAES128加密方法
  9. linux C 可变参数配合vsnprintf的使用
  10. 腾讯数据库TcaplusDB X 大主宰·大千世界|万家决战,谁领风骚