博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用 scrapy 爬微信公众号的内容
阅读量:7023 次
发布时间:2019-06-28

本文共 3054 字,大约阅读时间需要 10 分钟。

抓包工具配置

1. Fiddler(windows)

  • 安装:
  • 配置:
# 1. 允许远程连接Tools > Fiddler Options > Connections > Allow remote computers to connect# 2. 支持 HTTPSTools > Fiddler Options > HTTPS > Decrypt HTTPS traffic# 3. 重启restart Fiddler# 4. 手机配置手机 wifi 设置代理,服务器地址为为电脑 ip 地址 xxx.xxx.xxx.xxx,端口为 8888# 5. 下载根证书safari 打开 xxx.xxx.xxx.xxx:8888, 下载安装根证书# 6. 完全信任证书设置 > 通用 > 关于本机 > 证书信任设置 > 针对根证书启用完全信任复制代码

2.Charles(MacOS)

  • 安装:
  • 配置:
# 1. 手机配置手机 wifi 设置代理,服务器地址为为电脑 ip 地址 xxx.xxx.xxx.xxx,端口为 8888# 2. 手机安装 SSL 证书Help -> SSL Proxying -> Install Charles Root Certificate on a Mobile Devicesafari 打开地址 chls.pro/ssl,下载根证书# 3. 完全信任证书设置 > 通用 > 关于本机 > 证书信任设置 > 针对根证书启用完全信任# 4. 设置ProxyProxy -> SSL Proxying Settings...,勾选 Enable SSL Proxying# 5. 添加域名Host: https://mp.weixin.qq.com  Port: 443复制代码

scrapy(python package) 使用

  • 官网介绍:
An open source and collaborative framework for extracting the data you need from websites.In a fast, simple, yet extensible way. 复制代码
  • 使用:
# 1. 创建项目 WCSpiderscrapy startproject WCSpider# 2. 切换到项目目录cd WCSpider# 3. 创建爬虫 wechatscrapy genspider wechat mp.qq.com# 4. 设置 Agent在 settings 中打开 Agent 注释# 5. 添加 item在 items.py 中完成 item 创建    name = scrapy.Field    age = scrapy.Field    ...    # 6. 解析 response设置 start_urls在 wechat.py 中解析 response, 返回item    res = response.xpath(...)    item['name'] = res['_name']    item['age'] = res['_age']    ...    yield item    # 7. 设置管道文件在 open_spider 初始化数据库等    self.f = open("file.json","w")在 close_spider 关闭数据库等    self.f.close()在 deal_spider 处理 item    self.f.write(json.dumps(dict(item)))在 settings 中启用该管道文件复制代码

公众号历史消息抓包

本次抓包以 Charles 为例。

1.获取首页链接

如上图所示,需要的内容在 var msgList = '{...}' 中,由于并不是标准 html,所以这里 xpath 并不好用,可尝试正则表达式快速取出内容。

rex = "msgList = '({.*?})'"pattern = re.compile(pattern=rex, flags=re.S)match = pattern.search(response.text)复制代码

取出并格式化匹配项,本例中公众号中的内容都是以文本的形式发送,所以直接取 comm_msg_info 内容,具体请根据实际情况解析。

if match:    data = match.group(1)    data = html.unescape(data)    data = json.loads(data)    articles = data.get("list")    item = WechatItem()    for article in articles:        info = article["comm_msg_info"]        content = html.unescape(info["content"])        # 将获取的数据传递给管道        item["content"] = content        item["we_id"] = info["id"]        item["datetime"] = info["datetime"]        item["we_type"] = info["type"]        yield item复制代码

2. 获取上拉刷新链接

向上滚动历史列表,当到接近最底部时,会自动获取更多内容,此时可以通过抓包获取内容。

如图所示,返回的是 json 格式内容,通过 can_msg_continue 确定是否有后续内容,general_msg_list 是解析的内容。通过分析多个加载历史可知,offset 控制加载数据的位置。 --本例中使用 python 第三方库 requests 加载数据

def getMore():   # header	header = sj_utils.header2dict(base_header)	response = requests.get(getUrl(),headers = header, verify = False)		js = json.loads(response.text)	if js["errmsg"] == "ok":		alist = js["general_msg_list"] # 内容是 json 字符串,需要先转为 json		alist = json.loads(alist)["list"]		for item in alist:		  # 具体处理			print(item["comm_msg_info"]["content"])	if js["can_msg_continue"]:	   url_offset += 10 # 设置偏移量		getMore()复制代码

3.处理数据

开头已经介绍了 scrapy 使用,通过管道文件可以轻松处理爬取内容。

# 保存 json 文件self.f.write(json.dumps(dict(item)))复制代码

参考

转载于:https://juejin.im/post/5a7926dff265da4e7d602487

你可能感兴趣的文章
EXCEL IF 函数 模糊查询
查看>>
Angularjs 中的 controller
查看>>
ZigZag Conversion
查看>>
SQLLoader8(加载的数据中有换行符处理方法)
查看>>
表的创建、修改及约束
查看>>
Java
查看>>
nio简介
查看>>
用jquery如何获得服务器控件的aspnet的Id进行操作
查看>>
崩坏3mmd中的渲染技术研究
查看>>
Linux中断 - softirq
查看>>
《条目十八》避免使用vector<bool>
查看>>
Hadoop_14_MapReduce框架结构及其运行流程
查看>>
MVC中View下的MasterPage取不到RouteData,汗!
查看>>
到前面去,
查看>>
Eclipse add external jars导致运行出现java.lang.NoClassDefFoundError的解决方法
查看>>
php 跨域、跨子域,跨服务器读取session
查看>>
第一个Python程序——博客自动访问脚本
查看>>
CocoaPods更新报错解决
查看>>
并发编程——ConcurrentHashMap#addCount() 分析
查看>>
eclipse比较实用的几个快捷键
查看>>