querylist采集微信公众号文章

querylist采集微信公众号文章

分享文章:通过微信公众平台获取公众号文章的方法示例

采集交流优采云 发表了文章 • 0 个评论 • 348 次浏览 • 2020-09-20 12:00 • 来自相关话题

  如何通过微信公众平台获取官方帐户文章的示例
  我以前自己维护过一个官方帐户,但是由于我的个人关系很长时间没有更新,所以我今天起身去记住它,但是偶然发现了一种获取微信官方帐户的方法文章。
  以前有很多方法可以获取它,并且可以通过搜狗,青博,网络,客户端等来获取。这可能并不出色,但是操作简单易懂。
  因此,首先您需要拥有一个微信公众平台帐户
  微信公众平台:
  
  登录后,转到主页,然后单击“新建论坛帖子”。
  
  选择自己创建的图形:
  
  似乎是官方帐户操作教学
  进入编辑页面后,单击超链接
  
  弹出一个选择框,我们在框中输入相应的正式帐户名称,并出现相应的文章列表
  
  您感到惊讶吗?您可以打开控制台以检查请求的界面
  
  打开响应,我们需要文章链接
  
  确认数据后,我们需要分析此界面。
  感觉很简单。 GET请求带有一些参数。
  
  Fakeid是官方帐户的唯一ID,因此,如果您想直接通过名称获取文章列表,则还需要先获取伪造品。
  输入官方帐户名后,单击“搜索”。您会看到搜索界面已触发,并返回了假冒的商品。
  
  此界面不需要很多参数。
  
  接下来,我们可以使用代码来模拟上述操作。
  但是您还需要使用现有的cookie以避免登录。
  
  我尚未测试当前cookie的有效期。 Cookies可能需要及时更新。
  测试代码:
  
import requests
import json
Cookie = '请换上自己的Cookie,获取方法:直接复制下来'
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
headers = {
"Cookie": Cookie,
"User-Agent": 'Mozilla/5.0 (Linux; Android 10; YAL-AL00 Build/HUAWEIYAL-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.64 HuaweiBrowser/10.0.1.335 Mobile Safari/537.36'
}
keyword = 'pythonlx' # 公众号名字:可自定义
token = '你的token' # 获取方法:如上述 直接复制下来
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&query={}&token={}&lang=zh_CN&f=json&ajax=1'.format(keyword,token)
doc = requests.get(search_url,headers=headers).text
jstext = json.loads(doc)
fakeid = jstext['list'][0]['fakeid']
data = {
"token": token,
"lang": "zh_CN",
"f": "json",
"ajax": "1",
"action": "list_ex",
"begin": 0,
"count": "5",
"query": "",
"fakeid": fakeid,
"type": "9",
}
json_test = requests.get(url, headers=headers, params=data).text
json_test = json.loads(json_test)
print(json_test)
  这样,您可以获得最新的10篇文章文章。如果要获取更多历史记录文章,则可以修改数据中的“开始”参数,0是第一页,5是第二页,10是第三页(依此类推)
  但是,如果您想进行大规模爬网:
  请为自己和履带的速度安排一个稳定的代理人,并为可能被阻止的情况准备多个帐户。
  以上是本文的全部内容,希望对大家的学习有所帮助,希望大家都支持Ian。 查看全部

  如何通过微信公众平台获取官方帐户文章的示例
  我以前自己维护过一个官方帐户,但是由于我的个人关系很长时间没有更新,所以我今天起身去记住它,但是偶然发现了一种获取微信官方帐户的方法文章。
  以前有很多方法可以获取它,并且可以通过搜狗,青博,网络,客户端等来获取。这可能并不出色,但是操作简单易懂。
  因此,首先您需要拥有一个微信公众平台帐户
  微信公众平台:
  
  登录后,转到主页,然后单击“新建论坛帖子”。
  
  选择自己创建的图形:
  
  似乎是官方帐户操作教学
  进入编辑页面后,单击超链接
  
  弹出一个选择框,我们在框中输入相应的正式帐户名称,并出现相应的文章列表
  
  您感到惊讶吗?您可以打开控制台以检查请求的界面
  
  打开响应,我们需要文章链接
  
  确认数据后,我们需要分析此界面。
  感觉很简单。 GET请求带有一些参数。
  
  Fakeid是官方帐户的唯一ID,因此,如果您想直接通过名称获取文章列表,则还需要先获取伪造品。
  输入官方帐户名后,单击“搜索”。您会看到搜索界面已触发,并返回了假冒的商品。
  
  此界面不需要很多参数。
  
  接下来,我们可以使用代码来模拟上述操作。
  但是您还需要使用现有的cookie以避免登录。
  
  我尚未测试当前cookie的有效期。 Cookies可能需要及时更新。
  测试代码:
  
import requests
import json
Cookie = '请换上自己的Cookie,获取方法:直接复制下来'
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
headers = {
"Cookie": Cookie,
"User-Agent": 'Mozilla/5.0 (Linux; Android 10; YAL-AL00 Build/HUAWEIYAL-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.64 HuaweiBrowser/10.0.1.335 Mobile Safari/537.36'
}
keyword = 'pythonlx' # 公众号名字:可自定义
token = '你的token' # 获取方法:如上述 直接复制下来
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&query={}&token={}&lang=zh_CN&f=json&ajax=1'.format(keyword,token)
doc = requests.get(search_url,headers=headers).text
jstext = json.loads(doc)
fakeid = jstext['list'][0]['fakeid']
data = {
"token": token,
"lang": "zh_CN",
"f": "json",
"ajax": "1",
"action": "list_ex",
"begin": 0,
"count": "5",
"query": "",
"fakeid": fakeid,
"type": "9",
}
json_test = requests.get(url, headers=headers, params=data).text
json_test = json.loads(json_test)
print(json_test)
  这样,您可以获得最新的10篇文章文章。如果要获取更多历史记录文章,则可以修改数据中的“开始”参数,0是第一页,5是第二页,10是第三页(依此类推)
  但是,如果您想进行大规模爬网:
  请为自己和履带的速度安排一个稳定的代理人,并为可能被阻止的情况准备多个帐户。
  以上是本文的全部内容,希望对大家的学习有所帮助,希望大家都支持Ian。

分享方法:爬虫如何爬取微信公众号文章

采集交流优采云 发表了文章 • 0 个评论 • 176 次浏览 • 2020-09-06 21:12 • 来自相关话题

  爬虫如何抓取微信公众号文章
  第二部分文章:python爬虫如何抓取微信官方帐户文章(二)
  下一篇文章是如何连接python爬虫以实现每天抓取微信公众号的推送文章
  由于我最近在法庭上执业,因此我需要一些官方帐户数据,然后将其放入网页中以进行显示以便于查看。我之前写过一些爬虫,但是它们都对网站数据进行爬虫。这次我认为这很容易,但是遇到了很多麻烦,在这里与您分享。
  1、使用采集器搜寻数据的最基本也是最重要的事情是找到目标网站的url地址,然后遍历该地址以一个或多个线程对其进行搜寻。通常,后续的爬网地址主要是通过两种方式获得的,一种是基于页面分页来计算URL地址的规律,通常后跟参数page = num,另一种是过滤出当前地址的标签。页面,然后将该URL作为后续的抓取地址。不幸的是,这两种方法都不能在微信公众号中使用,因为官方帐号的文章地址之间没有关联,并且不可能通过一个文章地址找到所有文章地址
  2、那么我们如何获得官方帐户的历史文章地址?一种方法是通过搜狗微信网站搜索目标官方帐户,您可以看到最新的文章文章,但这仅仅是最新的一篇无法获取历史记录文章。如果要每天进行爬网,则可以使用此方法每天进行爬网。图片是这样的:
  
  3、当然,我们需要很多结果,因此我们仍然必须找到一种方法来获取所有历史文本,少说废话,然后直达主题:
<p>4、找到历史记录文章后,我们如何编写程序以获取所有URL地址? ,首先让我们分析一下浏览器在单击官方帐户名,调出检查页面,单击网络,首先清除所有数据,然后单击目标官方帐户时的行为,您可以看到以下界面: 查看全部

  爬虫如何抓取微信公众号文章
  第二部分文章:python爬虫如何抓取微信官方帐户文章(二)
  下一篇文章是如何连接python爬虫以实现每天抓取微信公众号的推送文章
  由于我最近在法庭上执业,因此我需要一些官方帐户数据,然后将其放入网页中以进行显示以便于查看。我之前写过一些爬虫,但是它们都对网站数据进行爬虫。这次我认为这很容易,但是遇到了很多麻烦,在这里与您分享。
  1、使用采集器搜寻数据的最基本也是最重要的事情是找到目标网站的url地址,然后遍历该地址以一个或多个线程对其进行搜寻。通常,后续的爬网地址主要是通过两种方式获得的,一种是基于页面分页来计算URL地址的规律,通常后跟参数page = num,另一种是过滤出当前地址的标签。页面,然后将该URL作为后续的抓取地址。不幸的是,这两种方法都不能在微信公众号中使用,因为官方帐号的文章地址之间没有关联,并且不可能通过一个文章地址找到所有文章地址
  2、那么我们如何获得官方帐户的历史文章地址?一种方法是通过搜狗微信网站搜索目标官方帐户,您可以看到最新的文章文章,但这仅仅是最新的一篇无法获取历史记录文章。如果要每天进行爬网,则可以使用此方法每天进行爬网。图片是这样的:
  
  3、当然,我们需要很多结果,因此我们仍然必须找到一种方法来获取所有历史文本,少说废话,然后直达主题:
<p>4、找到历史记录文章后,我们如何编写程序以获取所有URL地址? ,首先让我们分析一下浏览器在单击官方帐户名,调出检查页面,单击网络,首先清除所有数据,然后单击目标官方帐户时的行为,您可以看到以下界面:

解密:python批量爬取公众号文章

采集交流优采云 发表了文章 • 0 个评论 • 318 次浏览 • 2020-09-06 17:45 • 来自相关话题

  Python批量抓取公共帐户文章
  转载:
  Python检索官方帐户文章
  
  PS:如果您需要Python学习资料,可以单击下面的链接自行获得/ A6Zvjdun
  有多种爬网方式。今天,我将与您分享一个更简单的方法,即通过微信公众号背景的“超链接”功能进行爬网。也许有些朋友没有联系到微信公众号的后台,这是一张供大家理解的图片
  
  这里的一些朋友可能会说,我无法登录到正式帐户,该怎么办? ? ?
  没关系,尽管每个爬虫的目的都是为了获得我们想要的结果,但这并不是我们学习的重点。我们学习的重点在于抓取过程,如何获取目标数据,因此我们无法登录到公众文章阅读此内容文章之后,后台的朋友可能无法获得最终的抓取结果,但阅读此文章后,您也会有所收获。
  一、初步准备
  选择要爬网的目标官方帐户
  单击超链接-进入编辑超链接界面-进入我们需要抓取的搜索目标官方帐户
  今天我们将以“数据分析”官方帐户的抓取为例,供大家介绍
  
  单击官方帐户以查看每个文章对应的标题信息
  
  这次抓取工具的目标是获得文章标题和相应的链接。
  二、开始抓取
  爬行的三个步骤:
  1、请求页面
  首先导入我们需要使用此采集器的第三方库
  import re#用来解析网页
import requests#用来请求网页
import csv#用来保存数据
import time#用来设置每次爬取间隔的时间
  找到我们抓取的目标数据的位置,单击通过搜索获得的包,然后获取目标URL和请求标头信息
  
  请求网页
  headers={
&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36&#39;,
&#39;cookie&#39;: &#39;pgv_pvi=2389011456; RK=x4Sdy3WsT4; ptcz=4a2fe0ffda6742a230c94f168291afcce2bd001e5d6615132b55da90559cd463; pgv_pvid=6989331736; _ga=GA1.2.735850052.1585832762; ptui_loginuin=1207020736; ua_id=iJuK7hnHjcUE0e2dAAAAAHzCRcatCWOiHc-hdkhSDL4=; __guid=166713058.1972731636944397800.1590316882436.5461; openid2ticket_oY8wqwesgvgkdQ69wUeM5UxhOV5c=ION52/k2w4M3o44iht5BRt5yCyxP/3IaRXJ84RIpRZA=; mm_lang=zh_CN; pac_uid=0_5ecd1592971c3; uin=o1240069166; skey=@YLtvDuKyj; pgv_info=ssid=s4875389884; pgv_si=s8410697728; uuid=62839906b2a77b5f098cd91979af8b33; rand_info=CAESIC53TQFCwjIe4ZsrTRKvSs+ocfs4UTsj9swrrNwosjCd; slave_bizuin=3240807523; data_bizuin=3240807523; bizuin=3240807523; data_ticket=AiTk/OFWXCKxhaenCvEuP06mwWTI6YqCyt+74hoaXaNtKBbcnq//ZTXHzqByMhK6; slave_sid=YndxeFhCSkU5OUJtdFYycW9zN29FcG51NU5GNElBM3I2RF9wVjJBRGx2bWxrTXdiMDZFYzllUWNaMlN4N0RsOTlVMDRxZFZEMjJXdlRZcXBVOGptQ2ZDSVZiOEJlQW5BZDVCWlkzSnJ6WWNPWVRiN1J0cldCd0pvbTc3RGRiMm9pZ3ZISTl6WWhDUmNCZ2s3; slave_user=gh_5d822fe7fd08; xid=9794daa60db66fcf7a65c4054e3d68ce; mmad_session=43d4e5247a6b025b67ba3abd48d27a309ec4713911b6ef6f23cddb4b9953e771354ad1572fbc3fa895051725e95abb887cf2d03e9864084974db75c8588189699ea5b20b8fe35073831446ef98d24de600f107fe69d79646a3dd2907ab712e1f11de1c56c245721266e7088080fefde3; ts_last=mp.weixin.qq.com/cgi-bin/frame; ts_uid=1963034896; monitor_count=15&#39;
}#请求头信息,这里cookie信息必须添加,否则得不到网页信息
url=&#39;https://mp.weixin.qq.com/cgi-b ... 39%3B
response=requests.get(url,headers=headers)#得到响应内容
response.encoding=&#39;utf-8&#39;#设置响应内容为utf-8格式
html=response.text#得到网页的文本形式
print(html)
  此处的请求标头信息必须添加cookie信息,否则无法获取网页信息
  网页的请求结果如下图所示。红色框标记了我们需要的文章标题和文章链接。
  
  2、分析网页
  从网页响应结果中我们可以看到,每个文章的标题和链接都位于“ title”标签和“ cover”标签的后面,因此我们可以使用正则表达式直接对其进行解析
  title=re.findall(&#39;"title":"(.*?)"&#39;,html)#得到文章标题
cover=re.findall(&#39;"cover":"(.*?)"&#39;,html)#得到文章链接
all=zip(title,cover)#利用zip方法,将两个列表中的数据一一对应
print(list(all))#list是对zip方法得到的数据进行解压
  解析后的结果如下
  
  3、保存数据
  for data in all:#for循环遍历列表
time.sleep(3)#每爬取一篇文章间隔3秒,以防触发反爬
with open(&#39;C:\\Users\\Administrator\\Desktop\\爬取公众号文章.csv&#39;,&#39;a&#39;,encoding=&#39;utf-8-sig&#39;) as file:
#将数据保存到桌面
write=csv.writer(file)
write.writerow(data)
  到目前为止,该抓取工具已经完成,让我们看一下最终结果
  
  完整代码 查看全部

  Python批量抓取公共帐户文章
  转载:
  Python检索官方帐户文章
  
  PS:如果您需要Python学习资料,可以单击下面的链接自行获得/ A6Zvjdun
  有多种爬网方式。今天,我将与您分享一个更简单的方法,即通过微信公众号背景的“超链接”功能进行爬网。也许有些朋友没有联系到微信公众号的后台,这是一张供大家理解的图片
  
  这里的一些朋友可能会说,我无法登录到正式帐户,该怎么办? ? ?
  没关系,尽管每个爬虫的目的都是为了获得我们想要的结果,但这并不是我们学习的重点。我们学习的重点在于抓取过程,如何获取目标数据,因此我们无法登录到公众文章阅读此内容文章之后,后台的朋友可能无法获得最终的抓取结果,但阅读此文章后,您也会有所收获。
  一、初步准备
  选择要爬网的目标官方帐户
  单击超链接-进入编辑超链接界面-进入我们需要抓取的搜索目标官方帐户
  今天我们将以“数据分析”官方帐户的抓取为例,供大家介绍
  
  单击官方帐户以查看每个文章对应的标题信息
  
  这次抓取工具的目标是获得文章标题和相应的链接。
  二、开始抓取
  爬行的三个步骤:
  1、请求页面
  首先导入我们需要使用此采集器的第三方库
  import re#用来解析网页
import requests#用来请求网页
import csv#用来保存数据
import time#用来设置每次爬取间隔的时间
  找到我们抓取的目标数据的位置,单击通过搜索获得的包,然后获取目标URL和请求标头信息
  
  请求网页
  headers={
&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36&#39;,
&#39;cookie&#39;: &#39;pgv_pvi=2389011456; RK=x4Sdy3WsT4; ptcz=4a2fe0ffda6742a230c94f168291afcce2bd001e5d6615132b55da90559cd463; pgv_pvid=6989331736; _ga=GA1.2.735850052.1585832762; ptui_loginuin=1207020736; ua_id=iJuK7hnHjcUE0e2dAAAAAHzCRcatCWOiHc-hdkhSDL4=; __guid=166713058.1972731636944397800.1590316882436.5461; openid2ticket_oY8wqwesgvgkdQ69wUeM5UxhOV5c=ION52/k2w4M3o44iht5BRt5yCyxP/3IaRXJ84RIpRZA=; mm_lang=zh_CN; pac_uid=0_5ecd1592971c3; uin=o1240069166; skey=@YLtvDuKyj; pgv_info=ssid=s4875389884; pgv_si=s8410697728; uuid=62839906b2a77b5f098cd91979af8b33; rand_info=CAESIC53TQFCwjIe4ZsrTRKvSs+ocfs4UTsj9swrrNwosjCd; slave_bizuin=3240807523; data_bizuin=3240807523; bizuin=3240807523; data_ticket=AiTk/OFWXCKxhaenCvEuP06mwWTI6YqCyt+74hoaXaNtKBbcnq//ZTXHzqByMhK6; slave_sid=YndxeFhCSkU5OUJtdFYycW9zN29FcG51NU5GNElBM3I2RF9wVjJBRGx2bWxrTXdiMDZFYzllUWNaMlN4N0RsOTlVMDRxZFZEMjJXdlRZcXBVOGptQ2ZDSVZiOEJlQW5BZDVCWlkzSnJ6WWNPWVRiN1J0cldCd0pvbTc3RGRiMm9pZ3ZISTl6WWhDUmNCZ2s3; slave_user=gh_5d822fe7fd08; xid=9794daa60db66fcf7a65c4054e3d68ce; mmad_session=43d4e5247a6b025b67ba3abd48d27a309ec4713911b6ef6f23cddb4b9953e771354ad1572fbc3fa895051725e95abb887cf2d03e9864084974db75c8588189699ea5b20b8fe35073831446ef98d24de600f107fe69d79646a3dd2907ab712e1f11de1c56c245721266e7088080fefde3; ts_last=mp.weixin.qq.com/cgi-bin/frame; ts_uid=1963034896; monitor_count=15&#39;
}#请求头信息,这里cookie信息必须添加,否则得不到网页信息
url=&#39;https://mp.weixin.qq.com/cgi-b ... 39%3B
response=requests.get(url,headers=headers)#得到响应内容
response.encoding=&#39;utf-8&#39;#设置响应内容为utf-8格式
html=response.text#得到网页的文本形式
print(html)
  此处的请求标头信息必须添加cookie信息,否则无法获取网页信息
  网页的请求结果如下图所示。红色框标记了我们需要的文章标题和文章链接。
  
  2、分析网页
  从网页响应结果中我们可以看到,每个文章的标题和链接都位于“ title”标签和“ cover”标签的后面,因此我们可以使用正则表达式直接对其进行解析
  title=re.findall(&#39;"title":"(.*?)"&#39;,html)#得到文章标题
cover=re.findall(&#39;"cover":"(.*?)"&#39;,html)#得到文章链接
all=zip(title,cover)#利用zip方法,将两个列表中的数据一一对应
print(list(all))#list是对zip方法得到的数据进行解压
  解析后的结果如下
  
  3、保存数据
  for data in all:#for循环遍历列表
time.sleep(3)#每爬取一篇文章间隔3秒,以防触发反爬
with open(&#39;C:\\Users\\Administrator\\Desktop\\爬取公众号文章.csv&#39;,&#39;a&#39;,encoding=&#39;utf-8-sig&#39;) as file:
#将数据保存到桌面
write=csv.writer(file)
write.writerow(data)
  到目前为止,该抓取工具已经完成,让我们看一下最终结果
  
  完整代码

免费获取:微信公众号批量爬取Java版

采集交流优采云 发表了文章 • 0 个评论 • 199 次浏览 • 2020-09-06 17:21 • 来自相关话题

  微信公众号批量抓取Java版本
  最近,我们需要抓取微信公众号的文章信息。我在互联网上搜索后发现,抓取微信官方账号的困难在于无法在PC端打开官方账号文章的链接。您需要使用WeChat的浏览器(获取WeChat客户端的补充参数才能访问其他平台上的Open),这会给爬虫程序带来很多麻烦。后来,在知乎上,我看到了由一头大牛用PHP编写的微信官方帐户爬网程序,并且根据大佬的想法将其直接制成Java。在转换过程中遇到了很多详细的问题,因此请与大家分享。
  系统的基本思想是在Android模拟器上运行微信,模拟器设置代理,通过代理服务器拦截微信数据,并将获取的数据发送到自己的程序进行处理。
  要准备的环境:nodejs,anyproxy代理,Android仿真器
  nodejs下载地址:我下载了Windows版本,只需下载并直接安装即可。安装后,直接运行C:\ Program Files \ nodejs \ npm.cmd即可自动配置环境。
  anyproxy安装:在上一步中安装了nodejs之后,直接在cmd中运行npm install -g anyproxy,它将被安装
  互联网上只有一个Android模拟器。
  首先为代理服务器安装证书。默认情况下,Anyproxy不会解析https链接。安装证书后,可以解决它。在cmd中执行anyproxy --root将安装证书,然后必须在模拟器上下载证书。
  然后输入anyproxy -i命令打开代理服务。 (请记住要添加参数!)
  
  记住该IP和端口,然后Android仿真器的代理将使用此IP和端口。现在,使用浏览器打开网页:: 8002 /这是anyproxy的网络界面,用于显示http传输数据。
  
  单击上方红色框中的菜单,将显示QR码。使用Android模拟器扫描代码以进行识别。仿真器(手机)将下载证书并安装。
  现在我们准备为模拟器设置代理,代理模式设置为手动,代理ip是运行anyproxy的计算机的ip,端口为8001
  
  准备工作到此基本完成。在模拟器上打开微信并开设一个官方帐户文章。您可以从刚打开的Web界面中查看anyproxy捕获的数据:
  
  在上方的红色框中是微信文章的链接,单击进入以查看特定数据。如果响应正文中没有任何内容,则证书安装可能存在问题。
  如果一切都通过以上,则可以下去。
  在这里,我们依靠代理服务来捕获微信数据,但是我们无法捕获数据,而只能自己操作微信。最好手动复制它。因此,我们需要微信客户端自行跳转到页面。这时,您可以使用anyproxy拦截微信服务器返回的数据,向其中注入页面跳转代码,然后将处理后的数据返回给模拟器,以实现微信客户端的自动跳转。
  在anyproxy中打开一个名为rule_default.js的js文件,Windows下的文件为:C:\ Users \ Administrator \ AppData \ Roaming \ npm \ node_modules \ anyproxy \ lib
  文件中有一种称为replaceServerResDataAsync的方法:function(req,res,serverResData,callback)。此方法负责对anyproxy获得的数据进行各种操作。开头应该只有callback(serverResData);此语句意味着直接将服务器响应数据返回给客户端。直接删除此语句,并将其替换为Daniel编写的以下代码。我在这里没有对代码做任何更改,并且内部的注释也很清楚地解释了,只需按照逻辑来理解它,问题就不大了。
   1 replaceServerResDataAsync: function(req,res,serverResData,callback){
2 if(/mp\/getmasssendmsg/i.test(req.url)){//当链接地址为公众号历史消息页面时(第一种页面形式)
3 //console.log("开始第一种页面爬取");
4 if(serverResData.toString() !== ""){
try {//防止报错退出程序
7 var reg = /msgList = (.*?);/;//定义历史消息正则匹配规则
8 var ret = reg.exec(serverResData.toString());//转换变量为string
9 HttpPost(ret[1],req.url,"/InternetSpider/getData/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
10 var http = require('http');
11 http.get('http://xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
12 res.on('data', function(chunk){
13 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
14 })
15 });
16 }catch(e){//如果上面的正则没有匹配到,那么这个页面内容可能是公众号历史消息页面向下翻动的第二页,因为历史消息第一页是html格式的,第二页就是json格式的。
17 //console.log("开始第一种页面爬取向下翻形式");
18 try {
19 var json = JSON.parse(serverResData.toString());
20 if (json.general_msg_list != []) {
21 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
22 }
23 }catch(e){
24 console.log(e);//错误捕捉
25 }
26 callback(serverResData);//直接返回第二页json内容
27 }
28 }
29 //console.log("开始第一种页面爬取 结束");
30 }else if(/mp\/profile_ext\?action=home/i.test(req.url)){//当链接地址为公众号历史消息页面时(第二种页面形式)
31 try {
32 var reg = /var msgList = \'(.*?)\';/;//定义历史消息正则匹配规则(和第一种页面形式的正则不同)
33 var ret = reg.exec(serverResData.toString());//转换变量为string
34 HttpPost(ret[1],req.url,"/xxx/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
35 var http = require('http');
36 http.get('xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
37 res.on('data', function(chunk){
38 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
39 })
40 });
41 }catch(e){
42 //console.log(e);
43 callback(serverResData);
44 }
45 }else if(/mp\/profile_ext\?action=getmsg/i.test(req.url)){//第二种页面表现形式的向下翻页后的json
46 try {
47 var json = JSON.parse(serverResData.toString());
48 if (json.general_msg_list != []) {
49 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
50 }
51 }catch(e){
52 console.log(e);
53 }
54 callback(serverResData);
55 }else if(/mp\/getappmsgext/i.test(req.url)){//当链接地址为公众号文章阅读量和点赞量时
56 try {
57 HttpPost(serverResData,req.url,"/xxx/getMsgExt");//函数是后文定义的,功能是将文章阅读量点赞量的json发送到服务器
58 }catch(e){
59
60 }
61 callback(serverResData);
62 }else if(/s\?__biz/i.test(req.url) || /mp\/rumor/i.test(req.url)){//当链接地址为公众号文章时(rumor这个地址是公众号文章被辟谣了)
63 try {
64 var http = require('http');
65 http.get('http://xxx/getWxPost', function(res) {//这个地址是自己服务器上的另一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxPost.php的原理。
66 res.on('data', function(chunk){
67 callback(chunk+serverResData);
68 })
69 });
70 }catch(e){
71 callback(serverResData);
72 }
73 }else{
74 callback(serverResData);
75 }
76 //callback(serverResData);
77 }
  这里是一个简短的解释。链接到微信官方帐户历史新闻页面的链接有两种形式:一种以/ mp / getmasssendmsg开头,另一种以/ mp / profile_ext开头。历史记录页面可以关闭。如果将其关闭,则会触发js事件,以发送请求以获取json数据(下一页内容)。也有指向官方帐户文章的链接,也有指向文章的阅读次数和喜欢次数的链接(返回json数据)。这些链接的形式是固定的,可以通过逻辑判断加以区分。这里的问题是,如果需要对所有历史页面进行爬网,该怎么做。我的想法是模拟鼠标在js中向下滑动,以触发提交请求以加载列表的下一部分。或者直接使用anyproxy分析滑动加载请求,并将请求直接发送至微信服务器。但是,如何判断没有剩余数据始终存在问题。我正在搜寻最新数据。我暂时没有这个要求。以后可能需要。如果需要,可以尝试一下。 查看全部

  微信公众号批量抓取Java版本
  最近,我们需要抓取微信公众号的文章信息。我在互联网上搜索后发现,抓取微信官方账号的困难在于无法在PC端打开官方账号文章的链接。您需要使用WeChat的浏览器(获取WeChat客户端的补充参数才能访问其他平台上的Open),这会给爬虫程序带来很多麻烦。后来,在知乎上,我看到了由一头大牛用PHP编写的微信官方帐户爬网程序,并且根据大佬的想法将其直接制成Java。在转换过程中遇到了很多详细的问题,因此请与大家分享。
  系统的基本思想是在Android模拟器上运行微信,模拟器设置代理,通过代理服务器拦截微信数据,并将获取的数据发送到自己的程序进行处理。
  要准备的环境:nodejs,anyproxy代理,Android仿真器
  nodejs下载地址:我下载了Windows版本,只需下载并直接安装即可。安装后,直接运行C:\ Program Files \ nodejs \ npm.cmd即可自动配置环境。
  anyproxy安装:在上一步中安装了nodejs之后,直接在cmd中运行npm install -g anyproxy,它将被安装
  互联网上只有一个Android模拟器。
  首先为代理服务器安装证书。默认情况下,Anyproxy不会解析https链接。安装证书后,可以解决它。在cmd中执行anyproxy --root将安装证书,然后必须在模拟器上下载证书。
  然后输入anyproxy -i命令打开代理服务。 (请记住要添加参数!)
  
  记住该IP和端口,然后Android仿真器的代理将使用此IP和端口。现在,使用浏览器打开网页:: 8002 /这是anyproxy的网络界面,用于显示http传输数据。
  
  单击上方红色框中的菜单,将显示QR码。使用Android模拟器扫描代码以进行识别。仿真器(手机)将下载证书并安装。
  现在我们准备为模拟器设置代理,代理模式设置为手动,代理ip是运行anyproxy的计算机的ip,端口为8001
  
  准备工作到此基本完成。在模拟器上打开微信并开设一个官方帐户文章。您可以从刚打开的Web界面中查看anyproxy捕获的数据:
  
  在上方的红色框中是微信文章的链接,单击进入以查看特定数据。如果响应正文中没有任何内容,则证书安装可能存在问题。
  如果一切都通过以上,则可以下去。
  在这里,我们依靠代理服务来捕获微信数据,但是我们无法捕获数据,而只能自己操作微信。最好手动复制它。因此,我们需要微信客户端自行跳转到页面。这时,您可以使用anyproxy拦截微信服务器返回的数据,向其中注入页面跳转代码,然后将处理后的数据返回给模拟器,以实现微信客户端的自动跳转。
  在anyproxy中打开一个名为rule_default.js的js文件,Windows下的文件为:C:\ Users \ Administrator \ AppData \ Roaming \ npm \ node_modules \ anyproxy \ lib
  文件中有一种称为replaceServerResDataAsync的方法:function(req,res,serverResData,callback)。此方法负责对anyproxy获得的数据进行各种操作。开头应该只有callback(serverResData);此语句意味着直接将服务器响应数据返回给客户端。直接删除此语句,并将其替换为Daniel编写的以下代码。我在这里没有对代码做任何更改,并且内部的注释也很清楚地解释了,只需按照逻辑来理解它,问题就不大了。
   1 replaceServerResDataAsync: function(req,res,serverResData,callback){
2 if(/mp\/getmasssendmsg/i.test(req.url)){//当链接地址为公众号历史消息页面时(第一种页面形式)
3 //console.log("开始第一种页面爬取");
4 if(serverResData.toString() !== ""){
try {//防止报错退出程序
7 var reg = /msgList = (.*?);/;//定义历史消息正则匹配规则
8 var ret = reg.exec(serverResData.toString());//转换变量为string
9 HttpPost(ret[1],req.url,"/InternetSpider/getData/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
10 var http = require('http');
11 http.get('http://xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
12 res.on('data', function(chunk){
13 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
14 })
15 });
16 }catch(e){//如果上面的正则没有匹配到,那么这个页面内容可能是公众号历史消息页面向下翻动的第二页,因为历史消息第一页是html格式的,第二页就是json格式的。
17 //console.log("开始第一种页面爬取向下翻形式");
18 try {
19 var json = JSON.parse(serverResData.toString());
20 if (json.general_msg_list != []) {
21 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
22 }
23 }catch(e){
24 console.log(e);//错误捕捉
25 }
26 callback(serverResData);//直接返回第二页json内容
27 }
28 }
29 //console.log("开始第一种页面爬取 结束");
30 }else if(/mp\/profile_ext\?action=home/i.test(req.url)){//当链接地址为公众号历史消息页面时(第二种页面形式)
31 try {
32 var reg = /var msgList = \'(.*?)\';/;//定义历史消息正则匹配规则(和第一种页面形式的正则不同)
33 var ret = reg.exec(serverResData.toString());//转换变量为string
34 HttpPost(ret[1],req.url,"/xxx/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
35 var http = require('http');
36 http.get('xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
37 res.on('data', function(chunk){
38 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
39 })
40 });
41 }catch(e){
42 //console.log(e);
43 callback(serverResData);
44 }
45 }else if(/mp\/profile_ext\?action=getmsg/i.test(req.url)){//第二种页面表现形式的向下翻页后的json
46 try {
47 var json = JSON.parse(serverResData.toString());
48 if (json.general_msg_list != []) {
49 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
50 }
51 }catch(e){
52 console.log(e);
53 }
54 callback(serverResData);
55 }else if(/mp\/getappmsgext/i.test(req.url)){//当链接地址为公众号文章阅读量和点赞量时
56 try {
57 HttpPost(serverResData,req.url,"/xxx/getMsgExt");//函数是后文定义的,功能是将文章阅读量点赞量的json发送到服务器
58 }catch(e){
59
60 }
61 callback(serverResData);
62 }else if(/s\?__biz/i.test(req.url) || /mp\/rumor/i.test(req.url)){//当链接地址为公众号文章时(rumor这个地址是公众号文章被辟谣了)
63 try {
64 var http = require('http');
65 http.get('http://xxx/getWxPost', function(res) {//这个地址是自己服务器上的另一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxPost.php的原理。
66 res.on('data', function(chunk){
67 callback(chunk+serverResData);
68 })
69 });
70 }catch(e){
71 callback(serverResData);
72 }
73 }else{
74 callback(serverResData);
75 }
76 //callback(serverResData);
77 }
  这里是一个简短的解释。链接到微信官方帐户历史新闻页面的链接有两种形式:一种以/ mp / getmasssendmsg开头,另一种以/ mp / profile_ext开头。历史记录页面可以关闭。如果将其关闭,则会触发js事件,以发送请求以获取json数据(下一页内容)。也有指向官方帐户文章的链接,也有指向文章的阅读次数和喜欢次数的链接(返回json数据)。这些链接的形式是固定的,可以通过逻辑判断加以区分。这里的问题是,如果需要对所有历史页面进行爬网,该怎么做。我的想法是模拟鼠标在js中向下滑动,以触发提交请求以加载列表的下一部分。或者直接使用anyproxy分析滑动加载请求,并将请求直接发送至微信服务器。但是,如何判断没有剩余数据始终存在问题。我正在搜寻最新数据。我暂时没有这个要求。以后可能需要。如果需要,可以尝试一下。

内容分享:微信公众号文章爬取实战

采集交流优采云 发表了文章 • 0 个评论 • 176 次浏览 • 2020-09-06 05:54 • 来自相关话题

  微信公众号文章抓实战
  在之前的爬虫实战中,我们基于关键词搜索了相关的微信公众号文章,并获得了一系列相关的文章标题,链接等。找到文章后,我们需要保存,此实验的目的是抓取微信公众号文章文本内容。
  实验环境
  python3
  主要使用的请求pyquery库
  步骤分析
  本文使用CSDN公共帐户的Python来抓取北京二手房数据,以分析北票人是否负担得起房屋? 随附完整的源代码作为示例,
  在请求此页面后,我们获得文章标题,作者,官方帐户信息和文章文本信息。由于我们要显示文章的内容,因此为了确保文章文本的格式不变,我们提取html格式,最后将所有提取的内容合并为html格式,并通过浏览器保持文章的原创格式。
  应注意,文章中的所有图片均来自互联网。这些图片无法通过打开本地html进行解析,因此我们提取了图片链接,然后将其下载并保存到本地,并且html中的图片链接替换了本地位置。
  在实验过程中确定文章标题
  文章标题位于以下位置:
  
  1<br />2<br />
  <br />title = doc.find(&#39;.rich_media_title&#39;).text()<br />
  确认官方帐户信息
  作者信息,官方帐户的来源,微信帐户以及官方帐户的介绍都可以通过pyquery提取:
  
  1<br />2<br />3<br />4<br />
  # 微信公众号<br />author = doc.find(&#39;#meta_content .rich_media_meta_text&#39;).text()<br />source = doc.find(&#39;#js_name&#39;).text()<br />source_info = doc.find(&#39;.profile_meta_value&#39;).text()<br />
  确认文章的内容
  文章的正文内容无法通过text()提取,因为提取的内容只是文本部分,而且缺少格式,因此显示起来非常难看,因此我们使用html()保留身体部位的html元素:
  
  1<br />2<br />
  # 正文内容<br />content = doc.find(&#39;.rich_media_content&#39;)<br />
  提取所有图像链接
  所有图像链接都在img元素的data-src属性中:
  
  1<br />2<br />3<br />4<br />5<br />6<br />
  # 所有图片链接<br />pics_src = content.find(&#39;img&#39;).items()<br />for each in pics_src:<br /> if &#39;=&#39; in each.attr(&#39;data-src&#39;):<br /> pic.append(each.attr(&#39;data-src&#39;))<br />#print(pic)<br />
  下载图片
  下载文章中的所有图片并将其保存在本地文件中
  1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />
  def (title,url):<br /> print(url)<br /> pic_name = url.split(&#39;/&#39;)[4]<br /> pic_type = url.split(&#39;=&#39;)[1]<br /> response = requests.get(url,headers=random.choice(headers))<br /> try:<br /> if response.status_code == 200:<br /> file_dir = "{0}/{1}".format(os.getcwd(), title)<br /> if not os.path.isdir(file_dir):<br /> os.mkdir(file_dir)<br /> path = os.path.join(file_dir,pic_name+&#39;.&#39;+pic_type)<br /> if not os.path.exists(path):<br /> with open(path,&#39;wb&#39;) as f:<br /> f.write(response.content)<br /> except:<br /> pass<br />
  替换图片
  将文本链接中的图像链接替换为本地图像的链接,但要注意,我们需要在img元素中添加src属性,因为实际的图像链接存储在此处,然后存储图像的位置用作src属性值。
  1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />
  for item in content.find(&#39;img&#39;).items():<br /> pic_url = item.attr(&#39;data-src&#39;)<br /> if &#39;=&#39; in pic_url:<br /> pic_name = pic_url.split(&#39;/&#39;)[4]<br /> pic_type = pic_url.split(&#39;=&#39;)[1]<br /> image = pic_name + &#39;.&#39; + pic_type<br /> item.add_class(&#39;src&#39;)<br /> item.attr(&#39;src&#39;,image)<br />
  生成index.html
  以html格式添加先前提取的文章标题,作者和官方帐户信息以生成index.html,然后将其打开以查看微信正文内容。
  1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />
  file_dir = "{0}/{1}".format(os.getcwd(), title)<br />path = os.path.join(file_dir,&#39;index.html&#39;)<br /><br />index = &#39;&#39;+title+&#39;
&#39;<br />index += &#39;&#39;+author+&#39;&#39;+source+&#39;
&#39;<br />index += &#39;&#39;+source_info+&#39;
&#39;<br />index += content<br />with open(path, &#39;wb&#39;) as f:<br /> f.write(index.encode(&#39;utf-8&#39;))<br />
  结果分析与解释
  有关完整代码,请参见微信2. py
  运行代码:
  1<br />
  python https://mp.weixin.qq.com/s/QAw ... %3Bbr />
  
  检索到的index.html如下: 查看全部

  微信公众号文章抓实战
  在之前的爬虫实战中,我们基于关键词搜索了相关的微信公众号文章,并获得了一系列相关的文章标题,链接等。找到文章后,我们需要保存,此实验的目的是抓取微信公众号文章文本内容。
  实验环境
  python3
  主要使用的请求pyquery库
  步骤分析
  本文使用CSDN公共帐户的Python来抓取北京二手房数据,以分析北票人是否负担得起房屋? 随附完整的源代码作为示例,
  在请求此页面后,我们获得文章标题,作者,官方帐户信息和文章文本信息。由于我们要显示文章的内容,因此为了确保文章文本的格式不变,我们提取html格式,最后将所有提取的内容合并为html格式,并通过浏览器保持文章的原创格式。
  应注意,文章中的所有图片均来自互联网。这些图片无法通过打开本地html进行解析,因此我们提取了图片链接,然后将其下载并保存到本地,并且html中的图片链接替换了本地位置。
  在实验过程中确定文章标题
  文章标题位于以下位置:
  
  1<br />2<br />
  <br />title = doc.find(&#39;.rich_media_title&#39;).text()<br />
  确认官方帐户信息
  作者信息,官方帐户的来源,微信帐户以及官方帐户的介绍都可以通过pyquery提取:
  
  1<br />2<br />3<br />4<br />
  # 微信公众号<br />author = doc.find(&#39;#meta_content .rich_media_meta_text&#39;).text()<br />source = doc.find(&#39;#js_name&#39;).text()<br />source_info = doc.find(&#39;.profile_meta_value&#39;).text()<br />
  确认文章的内容
  文章的正文内容无法通过text()提取,因为提取的内容只是文本部分,而且缺少格式,因此显示起来非常难看,因此我们使用html()保留身体部位的html元素:
  
  1<br />2<br />
  # 正文内容<br />content = doc.find(&#39;.rich_media_content&#39;)<br />
  提取所有图像链接
  所有图像链接都在img元素的data-src属性中:
  
  1<br />2<br />3<br />4<br />5<br />6<br />
  # 所有图片链接<br />pics_src = content.find(&#39;img&#39;).items()<br />for each in pics_src:<br /> if &#39;=&#39; in each.attr(&#39;data-src&#39;):<br /> pic.append(each.attr(&#39;data-src&#39;))<br />#print(pic)<br />
  下载图片
  下载文章中的所有图片并将其保存在本地文件中
  1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />
  def (title,url):<br /> print(url)<br /> pic_name = url.split(&#39;/&#39;)[4]<br /> pic_type = url.split(&#39;=&#39;)[1]<br /> response = requests.get(url,headers=random.choice(headers))<br /> try:<br /> if response.status_code == 200:<br /> file_dir = "{0}/{1}".format(os.getcwd(), title)<br /> if not os.path.isdir(file_dir):<br /> os.mkdir(file_dir)<br /> path = os.path.join(file_dir,pic_name+&#39;.&#39;+pic_type)<br /> if not os.path.exists(path):<br /> with open(path,&#39;wb&#39;) as f:<br /> f.write(response.content)<br /> except:<br /> pass<br />
  替换图片
  将文本链接中的图像链接替换为本地图像的链接,但要注意,我们需要在img元素中添加src属性,因为实际的图像链接存储在此处,然后存储图像的位置用作src属性值。
  1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />
  for item in content.find(&#39;img&#39;).items():<br /> pic_url = item.attr(&#39;data-src&#39;)<br /> if &#39;=&#39; in pic_url:<br /> pic_name = pic_url.split(&#39;/&#39;)[4]<br /> pic_type = pic_url.split(&#39;=&#39;)[1]<br /> image = pic_name + &#39;.&#39; + pic_type<br /> item.add_class(&#39;src&#39;)<br /> item.attr(&#39;src&#39;,image)<br />
  生成index.html
  以html格式添加先前提取的文章标题,作者和官方帐户信息以生成index.html,然后将其打开以查看微信正文内容。
  1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />
  file_dir = "{0}/{1}".format(os.getcwd(), title)<br />path = os.path.join(file_dir,&#39;index.html&#39;)<br /><br />index = &#39;&#39;+title+&#39;
&#39;<br />index += &#39;&#39;+author+&#39;&#39;+source+&#39;
&#39;<br />index += &#39;&#39;+source_info+&#39;
&#39;<br />index += content<br />with open(path, &#39;wb&#39;) as f:<br /> f.write(index.encode(&#39;utf-8&#39;))<br />
  结果分析与解释
  有关完整代码,请参见微信2. py
  运行代码:
  1<br />
  python https://mp.weixin.qq.com/s/QAw ... %3Bbr />
  
  检索到的index.html如下:

干货内容:[Python]抓取微信公众号文章

采集交流优采云 发表了文章 • 0 个评论 • 214 次浏览 • 2020-09-01 02:09 • 来自相关话题

  [Python]抢到微信官方账号文章
  
  我目前正在开发自己的项目,该项目涉及文章,该项目需要通过python抓取微信官方帐户. 由于微信的独特方法,不可能直接爬网. 研究了一些文章之后,我可能会有想法. 目前,Internet可以毫无问题地搜索提议的解决方案,但是由于第三方库中的某些更改,内部代码基本上无法使用. 本文是为需要爬网公共帐户文章的朋友而写的. 最后还将提供python源代码下载.
  ##公共帐户捕获方法
  当前有两种主流的公共帐户爬网解决方案. 一种是搜索搜狗的微信官方帐户页面,找到文章地址,然后获取特定的文章内容. 第二种方法是注册一个公共帐户,然后通过官方帐户的搜索界面可以查询产品地址,然后根据该地址获取产品内容.
  这两种方案各有优缺点. 搜狗搜索的核心思想是通过请求模拟搜狗搜索公共账号,然后解析搜索结果页面,然后根据公共账号的首页地址对抓取工具进行爬网. }已捕获详细信息. 由于搜狗与腾讯之间的协议,只能显示最新的10个文章,但无法获取所有文章. 如果要获取所有文章,则朋友可能必须使用第二种方法. 第二种方法的缺点是通过腾讯身份验证注册公共帐户. 这个过程比较麻烦. 您可以通过调用该界面的公共帐户查询界面进行查询,但是您需要使用硒来模拟滑动页面翻页操作. 整个过程仍然很麻烦. 是. 因为我的项目不需要历史记录文章,所以我使用搜狗搜索功能来检索公共帐户.
  检索最近的10个公共帐户文章
  Python需要依赖的第三方库如下:
  
  urllib,pyquery,请求,硒
  具体逻辑写在注释中,没有什么特别复杂的.
  核心爬虫课程
  ```python
  #! / usr / bin / python
  #代码: utf-8
  
  [Python]纯文本视图复制代码
  import sys
reload(sys)
sys.setdefaultencoding('utf-8')
from urllib import quote
from pyquery import PyQuery as pq
import requests
import time
import re
import os
from selenium.webdriver import Chrome
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support.wait import WebDriverWait
# 搜索入口地址,以公众为关键字搜索该公众号
def get_search_result_by_keywords(sogou_search_url):
# 爬虫伪装头部设置
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0'}
# 设置操作超时时长
timeout = 5
# 爬虫模拟在一个request.session中完成
s = requests.Session()
log(u'搜索地址为:%s' % sogou_search_url)
return s.get(sogou_search_url, headers=headers, timeout=timeout).content
# 获得公众号主页地址
def get_wx_url_by_sougou_search_html(sougou_search_html):
doc = pq(sougou_search_html)
return doc('div[class=txt-box]')('p[class=tit]')('a').attr('href')
# 使用webdriver 加载公众号主页内容,主要是js渲染的部分
def get_selenium_js_html(url):
options = Options()
options.add_argument('-headless') # 无头参数
driver = Chrome(executable_path='chromedriver', chrome_options=options)
wait = WebDriverWait(driver, timeout=10)
driver.get(url)
time.sleep(3)
# 执行js得到整个页面内容
html = driver.execute_script("return document.documentElement.outerHTML")
driver.close()
return html
# 获取公众号文章内容
def parse_wx_articles_by_html(selenium_html):
doc = pq(selenium_html)
return doc('div[class="weui_media_box appmsg"]')
# 将获取到的文章转换为字典
def switch_arctiles_to_list(articles):
# 定义存贮变量
articles_list = []
i = 1
# 遍历找到的文章,解析里面的内容
if articles:
for article in articles.items():
log(u'开始整合(%d/%d)' % (i, len(articles)))
# 处理单个文章
articles_list.append(parse_one_article(article))
i += 1
return articles_list
# 解析单篇文章
def parse_one_article(article):
article_dict = {}
# 获取标题
title = article('h4[class="weui_media_title"]').text().strip()
###log(u'标题是: %s' % title)
# 获取标题对应的地址
url = 'http://mp.weixin.qq.com' + article('h4[class="weui_media_title"]').attr('hrefs')
log(u'地址为: %s' % url)
# 获取概要内容
summary = article('.weui_media_desc').text()
log(u'文章简述: %s' % summary)
# 获取文章发表时间
date = article('.weui_media_extra_info').text().strip()
log(u'发表时间为: %s' % date)
# 获取封面图片
pic = parse_cover_pic(article)
# 返回字典数据
return {
'title': title,
'url': url,
'summary': summary,
'date': date,
'pic': pic
}
# 查找封面图片,获取封面图片地址
def parse_cover_pic(article):
pic = article('.weui_media_hd').attr('style')
p = re.compile(r'background-image:url\((.*?)\)')
rs = p.findall(pic)
log(u'封面图片是:%s ' % rs[0] if len(rs) > 0 else '')
return rs[0] if len(rs) > 0 else ''
# 自定义log函数,主要是加上时间
def log(msg):
print u'%s: %s' % (time.strftime('%Y-%m-%d_%H-%M-%S'), msg)
# 验证函数
def need_verify(selenium_html):
' 有时候对方会封锁ip,这里做一下判断,检测html中是否包含id=verify_change的标签,有的话,代表被重定向了,提醒过一阵子重试 '
return pq(selenium_html)('#verify_change').text() != ''
# 创建公众号命名的文件夹
def create_dir(keywords):
if not os.path.exists(keywords):
os.makedirs(keywords)
# 爬虫主函数
def run(keywords):
' 爬虫入口函数 '
# Step 0 : 创建公众号命名的文件夹
create_dir(keywords)
# 搜狐微信搜索链接入口
sogou_search_url = 'http://weixin.sogou.com/weixin?type=1&query=%s&ie=utf8&s_from=input&_sug_=n&_sug_type_=' % quote(
keywords)
# Step 1:GET请求到搜狗微信引擎,以微信公众号英文名称作为查询关键字
log(u'开始获取,微信公众号英文名为:%s' % keywords)
log(u'开始调用sougou搜索引擎')
sougou_search_html = get_search_result_by_keywords(sogou_search_url)
# Step 2:从搜索结果页中解析出公众号主页链接
log(u'获取sougou_search_html成功,开始抓取公众号对应的主页wx_url')
wx_url = get_wx_url_by_sougou_search_html(sougou_search_html)
log(u'获取wx_url成功,%s' % wx_url)
# Step 3:Selenium+PhantomJs获取js异步加载渲染后的html
log(u'开始调用selenium渲染html')
selenium_html = get_selenium_js_html(wx_url)
# Step 4: 检测目标网站是否进行了封锁
if need_verify(selenium_html):
log(u'爬虫被目标网站封锁,请稍后再试')
else:
# Step 5: 使用PyQuery,从Step 3获取的html中解析出公众号文章列表的数据
log(u'调用selenium渲染html完成,开始解析公众号文章')
articles = parse_wx_articles_by_html(selenium_html)
log(u'抓取到微信文章%d篇' % len(articles))
# Step 6: 把微信文章数据封装成字典的list
log(u'开始整合微信文章数据为字典')
articles_list = switch_arctiles_to_list(articles)
return [content['title'] for content in articles_list]
```
main入口函数:
```python
# coding: utf8
import spider_weixun_by_sogou
if __name__ == '__main__':
gongzhonghao = raw_input(u'input weixin gongzhonghao:')
if not gongzhonghao:
gongzhonghao = 'spider'
text = " ".join(spider_weixun_by_sogou.run(gongzhonghao))
print text
  ```
<p>直接运行main方法,然后在控制台中输入要爬网的公共帐户的英文名称. 中文搜索可能不止一个. 此处所做的只是对精确搜索的搜索. 只需检查电话并检查公共帐户号的英文,请单击公共帐户,然后查看公共帐户信息以查看以下与“ mask5}爬网的爬虫结果相关的信息. 您可以通过在代码中调用webdriver.py来检索文章的特定内容. 查看全部

  [Python]抢到微信官方账号文章
  
  我目前正在开发自己的项目,该项目涉及文章,该项目需要通过python抓取微信官方帐户. 由于微信的独特方法,不可能直接爬网. 研究了一些文章之后,我可能会有想法. 目前,Internet可以毫无问题地搜索提议的解决方案,但是由于第三方库中的某些更改,内部代码基本上无法使用. 本文是为需要爬网公共帐户文章的朋友而写的. 最后还将提供python源代码下载.
  ##公共帐户捕获方法
  当前有两种主流的公共帐户爬网解决方案. 一种是搜索搜狗的微信官方帐户页面,找到文章地址,然后获取特定的文章内容. 第二种方法是注册一个公共帐户,然后通过官方帐户的搜索界面可以查询产品地址,然后根据该地址获取产品内容.
  这两种方案各有优缺点. 搜狗搜索的核心思想是通过请求模拟搜狗搜索公共账号,然后解析搜索结果页面,然后根据公共账号的首页地址对抓取工具进行爬网. }已捕获详细信息. 由于搜狗与腾讯之间的协议,只能显示最新的10个文章,但无法获取所有文章. 如果要获取所有文章,则朋友可能必须使用第二种方法. 第二种方法的缺点是通过腾讯身份验证注册公共帐户. 这个过程比较麻烦. 您可以通过调用该界面的公共帐户查询界面进行查询,但是您需要使用硒来模拟滑动页面翻页操作. 整个过程仍然很麻烦. 是. 因为我的项目不需要历史记录文章,所以我使用搜狗搜索功能来检索公共帐户.
  检索最近的10个公共帐户文章
  Python需要依赖的第三方库如下:
  
  urllib,pyquery,请求,硒
  具体逻辑写在注释中,没有什么特别复杂的.
  核心爬虫课程
  ```python
  #! / usr / bin / python
  #代码: utf-8
  
  [Python]纯文本视图复制代码
  import sys
reload(sys)
sys.setdefaultencoding('utf-8')
from urllib import quote
from pyquery import PyQuery as pq
import requests
import time
import re
import os
from selenium.webdriver import Chrome
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support.wait import WebDriverWait
# 搜索入口地址,以公众为关键字搜索该公众号
def get_search_result_by_keywords(sogou_search_url):
# 爬虫伪装头部设置
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0'}
# 设置操作超时时长
timeout = 5
# 爬虫模拟在一个request.session中完成
s = requests.Session()
log(u'搜索地址为:%s' % sogou_search_url)
return s.get(sogou_search_url, headers=headers, timeout=timeout).content
# 获得公众号主页地址
def get_wx_url_by_sougou_search_html(sougou_search_html):
doc = pq(sougou_search_html)
return doc('div[class=txt-box]')('p[class=tit]')('a').attr('href')
# 使用webdriver 加载公众号主页内容,主要是js渲染的部分
def get_selenium_js_html(url):
options = Options()
options.add_argument('-headless') # 无头参数
driver = Chrome(executable_path='chromedriver', chrome_options=options)
wait = WebDriverWait(driver, timeout=10)
driver.get(url)
time.sleep(3)
# 执行js得到整个页面内容
html = driver.execute_script("return document.documentElement.outerHTML")
driver.close()
return html
# 获取公众号文章内容
def parse_wx_articles_by_html(selenium_html):
doc = pq(selenium_html)
return doc('div[class="weui_media_box appmsg"]')
# 将获取到的文章转换为字典
def switch_arctiles_to_list(articles):
# 定义存贮变量
articles_list = []
i = 1
# 遍历找到的文章,解析里面的内容
if articles:
for article in articles.items():
log(u'开始整合(%d/%d)' % (i, len(articles)))
# 处理单个文章
articles_list.append(parse_one_article(article))
i += 1
return articles_list
# 解析单篇文章
def parse_one_article(article):
article_dict = {}
# 获取标题
title = article('h4[class="weui_media_title"]').text().strip()
###log(u'标题是: %s' % title)
# 获取标题对应的地址
url = 'http://mp.weixin.qq.com' + article('h4[class="weui_media_title"]').attr('hrefs')
log(u'地址为: %s' % url)
# 获取概要内容
summary = article('.weui_media_desc').text()
log(u'文章简述: %s' % summary)
# 获取文章发表时间
date = article('.weui_media_extra_info').text().strip()
log(u'发表时间为: %s' % date)
# 获取封面图片
pic = parse_cover_pic(article)
# 返回字典数据
return {
'title': title,
'url': url,
'summary': summary,
'date': date,
'pic': pic
}
# 查找封面图片,获取封面图片地址
def parse_cover_pic(article):
pic = article('.weui_media_hd').attr('style')
p = re.compile(r'background-image:url\((.*?)\)')
rs = p.findall(pic)
log(u'封面图片是:%s ' % rs[0] if len(rs) > 0 else '')
return rs[0] if len(rs) > 0 else ''
# 自定义log函数,主要是加上时间
def log(msg):
print u'%s: %s' % (time.strftime('%Y-%m-%d_%H-%M-%S'), msg)
# 验证函数
def need_verify(selenium_html):
' 有时候对方会封锁ip,这里做一下判断,检测html中是否包含id=verify_change的标签,有的话,代表被重定向了,提醒过一阵子重试 '
return pq(selenium_html)('#verify_change').text() != ''
# 创建公众号命名的文件夹
def create_dir(keywords):
if not os.path.exists(keywords):
os.makedirs(keywords)
# 爬虫主函数
def run(keywords):
' 爬虫入口函数 '
# Step 0 : 创建公众号命名的文件夹
create_dir(keywords)
# 搜狐微信搜索链接入口
sogou_search_url = 'http://weixin.sogou.com/weixin?type=1&query=%s&ie=utf8&s_from=input&_sug_=n&_sug_type_=' % quote(
keywords)
# Step 1:GET请求到搜狗微信引擎,以微信公众号英文名称作为查询关键字
log(u'开始获取,微信公众号英文名为:%s' % keywords)
log(u'开始调用sougou搜索引擎')
sougou_search_html = get_search_result_by_keywords(sogou_search_url)
# Step 2:从搜索结果页中解析出公众号主页链接
log(u'获取sougou_search_html成功,开始抓取公众号对应的主页wx_url')
wx_url = get_wx_url_by_sougou_search_html(sougou_search_html)
log(u'获取wx_url成功,%s' % wx_url)
# Step 3:Selenium+PhantomJs获取js异步加载渲染后的html
log(u'开始调用selenium渲染html')
selenium_html = get_selenium_js_html(wx_url)
# Step 4: 检测目标网站是否进行了封锁
if need_verify(selenium_html):
log(u'爬虫被目标网站封锁,请稍后再试')
else:
# Step 5: 使用PyQuery,从Step 3获取的html中解析出公众号文章列表的数据
log(u'调用selenium渲染html完成,开始解析公众号文章')
articles = parse_wx_articles_by_html(selenium_html)
log(u'抓取到微信文章%d篇' % len(articles))
# Step 6: 把微信文章数据封装成字典的list
log(u'开始整合微信文章数据为字典')
articles_list = switch_arctiles_to_list(articles)
return [content['title'] for content in articles_list]
```
main入口函数:
```python
# coding: utf8
import spider_weixun_by_sogou
if __name__ == '__main__':
gongzhonghao = raw_input(u'input weixin gongzhonghao:')
if not gongzhonghao:
gongzhonghao = 'spider'
text = " ".join(spider_weixun_by_sogou.run(gongzhonghao))
print text
  ```
<p>直接运行main方法,然后在控制台中输入要爬网的公共帐户的英文名称. 中文搜索可能不止一个. 此处所做的只是对精确搜索的搜索. 只需检查电话并检查公共帐户号的英文,请单击公共帐户,然后查看公共帐户信息以查看以下与“ mask5}爬网的爬虫结果相关的信息. 您可以通过在代码中调用webdriver.py来检索文章的特定内容.

干货内容:Python入门学习教程:50行Python代码,教你获取公众号全部文章

采集交流优采云 发表了文章 • 0 个评论 • 206 次浏览 • 2020-08-31 16:07 • 来自相关话题

  Python入门学习教程: 50行Python代码,教您获得所有正式帐户的文章
  今天的Python入门学习教程主要告诉您如何获取官方帐户的所有文章!
  在阅读官方帐户的文章时,我们通常会遇到一个问题-阅读历史文章的经验不好.
  我们知道,有两种常见的爬网官方帐户的方法: 通过搜狗搜索获得它. 缺点是只能获取最新的十篇文章. 通过微信官方账号的物料管理获取官方账号. 缺点是您需要申请自己的官方帐户.
  
  今天,我们将介绍一种通过在PC端捕获微信来获取官方帐户文章的方法. 与其他方法相比,它非常方便.
  
  
  如上图所示,我们通过数据包捕获工具获得了微信网络信息请求. 我们发现,每次下拉列表中的文章时,我们都会请求/ mp / xxx(官方帐户不允许添加首页链接,xxx表示profile_ext).
  经过多次测试和分析,使用了以下参数
  数据如下
  {
"ret": 0,
"errmsg": "ok", # 请求状态
"msg_count": 10, # 信息条数
"can_msg_continue": 1, # 是否还可以继续获取,1代表可以。0代表不可以,也就是最后一页
"general_msg_list": "{"list":[]}", # 公众号文本信息
"next_offset": 20,
"video_count": 1,
"use_video_tab": 1,
"real_type": 0,
"home_page_list": []
}
  部分代码如下
   params = {
'__biz': biz,
'uin': uin,
'key': key,
'offset': offset,
'count': count,
'action': 'getmsg',
'f': 'json'
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
}
response = requests.get(url=url, params=params, headers=headers)
resp_json = response.json()
if resp_json.get('errmsg') == 'ok':
resp_json = response.json()
# 是否还有分页数据, 用于判断return的值
can_msg_continue = resp_json['can_msg_continue']
# 当前分页文章数
msg_count = resp_json['msg_count']
general_msg_list = json.loads(resp_json['general_msg_list'])
list = general_msg_list.get('list')
print(list, "**************")
  最后打印的列表是官方帐户的文章信息详细信息. 包括标题(标题),摘要(摘要),文章地址(content_url),阅读源地址(source_url),封面图像(封面),作者(作者)等...
  输出结果如下:
  [{
"comm_msg_info": {
"id": 1000000038,
"type": 49,
"datetime": 1560474000,
"fakeid": "3881067844",
"status": 2,
"content": ""
},
"app_msg_ext_info": {
"title": "入门爬虫,这一篇就够了!!!",
"digest": "入门爬虫,这一篇就够了!!!",
"content": "",
"fileid": 0,
"content_url": "http:XXXXXX",
"source_url": "",
"cover": "I5kME6BVXeLibZDUhsiaEYiaX7zOoibxa9sb4stIwrfuqID5ttmiaoVAFyxKF6IjOCyl22vg8n2NPv98ibow\\/0?wx_fmt=jpeg",
"subtype": 9,
"is_multi": 0,
"multi_app_msg_item_list": [],
"author": "Python3X",
"copyright_stat": 11,
"duration": 0,
"del_flag": 1,
"item_show_type": 0,
"audio_fileid": 0,
"play_url": "",
"malicious_title_reason_id": 0,
"malicious_content_type": 0
}
},{...},{...},{...},{...},{...},{...},{...},{...},{...}]
  获取数据后,可以将其保存在数据库中或将文章保存在PDF中.
  1,保存在Mongo中
  # Mongo配置
conn = MongoClient('127.0.0.1', 27017)
db = conn.wx #连接wx数据库,没有则自动创建
mongo_wx = db.article #使用article集合,没有则自动创建
for i in list:
app_msg_ext_info = i['app_msg_ext_info']
# 标题
title = app_msg_ext_info['title']
# 文章地址
content_url = app_msg_ext_info['content_url']
# 封面图
cover = app_msg_ext_info['cover']
# 发布时间
datetime = i['comm_msg_info']['datetime']
datetime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(datetime))
mongo_wx.insert({
'title': title,
'content_url': content_url,
'cover': cover,
'datetime': datetime
})
  结果如下
  
  2. 导入PDF文件
  在Python3中处理PDF的常用库包括python-pdf和pdfkit. 我使用pdfkit模块导出pdf文件.
  pdfkit是Wkhtmltopdf工具包的软件包类,因此需要安装Wkhtmltopdf才能使用它.
  有权下载与操作系统匹配的工具包.
  
  实现代码也相对简单,只需要传入导入文件的URL即可.
  安装pdfkit库
  pip3 install pdfkit -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
  import pdfkit
pdfkit.from_url('公众号文章地址', 'out.pdf')
  运行后成功导出pdf文件.
  
  完整代码 查看全部

  Python入门学习教程: 50行Python代码,教您获得所有正式帐户的文章
  今天的Python入门学习教程主要告诉您如何获取官方帐户的所有文章!
  在阅读官方帐户的文章时,我们通常会遇到一个问题-阅读历史文章的经验不好.
  我们知道,有两种常见的爬网官方帐户的方法: 通过搜狗搜索获得它. 缺点是只能获取最新的十篇文章. 通过微信官方账号的物料管理获取官方账号. 缺点是您需要申请自己的官方帐户.
  
  今天,我们将介绍一种通过在PC端捕获微信来获取官方帐户文章的方法. 与其他方法相比,它非常方便.
  
  
  如上图所示,我们通过数据包捕获工具获得了微信网络信息请求. 我们发现,每次下拉列表中的文章时,我们都会请求/ mp / xxx(官方帐户不允许添加首页链接,xxx表示profile_ext).
  经过多次测试和分析,使用了以下参数
  数据如下
  {
"ret": 0,
"errmsg": "ok", # 请求状态
"msg_count": 10, # 信息条数
"can_msg_continue": 1, # 是否还可以继续获取,1代表可以。0代表不可以,也就是最后一页
"general_msg_list": "{"list":[]}", # 公众号文本信息
"next_offset": 20,
"video_count": 1,
"use_video_tab": 1,
"real_type": 0,
"home_page_list": []
}
  部分代码如下
   params = {
'__biz': biz,
'uin': uin,
'key': key,
'offset': offset,
'count': count,
'action': 'getmsg',
'f': 'json'
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
}
response = requests.get(url=url, params=params, headers=headers)
resp_json = response.json()
if resp_json.get('errmsg') == 'ok':
resp_json = response.json()
# 是否还有分页数据, 用于判断return的值
can_msg_continue = resp_json['can_msg_continue']
# 当前分页文章数
msg_count = resp_json['msg_count']
general_msg_list = json.loads(resp_json['general_msg_list'])
list = general_msg_list.get('list')
print(list, "**************")
  最后打印的列表是官方帐户的文章信息详细信息. 包括标题(标题),摘要(摘要),文章地址(content_url),阅读源地址(source_url),封面图像(封面),作者(作者)等...
  输出结果如下:
  [{
"comm_msg_info": {
"id": 1000000038,
"type": 49,
"datetime": 1560474000,
"fakeid": "3881067844",
"status": 2,
"content": ""
},
"app_msg_ext_info": {
"title": "入门爬虫,这一篇就够了!!!",
"digest": "入门爬虫,这一篇就够了!!!",
"content": "",
"fileid": 0,
"content_url": "http:XXXXXX",
"source_url": "",
"cover": "I5kME6BVXeLibZDUhsiaEYiaX7zOoibxa9sb4stIwrfuqID5ttmiaoVAFyxKF6IjOCyl22vg8n2NPv98ibow\\/0?wx_fmt=jpeg",
"subtype": 9,
"is_multi": 0,
"multi_app_msg_item_list": [],
"author": "Python3X",
"copyright_stat": 11,
"duration": 0,
"del_flag": 1,
"item_show_type": 0,
"audio_fileid": 0,
"play_url": "",
"malicious_title_reason_id": 0,
"malicious_content_type": 0
}
},{...},{...},{...},{...},{...},{...},{...},{...},{...}]
  获取数据后,可以将其保存在数据库中或将文章保存在PDF中.
  1,保存在Mongo中
  # Mongo配置
conn = MongoClient('127.0.0.1', 27017)
db = conn.wx #连接wx数据库,没有则自动创建
mongo_wx = db.article #使用article集合,没有则自动创建
for i in list:
app_msg_ext_info = i['app_msg_ext_info']
# 标题
title = app_msg_ext_info['title']
# 文章地址
content_url = app_msg_ext_info['content_url']
# 封面图
cover = app_msg_ext_info['cover']
# 发布时间
datetime = i['comm_msg_info']['datetime']
datetime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(datetime))
mongo_wx.insert({
'title': title,
'content_url': content_url,
'cover': cover,
'datetime': datetime
})
  结果如下
  
  2. 导入PDF文件
  在Python3中处理PDF的常用库包括python-pdf和pdfkit. 我使用pdfkit模块导出pdf文件.
  pdfkit是Wkhtmltopdf工具包的软件包类,因此需要安装Wkhtmltopdf才能使用它.
  有权下载与操作系统匹配的工具包.
  
  实现代码也相对简单,只需要传入导入文件的URL即可.
  安装pdfkit库
  pip3 install pdfkit -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
  import pdfkit
pdfkit.from_url('公众号文章地址', 'out.pdf')
  运行后成功导出pdf文件.
  
  完整代码

福利:微信公众号文章“号内搜”新功能玩法

采集交流优采云 发表了文章 • 0 个评论 • 349 次浏览 • 2020-08-31 05:46 • 来自相关话题

  微信公众号文章“号码搜索”新功能玩法
  
  01官方帐户文章增加了“搜索”组件功能
  从今天开始的Xida Puben,用户可以直接在文章中搜索官方帐户历史记录新闻!什么也不要说,只看图片即可.
  
  
  如图所示,官方帐户文章可以具有内置的“搜索”组件. 该组件的左上角标有正式帐户的头像和指导词“推荐的正式帐户搜索”. 单击后,用户将进入搜索界面.
  正式帐户“推荐的搜索关键字”显示在搜索框下方. 用户可以根据需要在搜索框中输入任何关键字,也可以单击推荐的关键字进行搜索.
  通常,此新功能可以帮助用户快速检索帐户中的相关内容,这等效于内置在官方帐户历史记录页面中的“在帐户中搜索”条目. 不同之处在于该路径要浅得多. 更方便.
  毕竟,此功能如何工作?
  打开官方帐户后台编辑器页面,您将在页面顶部的菜单栏中看到新添加的“搜索”组件,单击以插入设置.
  
  只能为一篇文章创建一个搜索组件. 您最多可以设置6个搜索关键字. 拖放最右边的“三栏”图标以对关键字进行排序. 具体效果可在左侧视图的“图案预览”中找到.
  
  此外,先前设置的“历史搜索字词”将显示在关键字组下,以帮助操作员更好地设置它们. 点击“放大镜”图标以查看关键字搜索结果的预览.
  经过全面的体验,果酱女孩只想大声说: 这次微信终于不乏味了! (这就像一个梦,当我醒来时我仍然感动……)
  除了在文章中添加了新的“搜索”组件外,历史消息页面上隐藏的“数字内搜索”条目也已更改.
  1. “搜索范围”选项已添加到搜索内容中,下面有两个“无限”和“最近阅读”范围;
  2. 除了“按时间排序”之外,搜索结果还按“按阅读量排序”排序.
  02官方帐户搜索优化有什么影响?
  事实上,早在2017年,在最新版本的ios 6.5.6中,“帐户内搜索”功能已在官方帐户历史记录消息页面上启动,但由于入口不明显,实际上许多用户不知道该操作仍然可用.
  运营商不太可能希望增加用户对过去文章的浏览. 但是新功能的出现是另一种说法.
  1. 它有助于培养用户对官方帐户的搜索习惯
  现在,您可以为每个文章添加一个搜索框,条目会变浅,并且用户的操作路径也会缩短. 经过一段时间的指导,用户可以养成独立单击和搜索的习惯,这有助于他们更方便地获取所需的信息,另一方面,这也有助于增加官方帐户的粘性.
  目前,官方帐户背景不提供已设置关键字的点击数据. 将来会有相关数据来帮助运营商更好地计划主题选择吗?值得期待.
  2,帮助官方帐户整理内容
  文章中的搜索框最多可以收录6个关键字,这意味着操作员需要从他们最感兴趣或对读者最感兴趣的内容中提取关键字.
  如果您通常对内容指导有计划,这并不困难;如果您害怕编写所有内容,那么可能很难考虑关键字.
  如果您想突出显示自己的产品或服务,还可以设置关键字作为指导以加深用户的印象. 这样看来,新添加的搜索框是一个不错的广告牌. 装饰方式取决于个人.
  03操作员应如何充分利用此入口?
  1. 把它放在文章的开头,以吸引用户点击
  最高位置始终是最引人注目的,尤其是这是一项新功能. 应该注意的是,顶部的横幅图像不应太复杂,否则可能会使搜索框的光线模糊. 换句话说,它就像一个导航栏.
  如果您不知道要设置什么关键字,则可以参考后台的[Message Analysis]-[Message Keyword]数据,此数据分析将计算用户在后台答复的关键字频率TOP200. 查看全部

  微信公众号文章“号码搜索”新功能玩法
  
  01官方帐户文章增加了“搜索”组件功能
  从今天开始的Xida Puben,用户可以直接在文章中搜索官方帐户历史记录新闻!什么也不要说,只看图片即可.
  
  
  如图所示,官方帐户文章可以具有内置的“搜索”组件. 该组件的左上角标有正式帐户的头像和指导词“推荐的正式帐户搜索”. 单击后,用户将进入搜索界面.
  正式帐户“推荐的搜索关键字”显示在搜索框下方. 用户可以根据需要在搜索框中输入任何关键字,也可以单击推荐的关键字进行搜索.
  通常,此新功能可以帮助用户快速检索帐户中的相关内容,这等效于内置在官方帐户历史记录页面中的“在帐户中搜索”条目. 不同之处在于该路径要浅得多. 更方便.
  毕竟,此功能如何工作?
  打开官方帐户后台编辑器页面,您将在页面顶部的菜单栏中看到新添加的“搜索”组件,单击以插入设置.
  
  只能为一篇文章创建一个搜索组件. 您最多可以设置6个搜索关键字. 拖放最右边的“三栏”图标以对关键字进行排序. 具体效果可在左侧视图的“图案预览”中找到.
  
  此外,先前设置的“历史搜索字词”将显示在关键字组下,以帮助操作员更好地设置它们. 点击“放大镜”图标以查看关键字搜索结果的预览.
  经过全面的体验,果酱女孩只想大声说: 这次微信终于不乏味了! (这就像一个梦,当我醒来时我仍然感动……)
  除了在文章中添加了新的“搜索”组件外,历史消息页面上隐藏的“数字内搜索”条目也已更改.
  1. “搜索范围”选项已添加到搜索内容中,下面有两个“无限”和“最近阅读”范围;
  2. 除了“按时间排序”之外,搜索结果还按“按阅读量排序”排序.
  02官方帐户搜索优化有什么影响?
  事实上,早在2017年,在最新版本的ios 6.5.6中,“帐户内搜索”功能已在官方帐户历史记录消息页面上启动,但由于入口不明显,实际上许多用户不知道该操作仍然可用.
  运营商不太可能希望增加用户对过去文章的浏览. 但是新功能的出现是另一种说法.
  1. 它有助于培养用户对官方帐户的搜索习惯
  现在,您可以为每个文章添加一个搜索框,条目会变浅,并且用户的操作路径也会缩短. 经过一段时间的指导,用户可以养成独立单击和搜索的习惯,这有助于他们更方便地获取所需的信息,另一方面,这也有助于增加官方帐户的粘性.
  目前,官方帐户背景不提供已设置关键字的点击数据. 将来会有相关数据来帮助运营商更好地计划主题选择吗?值得期待.
  2,帮助官方帐户整理内容
  文章中的搜索框最多可以收录6个关键字,这意味着操作员需要从他们最感兴趣或对读者最感兴趣的内容中提取关键字.
  如果您通常对内容指导有计划,这并不困难;如果您害怕编写所有内容,那么可能很难考虑关键字.
  如果您想突出显示自己的产品或服务,还可以设置关键字作为指导以加深用户的印象. 这样看来,新添加的搜索框是一个不错的广告牌. 装饰方式取决于个人.
  03操作员应如何充分利用此入口?
  1. 把它放在文章的开头,以吸引用户点击
  最高位置始终是最引人注目的,尤其是这是一项新功能. 应该注意的是,顶部的横幅图像不应太复杂,否则可能会使搜索框的光线模糊. 换句话说,它就像一个导航栏.
  如果您不知道要设置什么关键字,则可以参考后台的[Message Analysis]-[Message Keyword]数据,此数据分析将计算用户在后台答复的关键字频率TOP200.

微信文章爬虫实现方式.docx

采集交流优采云 发表了文章 • 0 个评论 • 171 次浏览 • 2020-08-28 06:02 • 来自相关话题

  微信文章爬虫实现方式.docx
  文档介绍:
  微信文章爬虫实现方式
  如今越来越多的优质内容发布在微信公众号中,对那些内容,有些同事会有采集下来的需求,下面为你们介绍使用优采云爬虫工具去抓取采集微信文章信息。
  本文将以搜狗陌陌文章为例,介绍使用优采云采集网页文章正文的技巧。文章正文里通常包括文本和图片两种。本文将采集文章正文中的文本+图片URL。
  将采集以下数组:文章标题、时间、来源和正文(正文中的所有文本,将合并到一个excel单元格中,将使用到“自定义数据合并方法”功能,请你们注意)。同时,采集文章正文中的文本+图片URL,将用到“判断条件”,“判断条件”的使用,有很多须要注意的地方。以下两个教程,大家可先熟悉一下。
  “自定义数据合并方法”详解教程:
  orialdetail-1/zdyhb_7.html
  “判断条件”详解教程:
  orialdetail-1/judge.html
  采集网站:
  使用功能点:
  分页列表信息采集
  orial/fylb-70.aspx?t=1
  Xpath
  rch?query=XPath
  AJAX点击和翻页
  orial/ajaxdjfy_7.aspx?t=1
  判断条件
  orialdetail-1/judge.html
  AJAX滚动
  orialdetail-1/ajgd_7.html
  步骤1:创建采集任务
  1)进入主界面,选择“自定义模式”
  微信文章爬虫实现方式步骤1
  2)将要采集的网址URL复制粘贴到网站输入框中,点击“保存网址”
  微信文章爬虫实现方式步骤2
  步骤2:创建翻页循环
  在页面右上角,打开“流程”,以诠释出“流程设计器”和“定制当前操作”两个蓝筹股。网页打开后,默认显示“热门”文章。下拉页面,找到并点击“加载更多内容”按钮,在操作提示框中,选择“更多操作”
  微信文章爬虫实现方式步骤3
  选择“循环点击单个元素”,以创建一个翻页循环
  微信文章爬虫实现方式步骤4
  由于此网页涉及Ajax技术,我们须要进行一些中级选项的设置。选中“点击元素”步骤,打开“高级选项”,勾选“Ajax加载数据”,设置时间为“2秒”
  微信文章爬虫实现方式步骤5
  注:AJAX即延时加载、异步更新的一种脚本技术,通过在后台与服务器进行少量数据交换,可以在不重新加载整个网页的情况下,对网页的某部份进行更新。
  表现特点:a、点击网页中某个选项时,大部分网站的网址不会改变;b、网页不是完全加载,只是局部进行了数据加载,有所变化。 查看全部

  微信文章爬虫实现方式.docx
  文档介绍:
  微信文章爬虫实现方式
  如今越来越多的优质内容发布在微信公众号中,对那些内容,有些同事会有采集下来的需求,下面为你们介绍使用优采云爬虫工具去抓取采集微信文章信息。
  本文将以搜狗陌陌文章为例,介绍使用优采云采集网页文章正文的技巧。文章正文里通常包括文本和图片两种。本文将采集文章正文中的文本+图片URL。
  将采集以下数组:文章标题、时间、来源和正文(正文中的所有文本,将合并到一个excel单元格中,将使用到“自定义数据合并方法”功能,请你们注意)。同时,采集文章正文中的文本+图片URL,将用到“判断条件”,“判断条件”的使用,有很多须要注意的地方。以下两个教程,大家可先熟悉一下。
  “自定义数据合并方法”详解教程:
  orialdetail-1/zdyhb_7.html
  “判断条件”详解教程:
  orialdetail-1/judge.html
  采集网站:
  使用功能点:
  分页列表信息采集
  orial/fylb-70.aspx?t=1
  Xpath
  rch?query=XPath
  AJAX点击和翻页
  orial/ajaxdjfy_7.aspx?t=1
  判断条件
  orialdetail-1/judge.html
  AJAX滚动
  orialdetail-1/ajgd_7.html
  步骤1:创建采集任务
  1)进入主界面,选择“自定义模式”
  微信文章爬虫实现方式步骤1
  2)将要采集的网址URL复制粘贴到网站输入框中,点击“保存网址”
  微信文章爬虫实现方式步骤2
  步骤2:创建翻页循环
  在页面右上角,打开“流程”,以诠释出“流程设计器”和“定制当前操作”两个蓝筹股。网页打开后,默认显示“热门”文章。下拉页面,找到并点击“加载更多内容”按钮,在操作提示框中,选择“更多操作”
  微信文章爬虫实现方式步骤3
  选择“循环点击单个元素”,以创建一个翻页循环
  微信文章爬虫实现方式步骤4
  由于此网页涉及Ajax技术,我们须要进行一些中级选项的设置。选中“点击元素”步骤,打开“高级选项”,勾选“Ajax加载数据”,设置时间为“2秒”
  微信文章爬虫实现方式步骤5
  注:AJAX即延时加载、异步更新的一种脚本技术,通过在后台与服务器进行少量数据交换,可以在不重新加载整个网页的情况下,对网页的某部份进行更新。
  表现特点:a、点击网页中某个选项时,大部分网站的网址不会改变;b、网页不是完全加载,只是局部进行了数据加载,有所变化。

微信公众号文章爬取

采集交流优采云 发表了文章 • 0 个评论 • 226 次浏览 • 2020-08-28 03:12 • 来自相关话题

  微信公众号文章爬取
  哈哈,终于找到一个可以一键获取所有公众号上面的文章了,虽然比较笨,但是先凑活着,毕竟还破解不了登陆。
  参考链接:
  第一步:先注册一个公众号
  注册以后登陆到主页,找到这个素材管理
  
  然后你会看见下边这个页面
  
  点击这个绿色箭头指向的这个链接
  
  记得打开调试工具
  然后搜索你想爬取的公众号
  
  这个恳求会返回我们搜索到的公众号,我们要的公众号也在这个列表上面,假如在第一个
  
  我们须要这个fake-id来标记这个公众号
  接下选中,然后点一下
  
  然后文章列表就下来了
  整个过程就须要token,公众号名子,还有cookie了
  最后直接上代码了
  # -*- coding: utf-8 -*-
import pymysql as pymysql
from fake_useragent import UserAgent
import requests
import json
from retrying import retry
@retry(stop_max_attempt_number=5)
def get_author_list():
"""
获取搜索到的公众号列表
:return:
"""
global s
url = "https://mp.weixin.qq.com/cgi-b ... ry%3D{}&token={}&lang=zh_CN&f=json&ajax=1".format(
name, token)
try:
response = s.get(url, headers=headers, cookies=cookie)
text = json.loads(response.text)
# print('一共查询出来{}个公众号'.format(text['total']))
return text
except Exception as e:
print(e)
reset_parmas()
@retry(stop_max_attempt_number=5)
def get_first_author_params(text):
"""
获取单个公众号的参数
:param text: 前面搜索获取的公众号列表
:return:fake_id公众号id, text请求公众号详情的相应内容
"""
fake_id = text['list'][0] # 一般第一个就是咱们需要的,所以取第一个
# print(text['list'][0])
url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin=0&count=5&fakeid={}&type=9&query=&token={}&lang=zh_CN&f=json&ajax=1'.format(fake_id['fakeid'], token)
response = s.get(url, headers=headers, cookies=cookie)
try:
text1 = json.loads(response.text)
return text1, fake_id
except Exception as e:
print(e)
reset_parmas()
@retry(stop_max_attempt_number=5)
def get_title_url(text, fake_id):
"""
得到公众号的标题和链接
:param text:
:param fake_id:
:return:
"""
print(text)
num = int(text['app_msg_cnt'])
if num % 5 > 0:
num = num // 5 + 1
for i in range(num):
# token begin:参数传入
url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin={}&count=5&fakeid={}&type=9&query=&token={}&lang=zh_CN&f=json&ajax=1'.format(str(i * 5),fake_id['fakeid'], token,)
try:
response = s.get(url, headers=headers, cookies=cookie)
text = json.loads(response.text)
print(text)
artile_list = text['app_msg_list']
for artile in artile_list:
print('标题:{}'.format(artile['title']))
print('标题链接:{}'.format(artile['link']))
save_mysql(name, artile['title'], artile['link'])
except Exception as e:
print(e)
reset_parmas()
def save_mysql(name, title, url):
"""
保存数据到数据库
:param name: 作者名字
:param title:文章标题
:param url: 文章链接
:return:
"""
try:
sql = """INSERT INTO title_url(author_name, title, url) values ('{}', '{}', '{}')""".format(name, title, url)
conn.ping(reconnect=False)
cur.execute(sql)
conn.commit()
except Exception as e:
print(e)
def reset_parmas():
"""
失效后重新输入参数
:return:
"""
global name, token, s, cookie, headers
name = input("请输入你要查看的公众号名字: ")
token = input("请输入你当前登录自己公众号的token: ")
cookies = input("请输入当前页面的cookie: ")
s = requests.session()
cookie = {'cookie': cookies}
headers = {
"User-Agent": UserAgent().random,
"Host": "mp.weixin.qq.com",
}
def run():
reset_parmas()
text = get_author_list()
text1, fake_id = get_first_author_params(text)
get_title_url(text1, fake_id)
run()
  需要说明一下,数据库自己连我都不上代码了
  还有就是似乎插口更新的频繁,所以你只须要弄懂我的代码的逻辑就可以了
  OK 查看全部

  微信公众号文章爬取
  哈哈,终于找到一个可以一键获取所有公众号上面的文章了,虽然比较笨,但是先凑活着,毕竟还破解不了登陆。
  参考链接:
  第一步:先注册一个公众号
  注册以后登陆到主页,找到这个素材管理
  
  然后你会看见下边这个页面
  
  点击这个绿色箭头指向的这个链接
  
  记得打开调试工具
  然后搜索你想爬取的公众号
  
  这个恳求会返回我们搜索到的公众号,我们要的公众号也在这个列表上面,假如在第一个
  
  我们须要这个fake-id来标记这个公众号
  接下选中,然后点一下
  
  然后文章列表就下来了
  整个过程就须要token,公众号名子,还有cookie了
  最后直接上代码了
  # -*- coding: utf-8 -*-
import pymysql as pymysql
from fake_useragent import UserAgent
import requests
import json
from retrying import retry
@retry(stop_max_attempt_number=5)
def get_author_list():
"""
获取搜索到的公众号列表
:return:
"""
global s
url = "https://mp.weixin.qq.com/cgi-b ... ry%3D{}&token={}&lang=zh_CN&f=json&ajax=1".format(
name, token)
try:
response = s.get(url, headers=headers, cookies=cookie)
text = json.loads(response.text)
# print('一共查询出来{}个公众号'.format(text['total']))
return text
except Exception as e:
print(e)
reset_parmas()
@retry(stop_max_attempt_number=5)
def get_first_author_params(text):
"""
获取单个公众号的参数
:param text: 前面搜索获取的公众号列表
:return:fake_id公众号id, text请求公众号详情的相应内容
"""
fake_id = text['list'][0] # 一般第一个就是咱们需要的,所以取第一个
# print(text['list'][0])
url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin=0&count=5&fakeid={}&type=9&query=&token={}&lang=zh_CN&f=json&ajax=1'.format(fake_id['fakeid'], token)
response = s.get(url, headers=headers, cookies=cookie)
try:
text1 = json.loads(response.text)
return text1, fake_id
except Exception as e:
print(e)
reset_parmas()
@retry(stop_max_attempt_number=5)
def get_title_url(text, fake_id):
"""
得到公众号的标题和链接
:param text:
:param fake_id:
:return:
"""
print(text)
num = int(text['app_msg_cnt'])
if num % 5 > 0:
num = num // 5 + 1
for i in range(num):
# token begin:参数传入
url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin={}&count=5&fakeid={}&type=9&query=&token={}&lang=zh_CN&f=json&ajax=1'.format(str(i * 5),fake_id['fakeid'], token,)
try:
response = s.get(url, headers=headers, cookies=cookie)
text = json.loads(response.text)
print(text)
artile_list = text['app_msg_list']
for artile in artile_list:
print('标题:{}'.format(artile['title']))
print('标题链接:{}'.format(artile['link']))
save_mysql(name, artile['title'], artile['link'])
except Exception as e:
print(e)
reset_parmas()
def save_mysql(name, title, url):
"""
保存数据到数据库
:param name: 作者名字
:param title:文章标题
:param url: 文章链接
:return:
"""
try:
sql = """INSERT INTO title_url(author_name, title, url) values ('{}', '{}', '{}')""".format(name, title, url)
conn.ping(reconnect=False)
cur.execute(sql)
conn.commit()
except Exception as e:
print(e)
def reset_parmas():
"""
失效后重新输入参数
:return:
"""
global name, token, s, cookie, headers
name = input("请输入你要查看的公众号名字: ")
token = input("请输入你当前登录自己公众号的token: ")
cookies = input("请输入当前页面的cookie: ")
s = requests.session()
cookie = {'cookie': cookies}
headers = {
"User-Agent": UserAgent().random,
"Host": "mp.weixin.qq.com",
}
def run():
reset_parmas()
text = get_author_list()
text1, fake_id = get_first_author_params(text)
get_title_url(text1, fake_id)
run()
  需要说明一下,数据库自己连我都不上代码了
  还有就是似乎插口更新的频繁,所以你只须要弄懂我的代码的逻辑就可以了
  OK

用 Python 进行微信公众号开发

采集交流优采云 发表了文章 • 0 个评论 • 208 次浏览 • 2020-08-27 18:26 • 来自相关话题

  用 Python 进行微信公众号开发
  <p>本篇文章首先实现与公众号的对接,实现简单的回复文字、图片内容。下一篇会对接腾讯的AI平台,实现对照片的人脸检测与分析,分析年龄、性别、表情、魅力值等。
<a id="_2"></a>准备工作
  首先要注册一个公众号,这个很简单,我们到微信公众平台注册就可以了,选择个人订阅号就可以。但是如果可以认证的,我建议选择认证订阅号,因为未认证的号很多功能权限都没有。好了,话不多说进入正题。
  1. 配置公众号
打开公众号,在 开发->基本配置 页面填写内容。

下面说下需要填的内容,第一个URL要填的就是我们的服务地址,这个地址必须是外网地址并且是80端口。我们要本地开发时可以用 ngrok 解决。在ngrok.com官网下载。解压后就是一个exe程序。在当前目录下输入.\ngrok.exe http 80即可启动。启动后如下图所示,图片中网址就是我们需要的

然后我们复制红色方框里面的地址到微信的URL输入框中,比如我的就输入http://c9b15df5.ngrok.io/connect
后面这个connect是我自己的服务的地址。就是我们在程序开发中自己命名的一个请求路径,如果是新手的话建议按照我的来。不要改动,避免程序跑不起来。
第二个Token,自己想一个就行了,随便填,你可以当他为一个密码。
第三个自己生成就可以了。
最后一个消息加解密方式选择明文模式。配置到这里就结束了,我们先不要关闭这个页面,等我们Python程序验证部分写好以后点击页面下面的提交就可以了。现在点会报错的。
<a id="2_18"></a>2.接口验证部分代码编写
  查看官方文档,当我们点击配置页面的提交按钮时,微信后台会向我们配置的地址发送signature、timestamp、nonce、echostr四个信息,我们拿到这部分信息后通过哈希加密算法计算出(timestamp,nonce,token)的哈希值与微信发送的signature对比,如果相等则说明是微信后台的请求,然后把echostr返回,就表示验证成功。
  这一步,我们使用三个库,wechatpy-微信的Python SDK,falcon一个非常微小的Python Web框架,Waitress-一个Python WSGI服务器,当然在Linux上可以使用gunicorn代替waitress。通过pip install wechatpy[pycrypto]和pip install falcon,pip install waitress安装。代码如下,只需要把配置界面的token替换到代码里
import falcon
from falcon import uri
from wechatpy.utils import check_signature
from wechatpy.exceptions import InvalidSignatureException
class Connect(object):
def on_get(self, req, resp):
query_string = req.query_string
query_list = query_string.split('&')
b = {}
for i in query_list:
b[i.split('=')[0]] = i.split('=')[1]
try:
check_signature(token='这里填写配置界面你输入的token', signature=b['signature'], timestamp=b['timestamp'], nonce=b['nonce'])
resp.body = (b['echostr'])
except InvalidSignatureException:
pass
resp.status = falcon.HTTP_200
app = falcon.API()
connect = Connect()
app.add_route('/connect', connect)
</p>
  代码写好之后,我们在命令行输入 waitress-serve --port=80 connect:app在80端口启动我们的程序。启动后如下图,代表启动成功,这时候我们到陌陌的配置页面点击递交,会弹出递交成功消息框,代表我们成功接入陌陌
  
  简单说明以下里面代码,on_get函数接收陌陌发来的get恳求,并且通过query_string领到陌陌发送的参数,之后通过wechatpy的check_signature函数来校准。校验成功后把echostr返回给陌陌。
  3.发送文本信息给用户
  接入成功后,就可以回复用户的信息了。我们降低一个函数处理用户发送的消息,整体代码如下:
  import falcon
from wechatpy.utils import check_signature
from wechatpy.exceptions import InvalidSignatureException
from wechatpy import parse_message
from wechatpy.replies import TextReply, ImageReply
'''
遇到不懂的问题?Python学习交流群:821460695满足你的需求,资料都已经上传群文件,可以自行下载!
'''
class Connect(object):
def on_get(self, req, resp):
query_string = req.query_string
query_list = query_string.split('&')
b = {}
for i in query_list:
b[i.split('=')[0]] = i.split('=')[1]
try:
check_signature(token='xxxxx', signature=b['signature'], timestamp=b['timestamp'], nonce=b['nonce'])
resp.body = (b['echostr'])
except InvalidSignatureException:
pass
resp.status = falcon.HTTP_200
def on_post(self, req, resp):
xml = req.stream.read()
msg = parse_message(xml)
if msg.type == 'text':
reply = TextReply(content=msg.content, message=msg)
xml = reply.render()
resp.body = (xml)
resp.status = falcon.HTTP_200
app = falcon.API()
connect = Connect()
app.add_route('/connect', connect)
  我们导入了parse_message,TextReply,ImageReply函数。当领到用户消息时,判断是文本消息,就原貌返回给用户。现在我们启动脚本后,向公众号发送文本消息都会收到手动回复了。
  4. 发送图片信息给用户
  我们简单更改下on_post函数,使其除了能处理文本,也能处理图片信息。完整代码如下:
  import falcon
from wechatpy.utils import check_signature
from wechatpy.exceptions import InvalidSignatureException
from wechatpy import parse_message
from wechatpy.replies import TextReply, ImageReply
class Connect(object):
def on_get(self, req, resp):
query_string = req.query_string
query_list = query_string.split('&')
b = {}
for i in query_list:
b[i.split('=')[0]] = i.split('=')[1]
try:
check_signature(token='xxxxxxx', signature=b['signature'], timestamp=b['timestamp'], nonce=b['nonce'])
resp.body = (b['echostr'])
except InvalidSignatureException:
pass
resp.status = falcon.HTTP_200
def on_post(self, req, resp):
xml = req.stream.read()
msg = parse_message(xml)
if msg.type == 'text':
reply = TextReply(content=msg.content, message=msg)
xml = reply.render()
resp.body = (xml)
resp.status = falcon.HTTP_200
elif msg.type == 'image':
reply = ImageReply(media_id=msg.media_id, message=msg)
xml = reply.render()
resp.body = (xml)
resp.status = falcon.HTTP_200
app = falcon.API()
connect = Connect()
app.add_route('/connect', connect)
  我们在代码中加入了图片处理逻辑,如果是图片类型的消息,则把图片返回给用户。我们把图片发送给陌陌后台后,会手动生成一个media_id,我们发送这个media_id就可以了。
  效果图 查看全部

  用 Python 进行微信公众号开发
  <p>本篇文章首先实现与公众号的对接,实现简单的回复文字、图片内容。下一篇会对接腾讯的AI平台,实现对照片的人脸检测与分析,分析年龄、性别、表情、魅力值等。
<a id="_2"></a>准备工作
  首先要注册一个公众号,这个很简单,我们到微信公众平台注册就可以了,选择个人订阅号就可以。但是如果可以认证的,我建议选择认证订阅号,因为未认证的号很多功能权限都没有。好了,话不多说进入正题。
  1. 配置公众号
打开公众号,在 开发->基本配置 页面填写内容。

下面说下需要填的内容,第一个URL要填的就是我们的服务地址,这个地址必须是外网地址并且是80端口。我们要本地开发时可以用 ngrok 解决。在ngrok.com官网下载。解压后就是一个exe程序。在当前目录下输入.\ngrok.exe http 80即可启动。启动后如下图所示,图片中网址就是我们需要的

然后我们复制红色方框里面的地址到微信的URL输入框中,比如我的就输入http://c9b15df5.ngrok.io/connect
后面这个connect是我自己的服务的地址。就是我们在程序开发中自己命名的一个请求路径,如果是新手的话建议按照我的来。不要改动,避免程序跑不起来。
第二个Token,自己想一个就行了,随便填,你可以当他为一个密码。
第三个自己生成就可以了。
最后一个消息加解密方式选择明文模式。配置到这里就结束了,我们先不要关闭这个页面,等我们Python程序验证部分写好以后点击页面下面的提交就可以了。现在点会报错的。
<a id="2_18"></a>2.接口验证部分代码编写
  查看官方文档,当我们点击配置页面的提交按钮时,微信后台会向我们配置的地址发送signature、timestamp、nonce、echostr四个信息,我们拿到这部分信息后通过哈希加密算法计算出(timestamp,nonce,token)的哈希值与微信发送的signature对比,如果相等则说明是微信后台的请求,然后把echostr返回,就表示验证成功。
  这一步,我们使用三个库,wechatpy-微信的Python SDK,falcon一个非常微小的Python Web框架,Waitress-一个Python WSGI服务器,当然在Linux上可以使用gunicorn代替waitress。通过pip install wechatpy[pycrypto]和pip install falcon,pip install waitress安装。代码如下,只需要把配置界面的token替换到代码里
import falcon
from falcon import uri
from wechatpy.utils import check_signature
from wechatpy.exceptions import InvalidSignatureException
class Connect(object):
def on_get(self, req, resp):
query_string = req.query_string
query_list = query_string.split('&')
b = {}
for i in query_list:
b[i.split('=')[0]] = i.split('=')[1]
try:
check_signature(token='这里填写配置界面你输入的token', signature=b['signature'], timestamp=b['timestamp'], nonce=b['nonce'])
resp.body = (b['echostr'])
except InvalidSignatureException:
pass
resp.status = falcon.HTTP_200
app = falcon.API()
connect = Connect()
app.add_route('/connect', connect)
</p>
  代码写好之后,我们在命令行输入 waitress-serve --port=80 connect:app在80端口启动我们的程序。启动后如下图,代表启动成功,这时候我们到陌陌的配置页面点击递交,会弹出递交成功消息框,代表我们成功接入陌陌
  
  简单说明以下里面代码,on_get函数接收陌陌发来的get恳求,并且通过query_string领到陌陌发送的参数,之后通过wechatpy的check_signature函数来校准。校验成功后把echostr返回给陌陌。
  3.发送文本信息给用户
  接入成功后,就可以回复用户的信息了。我们降低一个函数处理用户发送的消息,整体代码如下:
  import falcon
from wechatpy.utils import check_signature
from wechatpy.exceptions import InvalidSignatureException
from wechatpy import parse_message
from wechatpy.replies import TextReply, ImageReply
'''
遇到不懂的问题?Python学习交流群:821460695满足你的需求,资料都已经上传群文件,可以自行下载!
'''
class Connect(object):
def on_get(self, req, resp):
query_string = req.query_string
query_list = query_string.split('&')
b = {}
for i in query_list:
b[i.split('=')[0]] = i.split('=')[1]
try:
check_signature(token='xxxxx', signature=b['signature'], timestamp=b['timestamp'], nonce=b['nonce'])
resp.body = (b['echostr'])
except InvalidSignatureException:
pass
resp.status = falcon.HTTP_200
def on_post(self, req, resp):
xml = req.stream.read()
msg = parse_message(xml)
if msg.type == 'text':
reply = TextReply(content=msg.content, message=msg)
xml = reply.render()
resp.body = (xml)
resp.status = falcon.HTTP_200
app = falcon.API()
connect = Connect()
app.add_route('/connect', connect)
  我们导入了parse_message,TextReply,ImageReply函数。当领到用户消息时,判断是文本消息,就原貌返回给用户。现在我们启动脚本后,向公众号发送文本消息都会收到手动回复了。
  4. 发送图片信息给用户
  我们简单更改下on_post函数,使其除了能处理文本,也能处理图片信息。完整代码如下:
  import falcon
from wechatpy.utils import check_signature
from wechatpy.exceptions import InvalidSignatureException
from wechatpy import parse_message
from wechatpy.replies import TextReply, ImageReply
class Connect(object):
def on_get(self, req, resp):
query_string = req.query_string
query_list = query_string.split('&')
b = {}
for i in query_list:
b[i.split('=')[0]] = i.split('=')[1]
try:
check_signature(token='xxxxxxx', signature=b['signature'], timestamp=b['timestamp'], nonce=b['nonce'])
resp.body = (b['echostr'])
except InvalidSignatureException:
pass
resp.status = falcon.HTTP_200
def on_post(self, req, resp):
xml = req.stream.read()
msg = parse_message(xml)
if msg.type == 'text':
reply = TextReply(content=msg.content, message=msg)
xml = reply.render()
resp.body = (xml)
resp.status = falcon.HTTP_200
elif msg.type == 'image':
reply = ImageReply(media_id=msg.media_id, message=msg)
xml = reply.render()
resp.body = (xml)
resp.status = falcon.HTTP_200
app = falcon.API()
connect = Connect()
app.add_route('/connect', connect)
  我们在代码中加入了图片处理逻辑,如果是图片类型的消息,则把图片返回给用户。我们把图片发送给陌陌后台后,会手动生成一个media_id,我们发送这个media_id就可以了。
  效果图

微信公众号文章爬虫

采集交流优采云 发表了文章 • 0 个评论 • 264 次浏览 • 2020-08-27 08:38 • 来自相关话题

  微信公众号文章爬虫
  很多的微信公众号都提供了质量比较高的文章阅读,对于自己喜欢的微信公众号,所以想做个微信公众号爬虫,爬取相关公众号的所有文章。抓取公众号的所有的文章,需要获取两个比较重要的参数。一个是微信公众号的惟一ID(__biz)和获取单一公众号的文章权限值wap_sid2。接下来说一下思路。
  
  搜索结果
  //*[@id="sogou_vr_11002301_box_n"]/div/div[2]/p[1]/a
  http://mp.weixin.qq.com/profil ... QOYo6*w5VxrUgy7RbCsdkuzfFQ1RiSgM3i9buMZPrYzmOne6mJxCtW*g==
  
  只有10条文章达不到要求
   //其中biz值就是微信公众号的唯一id值。前面和后面省略了大部分代码;该段代码位于script标签里面;该代码还有最近10条文章的数据,如果单纯想获取最近10条,可以通过正则表达式来直接获取   var biz = "MzIwNDA1OTM4NQ==" || "";   var src = "3" ;    var ver = "1" ;    var timestamp = "1508003829" ;    var signature = "Eu9LOYSA47p6WE0mojhMtFR-gSr7zsQOYo6*w5VxrUgy7RbCsdkuzfFQ1RiSgM3i9buMZPrYzmOne6mJxCtW*g==" ;    var name="python6359"||"python";
  获取到微信公众号的id值以后,就是要获取wap_sid值(即单个微信公众号的文章权限值。)这个部份从陌陌客户端获取,接下来通过Fiddler抓包工具获取,如果不知道抓包工具的环境搭建,可以参考 fiddler抓取摩拜自行车数据包
  获取的wap_sid2和__biz值
  # -*- coding: utf-8 -*- import scrapy from scrapy import Request from .mongo import MongoOperate import json from .settings import * class DataSpider(scrapy.Spider):     name = "data"     allowed_domains = ["mp.weixin.qq.com"]     start_urls = [&#39;https://mp.weixin.qq.com/&#39;]     count=10     url="https://mp.weixin.qq.com/mp/pr ... iz%3D{biz}&f=json&offset={index}&count=10&is_ok=1&scene=124&uin=777&key=777&pass_ticket=ULeI%2BILkTLA2IpuIDqbIla4jG6zBTm1jj75UIZCgIUAFzOX29YQeTm5UKYuXU6JY&wxtoken=&appmsg_token=925_%252B4oEmoVo6AFzfOotcwPrPnBvKbEdnLNzg5mK8Q~~&x5=0&f=json"     def start_requests(self):       MongoObj=MongoOperate(MONGO_URI,MONGO_DATABASE,MONGO_USER,MONGO_PASS,RESPONSE)         MongoObj.connect()         items=MongoObj.finddata()         for item in items:             headers={                 &#39;Accept-Encoding&#39;:&#39;gzip, deflate&#39;,                 &#39;Connection&#39;:&#39;keep-alive&#39;,                 &#39;Accept&#39;:&#39;*/*&#39;,                 &#39;User-Agent&#39;: &#39;Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_1 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Mobile/14A403 MicroMessenger/6.5.18 NetType/WIFI Language/zh_CN&#39;,                 &#39;Accept-Language&#39;: &#39;zh-cn&#39;,                 &#39;X-Requested-With&#39;: &#39;XMLHttpRequest&#39;,                 &#39;X-WECHAT-KEY&#39;: &#39;62526065241838a5d44f7e7e14d5ffa3e87f079dc50a66e615fe9b6169c8fdde0f7b9f36f3897212092d73a3a223ffd21514b690dd8503b774918d8e86dfabbf46d1aedb66a2c7d29b8cc4f017eadee6&#39;,                 &#39;X-WECHAT-UIN&#39;: &#39;MTU2MzIxNjQwMQ%3D%3D&#39;,                 &#39;Cookie&#39;:&#39;;wxuin=1563216401;pass_ticket=oQDl45NRtfvQIxv2j2pYDSOOeflIXU7V3x1TUaOTpi6SkMp2B3fJwF6TE40ATCpU;ua_id=Wz1u21T8nrdNEyNaAAAAAOcFaBcyz4SH5DoQIVDcnao=;pgv_pvid=7103943278;sd_cookie_crttime=1501115135519;sd_userid=8661501115135519;3g_guest_id=-8872936809911279616;tvfe_boss_uuid=8ed9ed1b3a838836;mobileUV=1_15c8d374ca8_da9c8;pgv_pvi=8005854208&#39;             }             biz=item["biz"]       #主要验证是wap_sid2;pass_ticket不一样无所谓             headers["Cookie"]="wap_sid2="+item["wap_sid2"]+headers["Cookie"]             yield Request(url=self.url.format(biz=biz,index="10"),headers=headers,callback=self.parse,dont_filter=True,meta={"biz":biz,"headers":headers},)     def parse(self, response):         biz=response.request.meta["biz"]         headers=response.request.meta["headers"]         resText=json.loads(response.text)         print(resText)         list=json.loads(resText["general_msg_list"])         print(list)         yield list         if resText["can_msg_continue"]==1:             self.count=self.count+10             yield Request(url=self.url.format(biz=biz,index=str(self.count)),headers=headers,callback=self.parse,dont_filter=True,meta={"biz":biz,"headers":headers})         else:             print("end")
  
  最终捕获的数据
  static function OnBeforeResponse(oSession: Session) {       if (oSession.HostnameIs("mp.weixin.qq.com") && oSession.uriContains("/mp/profile_ext?action=home")) {           oSession["ui-color"] = "orange";           oSession.SaveResponse("C:\\Users\\Administrator\\Desktop\\2.txt",false);           //oSession.SaveResponseBody("C:\\Users\\Administrator\\Desktop\\1.txt")       }       if (m_Hide304s && oSession.responseCode == 304) {           oSession["ui-hide"] = "true";       }   }
  响应头
  
  哈哈
  源代码的readme.md文件介绍使用的方法,需要可以直接到github里面获取源码,github源码地址;喜欢的给个star哟。
  其他类似文章
  作者:Evtion
  链接: 查看全部

  微信公众号文章爬虫
  很多的微信公众号都提供了质量比较高的文章阅读,对于自己喜欢的微信公众号,所以想做个微信公众号爬虫,爬取相关公众号的所有文章。抓取公众号的所有的文章,需要获取两个比较重要的参数。一个是微信公众号的惟一ID(__biz)和获取单一公众号的文章权限值wap_sid2。接下来说一下思路。
  
  搜索结果
  //*[@id="sogou_vr_11002301_box_n"]/div/div[2]/p[1]/a
  http://mp.weixin.qq.com/profil ... QOYo6*w5VxrUgy7RbCsdkuzfFQ1RiSgM3i9buMZPrYzmOne6mJxCtW*g==
  
  只有10条文章达不到要求
   //其中biz值就是微信公众号的唯一id值。前面和后面省略了大部分代码;该段代码位于script标签里面;该代码还有最近10条文章的数据,如果单纯想获取最近10条,可以通过正则表达式来直接获取   var biz = "MzIwNDA1OTM4NQ==" || "";   var src = "3" ;    var ver = "1" ;    var timestamp = "1508003829" ;    var signature = "Eu9LOYSA47p6WE0mojhMtFR-gSr7zsQOYo6*w5VxrUgy7RbCsdkuzfFQ1RiSgM3i9buMZPrYzmOne6mJxCtW*g==" ;    var name="python6359"||"python";
  获取到微信公众号的id值以后,就是要获取wap_sid值(即单个微信公众号的文章权限值。)这个部份从陌陌客户端获取,接下来通过Fiddler抓包工具获取,如果不知道抓包工具的环境搭建,可以参考 fiddler抓取摩拜自行车数据包
  获取的wap_sid2和__biz值
  # -*- coding: utf-8 -*- import scrapy from scrapy import Request from .mongo import MongoOperate import json from .settings import * class DataSpider(scrapy.Spider):     name = "data"     allowed_domains = ["mp.weixin.qq.com"]     start_urls = [&#39;https://mp.weixin.qq.com/&#39;]     count=10     url="https://mp.weixin.qq.com/mp/pr ... iz%3D{biz}&f=json&offset={index}&count=10&is_ok=1&scene=124&uin=777&key=777&pass_ticket=ULeI%2BILkTLA2IpuIDqbIla4jG6zBTm1jj75UIZCgIUAFzOX29YQeTm5UKYuXU6JY&wxtoken=&appmsg_token=925_%252B4oEmoVo6AFzfOotcwPrPnBvKbEdnLNzg5mK8Q~~&x5=0&f=json"     def start_requests(self):       MongoObj=MongoOperate(MONGO_URI,MONGO_DATABASE,MONGO_USER,MONGO_PASS,RESPONSE)         MongoObj.connect()         items=MongoObj.finddata()         for item in items:             headers={                 &#39;Accept-Encoding&#39;:&#39;gzip, deflate&#39;,                 &#39;Connection&#39;:&#39;keep-alive&#39;,                 &#39;Accept&#39;:&#39;*/*&#39;,                 &#39;User-Agent&#39;: &#39;Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_1 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Mobile/14A403 MicroMessenger/6.5.18 NetType/WIFI Language/zh_CN&#39;,                 &#39;Accept-Language&#39;: &#39;zh-cn&#39;,                 &#39;X-Requested-With&#39;: &#39;XMLHttpRequest&#39;,                 &#39;X-WECHAT-KEY&#39;: &#39;62526065241838a5d44f7e7e14d5ffa3e87f079dc50a66e615fe9b6169c8fdde0f7b9f36f3897212092d73a3a223ffd21514b690dd8503b774918d8e86dfabbf46d1aedb66a2c7d29b8cc4f017eadee6&#39;,                 &#39;X-WECHAT-UIN&#39;: &#39;MTU2MzIxNjQwMQ%3D%3D&#39;,                 &#39;Cookie&#39;:&#39;;wxuin=1563216401;pass_ticket=oQDl45NRtfvQIxv2j2pYDSOOeflIXU7V3x1TUaOTpi6SkMp2B3fJwF6TE40ATCpU;ua_id=Wz1u21T8nrdNEyNaAAAAAOcFaBcyz4SH5DoQIVDcnao=;pgv_pvid=7103943278;sd_cookie_crttime=1501115135519;sd_userid=8661501115135519;3g_guest_id=-8872936809911279616;tvfe_boss_uuid=8ed9ed1b3a838836;mobileUV=1_15c8d374ca8_da9c8;pgv_pvi=8005854208&#39;             }             biz=item["biz"]       #主要验证是wap_sid2;pass_ticket不一样无所谓             headers["Cookie"]="wap_sid2="+item["wap_sid2"]+headers["Cookie"]             yield Request(url=self.url.format(biz=biz,index="10"),headers=headers,callback=self.parse,dont_filter=True,meta={"biz":biz,"headers":headers},)     def parse(self, response):         biz=response.request.meta["biz"]         headers=response.request.meta["headers"]         resText=json.loads(response.text)         print(resText)         list=json.loads(resText["general_msg_list"])         print(list)         yield list         if resText["can_msg_continue"]==1:             self.count=self.count+10             yield Request(url=self.url.format(biz=biz,index=str(self.count)),headers=headers,callback=self.parse,dont_filter=True,meta={"biz":biz,"headers":headers})         else:             print("end")
  
  最终捕获的数据
  static function OnBeforeResponse(oSession: Session) {       if (oSession.HostnameIs("mp.weixin.qq.com") && oSession.uriContains("/mp/profile_ext?action=home")) {           oSession["ui-color"] = "orange";           oSession.SaveResponse("C:\\Users\\Administrator\\Desktop\\2.txt",false);           //oSession.SaveResponseBody("C:\\Users\\Administrator\\Desktop\\1.txt")       }       if (m_Hide304s && oSession.responseCode == 304) {           oSession["ui-hide"] = "true";       }   }
  响应头
  
  哈哈
  源代码的readme.md文件介绍使用的方法,需要可以直接到github里面获取源码,github源码地址;喜欢的给个star哟。
  其他类似文章
  作者:Evtion
  链接:

如何进行微信公众号数据统计 微信公众号数据统计功略

采集交流优采云 发表了文章 • 0 个评论 • 370 次浏览 • 2020-08-26 12:24 • 来自相关话题

  如何进行微信公众号数据统计 微信公众号数据统计功略
  
  很多人在做微信公众号的时侯都是比较盲目的,因为她们不懂得微信公众号数据统计要怎样做,下面我们追随拓途数据一起来了解一下怎样进行微信公众号数据统计的相关资料吧。
  如何进行微信公众号数据统计步骤一
  用搜索引擎搜索“微信公众平台”,找到微信公众平台的官网。点击进去,找到登陆入口,登录网页版陌陌公众号。
  如何进行微信公众号数据统计步骤二
  进入微信公众号的主页。下拉页面,在两侧工具栏找到“统计剖析”,下面收录有不同种类的数据统计。
  
  如何进行微信公众号数据统计
  如何进行微信公众号数据统计步骤三
  用户剖析——新关注、取消关注、净增关注、累积关注。点击用户剖析,这里就是你的微信公众号人数粉丝的下降,有多少人是新降低的关注,有多少人取关,都在这里可以看见。如果你想愈发直观的看你的帐号粉丝变化数,就将页面往下拉,下面就是图文的剖析,曲线图还有具体的数字变化。
  如何进行微信公众号数据统计步骤四
  图文剖析——指的就是你发布的陌陌文章送达给多少人,有多少人阅读了有多少人点赞转发了,这个比较直观的看清晰。
  如何进行微信公众号数据统计步骤五
  菜单剖析——菜单剖析指的是你的微信公众号下边设置的菜单以及子菜单都有多少人点击,对这个数据的统计。页面往下拉同样也是曲线图以及具体的数字剖析和对比。
  
  如何进行微信公众号数据统计
  如何进行微信公众号数据统计步骤六
  消息剖析——指消息发送人数次数以及人均的数据,以及,消息发送人数跟今日一周的对比,送达人数的对比还有人均的数据。
  如何进行微信公众号数据统计步骤七
  点击一侧的消息关键词指的是用户回复的消息中出现的频度,比如说排第一的就是你们最近一个月回复最多的关键词,有利于我们剖析。下面还有一个插口剖析是关于技术层面,第三方绑定数据等的统计。
  如何进行微信公众号数据统计呢?相信有了拓途数据到这一份微信公众号数据统计功略以后,一定可以帮助你更好地进行微信公众号的数据统计工作哦! 查看全部

  如何进行微信公众号数据统计 微信公众号数据统计功略
  
  很多人在做微信公众号的时侯都是比较盲目的,因为她们不懂得微信公众号数据统计要怎样做,下面我们追随拓途数据一起来了解一下怎样进行微信公众号数据统计的相关资料吧。
  如何进行微信公众号数据统计步骤一
  用搜索引擎搜索“微信公众平台”,找到微信公众平台的官网。点击进去,找到登陆入口,登录网页版陌陌公众号。
  如何进行微信公众号数据统计步骤二
  进入微信公众号的主页。下拉页面,在两侧工具栏找到“统计剖析”,下面收录有不同种类的数据统计。
  
  如何进行微信公众号数据统计
  如何进行微信公众号数据统计步骤三
  用户剖析——新关注、取消关注、净增关注、累积关注。点击用户剖析,这里就是你的微信公众号人数粉丝的下降,有多少人是新降低的关注,有多少人取关,都在这里可以看见。如果你想愈发直观的看你的帐号粉丝变化数,就将页面往下拉,下面就是图文的剖析,曲线图还有具体的数字变化。
  如何进行微信公众号数据统计步骤四
  图文剖析——指的就是你发布的陌陌文章送达给多少人,有多少人阅读了有多少人点赞转发了,这个比较直观的看清晰。
  如何进行微信公众号数据统计步骤五
  菜单剖析——菜单剖析指的是你的微信公众号下边设置的菜单以及子菜单都有多少人点击,对这个数据的统计。页面往下拉同样也是曲线图以及具体的数字剖析和对比。
  
  如何进行微信公众号数据统计
  如何进行微信公众号数据统计步骤六
  消息剖析——指消息发送人数次数以及人均的数据,以及,消息发送人数跟今日一周的对比,送达人数的对比还有人均的数据。
  如何进行微信公众号数据统计步骤七
  点击一侧的消息关键词指的是用户回复的消息中出现的频度,比如说排第一的就是你们最近一个月回复最多的关键词,有利于我们剖析。下面还有一个插口剖析是关于技术层面,第三方绑定数据等的统计。
  如何进行微信公众号数据统计呢?相信有了拓途数据到这一份微信公众号数据统计功略以后,一定可以帮助你更好地进行微信公众号的数据统计工作哦!

如何制做精致的公众号文章排版?微信公众号排版如何弄!

采集交流优采云 发表了文章 • 0 个评论 • 150 次浏览 • 2020-08-26 04:20 • 来自相关话题

  如何制做精致的公众号文章排版?微信公众号排版如何弄!
  
  我们平常在公众号里阅读文章就会发觉,有些公众号的文章排版特别的精致、非常的协调,但是有些公众号的文章排版就是比较的零乱,哪怕你的内容太有价值,文章的排版不精致的话,也会影响用户的阅读体验。那么精巧的公众号文章排版究竟是如何制做的呢?接下来,营销圈就和你们分享下微信公众号排版如何弄的方式!
  第1:精美的公众号文章排版是如何制做下来的?
  精美的公众号文章排版都是通过一种工具实现的,这个就是微信编辑器,这个工具中有很多图文模板可以使我们进行套用,我们中意哪一个模板,直接在陌陌编辑器中直接编辑就可以了。当我们的图文编辑好了以后,那么可以直接复制到微信公众号的素材管理中就可以群发了。
  第2:公众号文章排版的时侯须要注意哪些?
  当我们使用公众号文章排版的时侯,有些功能是vip会员才可以使用的,当然了这个也是可以理解。大家选择的时侯,尽量的多用几个平台尝试下,选择适宜自己的。另外,营销圈须要提醒下,让我们想在陌陌图文中插入一些图文链接的时侯,记得须要插入早已群发过的图文地址,否则会群发失败的,这点谨记。
  第3:有哪些微信公众号排版工具推荐的?
  在互联网上有很多微信公众号排版的平台,就营销圈自身的尝试来看好用的却是没有几个,这里推荐一个常用的就是这个“135陌陌编辑器”,大家可以自行百度尝试下。
  90%的人又阅读以下文章:微信如何能够更新到最新版本?微信更新最新版本的方式! 怎么提升微信公众号文章的阅读量?这篇文章帮你提升30%的浏览量! 微信公众号怎样做营运企划?营销圈教你公众号营运企划! 微信公众号中的订阅号、服务号、企业号的区别在于那里? 微信公众平台如何使用?营销圈告诉你微信公众平台使用方式! 查看全部

  如何制做精致的公众号文章排版?微信公众号排版如何弄!
  
  我们平常在公众号里阅读文章就会发觉,有些公众号的文章排版特别的精致、非常的协调,但是有些公众号的文章排版就是比较的零乱,哪怕你的内容太有价值,文章的排版不精致的话,也会影响用户的阅读体验。那么精巧的公众号文章排版究竟是如何制做的呢?接下来,营销圈就和你们分享下微信公众号排版如何弄的方式!
  第1:精美的公众号文章排版是如何制做下来的?
  精美的公众号文章排版都是通过一种工具实现的,这个就是微信编辑器,这个工具中有很多图文模板可以使我们进行套用,我们中意哪一个模板,直接在陌陌编辑器中直接编辑就可以了。当我们的图文编辑好了以后,那么可以直接复制到微信公众号的素材管理中就可以群发了。
  第2:公众号文章排版的时侯须要注意哪些?
  当我们使用公众号文章排版的时侯,有些功能是vip会员才可以使用的,当然了这个也是可以理解。大家选择的时侯,尽量的多用几个平台尝试下,选择适宜自己的。另外,营销圈须要提醒下,让我们想在陌陌图文中插入一些图文链接的时侯,记得须要插入早已群发过的图文地址,否则会群发失败的,这点谨记。
  第3:有哪些微信公众号排版工具推荐的?
  在互联网上有很多微信公众号排版的平台,就营销圈自身的尝试来看好用的却是没有几个,这里推荐一个常用的就是这个“135陌陌编辑器”,大家可以自行百度尝试下。
  90%的人又阅读以下文章:微信如何能够更新到最新版本?微信更新最新版本的方式! 怎么提升微信公众号文章的阅读量?这篇文章帮你提升30%的浏览量! 微信公众号怎样做营运企划?营销圈教你公众号营运企划! 微信公众号中的订阅号、服务号、企业号的区别在于那里? 微信公众平台如何使用?营销圈告诉你微信公众平台使用方式!

公众号文章采集可以应用什么方式

采集交流优采云 发表了文章 • 0 个评论 • 296 次浏览 • 2020-08-26 00:46 • 来自相关话题

  公众号文章采集可以应用什么方式
  如今微信公众号早已对于人们十分熟悉了,并且许多行业都在借助微信公众号来做营销,而公众号最主要的营销方法就是图文,那么公众号文章采集有什么方式?下面由拓途数据说一下。
  
  公众号文章采集
  公众号文章标题应当如何写才吸引人
  1.标题党
  标题党就是给你制造一种震惊或则吸引力,然后点进来却发觉“货不对版”给心中引起一种落差,这类标题对于三四十岁的阿姨大叔比较好使。
  2.标新立异
  就是很难去明白的标题,具有深层的含意或则压根就看不懂说的是啥。谓独创新意,理论和他人不一样。通常指提出新的主张、见解或创造出新奇的款式。也指为了显示自己,故意显露自己的与众不同或则用往常不同的抒发方法来吸引人。
  3.繁杂重复
  标题又长又罗嗦,起标题的人恨不得把全篇文章的意思都说出来,字眼重复。
  公众号文章采集整理怎样进行 介绍下边实用的方式
  方案一:基于搜狗入口
  在网上能搜索到的公众号文章采集相关的信息来看来看,这是最多、最直接、也是最简单的一种方案。
  一般流程是:
  1、搜狗微信搜索入口进行公众号搜索。
  2、选取公众号步入公众号历史文章列表3、对文章内容进行解析入库。
  采集过于频繁的话,搜狗搜索和公众号历史文章列表访问就会出现验证码。直接采用通常的脚本采集是难以领到验证码的。这里可以使用无头浏览器来进行访问,通过对接打码平台识别验证码。无头浏览器可采用selenium。
  即便采用无头浏览器同样存在问题:
  1、效率低下(实际上就是在跑一个完整的浏览器来模拟人类操作)。
  2、网页资源浏览器加载难以控制,脚本对浏览器加载很难控制3、验证码识别也未能做到100%,中途太可能会打断抓取流程。
  如果坚持使用搜狗入口并想进行完美采集的话只有降低代理IP。顺便说一句,公开免费的IP地址就别想了,非常不稳定,而且基本都被陌陌给封了。
  除了面临搜狗/微信的反爬虫机制之外,采用此方案还有其他的缺点: 查看全部

  公众号文章采集可以应用什么方式
  如今微信公众号早已对于人们十分熟悉了,并且许多行业都在借助微信公众号来做营销,而公众号最主要的营销方法就是图文,那么公众号文章采集有什么方式?下面由拓途数据说一下。
  
  公众号文章采集
  公众号文章标题应当如何写才吸引人
  1.标题党
  标题党就是给你制造一种震惊或则吸引力,然后点进来却发觉“货不对版”给心中引起一种落差,这类标题对于三四十岁的阿姨大叔比较好使。
  2.标新立异
  就是很难去明白的标题,具有深层的含意或则压根就看不懂说的是啥。谓独创新意,理论和他人不一样。通常指提出新的主张、见解或创造出新奇的款式。也指为了显示自己,故意显露自己的与众不同或则用往常不同的抒发方法来吸引人。
  3.繁杂重复
  标题又长又罗嗦,起标题的人恨不得把全篇文章的意思都说出来,字眼重复。
  公众号文章采集整理怎样进行 介绍下边实用的方式
  方案一:基于搜狗入口
  在网上能搜索到的公众号文章采集相关的信息来看来看,这是最多、最直接、也是最简单的一种方案。
  一般流程是:
  1、搜狗微信搜索入口进行公众号搜索。
  2、选取公众号步入公众号历史文章列表3、对文章内容进行解析入库。
  采集过于频繁的话,搜狗搜索和公众号历史文章列表访问就会出现验证码。直接采用通常的脚本采集是难以领到验证码的。这里可以使用无头浏览器来进行访问,通过对接打码平台识别验证码。无头浏览器可采用selenium。
  即便采用无头浏览器同样存在问题:
  1、效率低下(实际上就是在跑一个完整的浏览器来模拟人类操作)。
  2、网页资源浏览器加载难以控制,脚本对浏览器加载很难控制3、验证码识别也未能做到100%,中途太可能会打断抓取流程。
  如果坚持使用搜狗入口并想进行完美采集的话只有降低代理IP。顺便说一句,公开免费的IP地址就别想了,非常不稳定,而且基本都被陌陌给封了。
  除了面临搜狗/微信的反爬虫机制之外,采用此方案还有其他的缺点:

Python爬虫实战练习:爬取微信公众号文章

采集交流优采云 发表了文章 • 0 个评论 • 996 次浏览 • 2020-08-25 22:24 • 来自相关话题

  Python爬虫实战练习:爬取微信公众号文章
  接着,我们通过Python来获取同样的资源,但直接运行如下代码是难以获取资源的
  import requests
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B
requests.get(url).json()
# {'base_resp': {'ret': 200003, 'err_msg': 'invalid session'}}
  我们之所以能在浏览器上获取资源,是因为我们登陆了微信公众号前端。而Python并没有我们的登入信息,所以恳求是无效的。我们须要在requests中设置headers参数,在其中传入Cookie和User-Agent,来模拟登录
  由于每次头信息内容还会变动,因此我将这种内容装入在单独的文件中,即"wechat.yaml",信息如下
  cookie: ua_id=wuzWM9FKE14...<br />user_agent: Mozilla/5.0...
  之后只须要读取即可
  # 读取cookie和user_agent
import yaml
with open("wechat.yaml", "r") as file:
file_data = file.read()
config = yaml.safe_load(file_data)
headers = {
"Cookie": config['cookie'],
"User-Agent": config['user_agent']
}
requests.get(url, headers=headers, verify=False).json()
  在返回的JSON中,我们就听到了每位文章的标题(title), 摘要(digest), 链接(link), 推送时间(update_time)和封面地址(cover)等信息。
  appmsgid是每一次推送的惟一标识符,aid则是整篇推文的惟一标识符。
  
  实际上,除了Cookie外,URL中的token参数也会拿来限制爬虫,因此上述代码太有可能输出会是{'base_resp': {'ret': 200040, 'err_msg': 'invalid csrf token'}}
  接着我们写一个循环,获取所有文章的JSON,并进行保存。
  import json
import requests
import time
import random
import yaml
with open("wechat.yaml", "r") as file:
file_data = file.read()
config = yaml.safe_load(file_data)
headers = {
"Cookie": config['cookie'],
"User-Agent": config['user_agent']
}
# 请求参数
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
begin = "0"
params = {
"action": "list_ex",
"begin": begin,
"count": "5",
"fakeid": config['fakeid'],
"type": "9",
"token": config['token'],
"lang": "zh_CN",
"f": "json",
"ajax": "1"
}
# 存放结果
app_msg_list = []
# 在不知道公众号有多少文章的情况下,使用while语句
# 也方便重新运行时设置页数
i = 0
while True:
begin = i * 5
params["begin"] = str(begin)
# 随机暂停几秒,避免过快的请求导致过快的被查到
time.sleep(random.randint(1,10))
resp = requests.get(url, headers=headers, params = params, verify=False)
# 微信流量控制, 退出
if resp.json()['base_resp']['ret'] == 200013:
print("frequencey control, stop at {}".format(str(begin)))
break

# 如果返回的内容中为空则结束
if len(resp.json()['app_msg_list']) == 0:
print("all ariticle parsed")
break

app_msg_list.append(resp.json())
# 翻页
i += 1
  在里面代码中,我将fakeid和token也储存在了"wechat.yaml"文件中,这是因为fakeid是每位公众号都特有的标识符,而token则会经常性变动,该信息既可以通过解析URL获取,也可以从开发者工具中查看
  
  在爬取一段时间后,就会碰到如下的问题
  {'base_resp': {'err_msg': 'freq control', 'ret': 200013}}
  此时你在公众号后台尝试插入超链接时才能遇见如下这个提示
  
  这是公众号的流量限制,通常须要等上30-60分钟能够继续。为了完美处理这个问题,你可能须要申请多个公众号,可能须要和微信公众号的登陆系统斗智斗勇,或许还须要设置代理池。
  但是我并不需要一个工业级别的爬虫,只想爬取自己公众号的信息,因此等个一小时,重新登陆公众号,获取cookie和token,然后运行即可。我可不想用自己的兴趣挑战他人的饭碗。
  最后将结果以JSON格式保存。
  # 保存结果为JSON
json_name = "mp_data_{}.json".format(str(begin))
with open(json_name, "w") as file:
file.write(json.dumps(app_msg_list, indent=2, ensure_ascii=False))
  或者提取文章标识符,标题,URL,发布时间这四列信息,保存成CSV。 查看全部

  Python爬虫实战练习:爬取微信公众号文章
  接着,我们通过Python来获取同样的资源,但直接运行如下代码是难以获取资源的
  import requests
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B
requests.get(url).json()
# {'base_resp': {'ret': 200003, 'err_msg': 'invalid session'}}
  我们之所以能在浏览器上获取资源,是因为我们登陆了微信公众号前端。而Python并没有我们的登入信息,所以恳求是无效的。我们须要在requests中设置headers参数,在其中传入Cookie和User-Agent,来模拟登录
  由于每次头信息内容还会变动,因此我将这种内容装入在单独的文件中,即"wechat.yaml",信息如下
  cookie: ua_id=wuzWM9FKE14...<br />user_agent: Mozilla/5.0...
  之后只须要读取即可
  # 读取cookie和user_agent
import yaml
with open("wechat.yaml", "r") as file:
file_data = file.read()
config = yaml.safe_load(file_data)
headers = {
"Cookie": config['cookie'],
"User-Agent": config['user_agent']
}
requests.get(url, headers=headers, verify=False).json()
  在返回的JSON中,我们就听到了每位文章的标题(title), 摘要(digest), 链接(link), 推送时间(update_time)和封面地址(cover)等信息。
  appmsgid是每一次推送的惟一标识符,aid则是整篇推文的惟一标识符。
  
  实际上,除了Cookie外,URL中的token参数也会拿来限制爬虫,因此上述代码太有可能输出会是{'base_resp': {'ret': 200040, 'err_msg': 'invalid csrf token'}}
  接着我们写一个循环,获取所有文章的JSON,并进行保存。
  import json
import requests
import time
import random
import yaml
with open("wechat.yaml", "r") as file:
file_data = file.read()
config = yaml.safe_load(file_data)
headers = {
"Cookie": config['cookie'],
"User-Agent": config['user_agent']
}
# 请求参数
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
begin = "0"
params = {
"action": "list_ex",
"begin": begin,
"count": "5",
"fakeid": config['fakeid'],
"type": "9",
"token": config['token'],
"lang": "zh_CN",
"f": "json",
"ajax": "1"
}
# 存放结果
app_msg_list = []
# 在不知道公众号有多少文章的情况下,使用while语句
# 也方便重新运行时设置页数
i = 0
while True:
begin = i * 5
params["begin"] = str(begin)
# 随机暂停几秒,避免过快的请求导致过快的被查到
time.sleep(random.randint(1,10))
resp = requests.get(url, headers=headers, params = params, verify=False)
# 微信流量控制, 退出
if resp.json()['base_resp']['ret'] == 200013:
print("frequencey control, stop at {}".format(str(begin)))
break

# 如果返回的内容中为空则结束
if len(resp.json()['app_msg_list']) == 0:
print("all ariticle parsed")
break

app_msg_list.append(resp.json())
# 翻页
i += 1
  在里面代码中,我将fakeid和token也储存在了"wechat.yaml"文件中,这是因为fakeid是每位公众号都特有的标识符,而token则会经常性变动,该信息既可以通过解析URL获取,也可以从开发者工具中查看
  
  在爬取一段时间后,就会碰到如下的问题
  {'base_resp': {'err_msg': 'freq control', 'ret': 200013}}
  此时你在公众号后台尝试插入超链接时才能遇见如下这个提示
  
  这是公众号的流量限制,通常须要等上30-60分钟能够继续。为了完美处理这个问题,你可能须要申请多个公众号,可能须要和微信公众号的登陆系统斗智斗勇,或许还须要设置代理池。
  但是我并不需要一个工业级别的爬虫,只想爬取自己公众号的信息,因此等个一小时,重新登陆公众号,获取cookie和token,然后运行即可。我可不想用自己的兴趣挑战他人的饭碗。
  最后将结果以JSON格式保存。
  # 保存结果为JSON
json_name = "mp_data_{}.json".format(str(begin))
with open(json_name, "w") as file:
file.write(json.dumps(app_msg_list, indent=2, ensure_ascii=False))
  或者提取文章标识符,标题,URL,发布时间这四列信息,保存成CSV。

python爬虫公众号所有信息,并批量下载公众号视频

采集交流优采云 发表了文章 • 0 个评论 • 157 次浏览 • 2020-08-25 02:06 • 来自相关话题

  python爬虫公众号所有信息,并批量下载公众号视频
  目录
  前言
  本文的文字及图片来源于网路,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。
  作者: 数据剖析实战
  PS:如有须要Python学习资料的小伙伴可以加点击下方链接自行获取
  主要功能一、获取公众号信息:标题、摘要、封面、文章URL
  操作步骤:
  1、先自己申请一个公众号 2、登录自己的帐号,新建文章图文,点击超链接
  代码
   1 import re
2 ​
3 import requests
4 import jsonpath
5 import json
6 ​
7 headers = {
8 "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
9 "Host": "mp.weixin.qq.com",
10 "Referer": "https://mp.weixin.qq.com/cgi-b ... ot%3B,
11 "Cookie": "自己获取信息时的cookie"
12 }
13 ​
14 def getInfo():
15 for i in range(80):
16 # token random 需要要自己的 begin:参数传入
17 url = "https://mp.weixin.qq.com/cgi-b ... in%3D{}&count=5&query=&fakeid=MzI4MzkzMTc3OA%3D%3D&type=9".format(str(i * 5))
18 ​
19 response = requests.get(url, headers = headers)
20 ​
21 jsonRes = response.json()
22 ​
23 ​
24 titleList = jsonpath.jsonpath(jsonRes, "$..title")
25 coverList = jsonpath.jsonpath(jsonRes, "$..cover")
26 urlList = jsonpath.jsonpath(jsonRes, "$..link")
27 ​
28 # 遍历 构造可存储字符串
29 for index in range(len(titleList)):
30 title = titleList[index]
31 cover = coverList[index]
32 url = urlList[index]
33 ​
34 scvStr = "%s,%s, %s,\n" % (title, cover, url)
35 with open("info.csv", "a+", encoding="gbk", newline='') as f:
36 f.write(scvStr)
  获取结果(成功):
  
  二、获取文章内视频:实现批量下载
  通过对单篇视频文章分析,我找到了这个链接:
  
  通过网页打开发觉,是视频的网页下载链接:
  
  哎,好像有点意思了,找到了视频的网页纯下载链接,那就开始吧。
  发现链接里的有一个关键参数vid 不知道哪来的? 和获取到的其他信息也没有关系,那就只能硬来了。
  通过对单文章的url恳求信息里发觉了这个参数,然后进行获取。
  1 response = requests.get(url_wxv, headers=headers)
2 ​
3 # 我用的是正则,也可以使用xpath
4 jsonRes = response.text # 匹配:wxv_1105179750743556096
5 dirRe = r"wxv_.{19}"
6 result = re.search(dirRe, jsonRes)
7 ​
8 wxv = result.group(0)
9 print(wxv)
  视频下载:
   1 def getVideo(video_title, url_wxv):
2 video_path = './videoFiles/' + video_title + ".mp4"
3 ​
4 # 页面可下载形式
5 video_url_temp = "https://mp.weixin.qq.com/mp/vi ... ot%3B + wxv
6 response = requests.get(video_url_temp, headers=headers)
7 content = response.content.decode()
8 content = json.loads(content)
9 url_info = content.get("url_info")
10 video_url2 = url_info[0].get("url")
11 print(video_url2)
12 ​
13 # 请求要下载的url地址
14 html = requests.get(video_url2)
15 # content返回的是bytes型也就是二进制的数据。
16 html = html.content
17 with open(video_path, 'wb') as f:
18 f.write(html)
  那么所有信息就都完成了,进行code组装。
  a、获取公众号信息
  b、筛选单篇文章信息
  c、获取vid信息
  d、拼接视频页面下载URL
  e、下载视频,保存
  代码实验结果:
  
  
  . 查看全部

  python爬虫公众号所有信息,并批量下载公众号视频
  目录
  前言
  本文的文字及图片来源于网路,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。
  作者: 数据剖析实战
  PS:如有须要Python学习资料的小伙伴可以加点击下方链接自行获取
  主要功能一、获取公众号信息:标题、摘要、封面、文章URL
  操作步骤:
  1、先自己申请一个公众号 2、登录自己的帐号,新建文章图文,点击超链接
  代码
   1 import re
2 ​
3 import requests
4 import jsonpath
5 import json
6 ​
7 headers = {
8 "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
9 "Host": "mp.weixin.qq.com",
10 "Referer": "https://mp.weixin.qq.com/cgi-b ... ot%3B,
11 "Cookie": "自己获取信息时的cookie"
12 }
13 ​
14 def getInfo():
15 for i in range(80):
16 # token random 需要要自己的 begin:参数传入
17 url = "https://mp.weixin.qq.com/cgi-b ... in%3D{}&count=5&query=&fakeid=MzI4MzkzMTc3OA%3D%3D&type=9".format(str(i * 5))
18 ​
19 response = requests.get(url, headers = headers)
20 ​
21 jsonRes = response.json()
22 ​
23 ​
24 titleList = jsonpath.jsonpath(jsonRes, "$..title")
25 coverList = jsonpath.jsonpath(jsonRes, "$..cover")
26 urlList = jsonpath.jsonpath(jsonRes, "$..link")
27 ​
28 # 遍历 构造可存储字符串
29 for index in range(len(titleList)):
30 title = titleList[index]
31 cover = coverList[index]
32 url = urlList[index]
33 ​
34 scvStr = "%s,%s, %s,\n" % (title, cover, url)
35 with open("info.csv", "a+", encoding="gbk", newline='') as f:
36 f.write(scvStr)
  获取结果(成功):
  
  二、获取文章内视频:实现批量下载
  通过对单篇视频文章分析,我找到了这个链接:
  
  通过网页打开发觉,是视频的网页下载链接:
  
  哎,好像有点意思了,找到了视频的网页纯下载链接,那就开始吧。
  发现链接里的有一个关键参数vid 不知道哪来的? 和获取到的其他信息也没有关系,那就只能硬来了。
  通过对单文章的url恳求信息里发觉了这个参数,然后进行获取。
  1 response = requests.get(url_wxv, headers=headers)
2 ​
3 # 我用的是正则,也可以使用xpath
4 jsonRes = response.text # 匹配:wxv_1105179750743556096
5 dirRe = r"wxv_.{19}"
6 result = re.search(dirRe, jsonRes)
7 ​
8 wxv = result.group(0)
9 print(wxv)
  视频下载:
   1 def getVideo(video_title, url_wxv):
2 video_path = './videoFiles/' + video_title + ".mp4"
3 ​
4 # 页面可下载形式
5 video_url_temp = "https://mp.weixin.qq.com/mp/vi ... ot%3B + wxv
6 response = requests.get(video_url_temp, headers=headers)
7 content = response.content.decode()
8 content = json.loads(content)
9 url_info = content.get("url_info")
10 video_url2 = url_info[0].get("url")
11 print(video_url2)
12 ​
13 # 请求要下载的url地址
14 html = requests.get(video_url2)
15 # content返回的是bytes型也就是二进制的数据。
16 html = html.content
17 with open(video_path, 'wb') as f:
18 f.write(html)
  那么所有信息就都完成了,进行code组装。
  a、获取公众号信息
  b、筛选单篇文章信息
  c、获取vid信息
  d、拼接视频页面下载URL
  e、下载视频,保存
  代码实验结果:
  
  
  .

通过微信公众平台获取公众号文章的方式示例

采集交流优采云 发表了文章 • 0 个评论 • 217 次浏览 • 2020-08-25 02:04 • 来自相关话题

  通过微信公众平台获取公众号文章的方式示例
  
  选择自建图文:
  
  似乎象是公众号营运教学了
  进入编辑页面以后,点击超链接
  
  弹出选择框,我们在框中输入对应的公众号名子,即可出现对应的文章列表
  
  是不是太惊奇,可以打开控制台,查看一下恳求的插口
  
  打开response,里面就是我们须要的文章链接
  
  确定了数据之后,我们须要剖析一下这个插口。
  感觉很简单,一个GET恳求,携带一些参数。
  
  fakeid是公众号的独有ID,所以想通过名子直接获取文章列表,还须要先获取一下fakeid。
  当我们输入公众号名子后,点击搜索。可以看见触发了搜索插口,返回了fakeid。
  
  这个插口所需参数也不多。
  
  接下来,我们可以用代码来模拟以上的操作了。
  但是还须要使用现有Cookie防止登入。
  
  目前Cookie的有效期,我还没有测试。可能须要及时更新Cookie。
  测试代码:
  
import requests
import json
Cookie = '请换上自己的Cookie,获取方法:直接复制下来'
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
headers = {
"Cookie": Cookie,
"User-Agent": 'Mozilla/5.0 (Linux; Android 10; YAL-AL00 Build/HUAWEIYAL-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.64 HuaweiBrowser/10.0.1.335 Mobile Safari/537.36'
}
keyword = 'pythonlx' # 公众号名字:可自定义
token = '你的token' # 获取方法:如上述 直接复制下来
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&query={}&token={}&lang=zh_CN&f=json&ajax=1'.format(keyword,token)
doc = requests.get(search_url,headers=headers).text
jstext = json.loads(doc)
fakeid = jstext['list'][0]['fakeid']
data = {
"token": token,
"lang": "zh_CN",
"f": "json",
"ajax": "1",
"action": "list_ex",
"begin": 0,
"count": "5",
"query": "",
"fakeid": fakeid,
"type": "9",
}
json_test = requests.get(url, headers=headers, params=data).text
json_test = json.loads(json_test)
print(json_test)
  这样能够获取最新的10篇文章了,如果想要获取更多的历史文章,可以更改data中的"begin"参数,0是第一页,5是第二页,10是第三页(以此类推)
  但是若果想要大规模抓取的话:
  请给自己安排一个稳定的代理,降低爬虫的速率,准备多个帐号,来降低被封禁的可能性。 查看全部

  通过微信公众平台获取公众号文章的方式示例
  
  选择自建图文:
  
  似乎象是公众号营运教学了
  进入编辑页面以后,点击超链接
  
  弹出选择框,我们在框中输入对应的公众号名子,即可出现对应的文章列表
  
  是不是太惊奇,可以打开控制台,查看一下恳求的插口
  
  打开response,里面就是我们须要的文章链接
  
  确定了数据之后,我们须要剖析一下这个插口。
  感觉很简单,一个GET恳求,携带一些参数。
  
  fakeid是公众号的独有ID,所以想通过名子直接获取文章列表,还须要先获取一下fakeid。
  当我们输入公众号名子后,点击搜索。可以看见触发了搜索插口,返回了fakeid。
  
  这个插口所需参数也不多。
  
  接下来,我们可以用代码来模拟以上的操作了。
  但是还须要使用现有Cookie防止登入。
  
  目前Cookie的有效期,我还没有测试。可能须要及时更新Cookie。
  测试代码:
  
import requests
import json
Cookie = '请换上自己的Cookie,获取方法:直接复制下来'
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
headers = {
"Cookie": Cookie,
"User-Agent": 'Mozilla/5.0 (Linux; Android 10; YAL-AL00 Build/HUAWEIYAL-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.64 HuaweiBrowser/10.0.1.335 Mobile Safari/537.36'
}
keyword = 'pythonlx' # 公众号名字:可自定义
token = '你的token' # 获取方法:如上述 直接复制下来
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&query={}&token={}&lang=zh_CN&f=json&ajax=1'.format(keyword,token)
doc = requests.get(search_url,headers=headers).text
jstext = json.loads(doc)
fakeid = jstext['list'][0]['fakeid']
data = {
"token": token,
"lang": "zh_CN",
"f": "json",
"ajax": "1",
"action": "list_ex",
"begin": 0,
"count": "5",
"query": "",
"fakeid": fakeid,
"type": "9",
}
json_test = requests.get(url, headers=headers, params=data).text
json_test = json.loads(json_test)
print(json_test)
  这样能够获取最新的10篇文章了,如果想要获取更多的历史文章,可以更改data中的"begin"参数,0是第一页,5是第二页,10是第三页(以此类推)
  但是若果想要大规模抓取的话:
  请给自己安排一个稳定的代理,降低爬虫的速率,准备多个帐号,来降低被封禁的可能性。

bmob前端云联接自己服务器

采集交流优采云 发表了文章 • 0 个评论 • 176 次浏览 • 2020-08-24 16:36 • 来自相关话题

  bmob后端云联接自己服务器
  // 引用Bomb
import Bmob from "hydrogen-js-sdk";
// 挂载到全局使用
Vue.prototype.Bmob = Bmob
// 初始化SDK 放入你数据库对应的 appid 和 key
Bmob.initialize("你的Application ID", "你的REST API Key");
// 调试模式
Bmob.debug(true)
  // 在方法中写入调用
let data = {
&#39;username&#39;:&#39;yjh&#39;,
&#39;password&#39;:&#39;123456&#39;
}
GetLogin(data){
  Bmob.User.login(data).then(res => {
console.log(res)
}).catch(err => {
console.log(err)
});
}
  
  这是成功返回参数由于我们 _User 表中存在此用户
  
  咯看这个恳求我们早已成功返回了
  ACL是该用户的权限,其他的都是该用户的信息了,比如创建时间,用户爱称,微信头像啥的
  肯定有杠精了,“那么错误返回是哪些样子呢?”
  不着急答案马上来,小二上图
  注意看我的password正确的是 123456而我可以写成 123451
  
  然后返回的结果我们来瞧瞧
  "账号或则密码错误"
  
  接下来就给你们发一下比目的js操作文档和比目的一些详细说明吧!
  在你的陌陌小程序后台配置你的服务器域名
  在应用设置-&gt;配置上面把这几个域名填写到上图陌陌后台,设置https域名
  
  使用实时数据平台的js
  一、对实时数据对象进行初始化
  let BmobSocketIo =new Bmob.Socket()
  二、监听表
   //初始连接socket.io服务器后,需要监听的事件都写在这个函数内
BmobSocketIo.onInitListen = function () {
//订阅Chat表的数据更新事件
BmobSocketIo.updateTable("Chat"); //聊天记录表
    };
//监听服务器返回的更新表的数据
BmobSocketIo.onUpdateTable = function (tablename, data) {
if (tablename == "Chat") {
console.log(data);
}
};
  PS:更多请参考Bmob Demo上面的群聊功能。
  
  Demo地址:
  直接放自己的appid保存就可以了
  
  好啦,今天就给你们介绍到这儿吧!好好吸收吸收
  有哪些小问题,疑问,文章措辞错误都可以在公众号-&gt;&gt;关于我 加我陌陌联系我噢! 查看全部

  bmob后端云联接自己服务器
  // 引用Bomb
import Bmob from "hydrogen-js-sdk";
// 挂载到全局使用
Vue.prototype.Bmob = Bmob
// 初始化SDK 放入你数据库对应的 appid 和 key
Bmob.initialize("你的Application ID", "你的REST API Key");
// 调试模式
Bmob.debug(true)
  // 在方法中写入调用
let data = {
&#39;username&#39;:&#39;yjh&#39;,
&#39;password&#39;:&#39;123456&#39;
}
GetLogin(data){
  Bmob.User.login(data).then(res => {
console.log(res)
}).catch(err => {
console.log(err)
});
}
  
  这是成功返回参数由于我们 _User 表中存在此用户
  
  咯看这个恳求我们早已成功返回了
  ACL是该用户的权限,其他的都是该用户的信息了,比如创建时间,用户爱称,微信头像啥的
  肯定有杠精了,“那么错误返回是哪些样子呢?”
  不着急答案马上来,小二上图
  注意看我的password正确的是 123456而我可以写成 123451
  
  然后返回的结果我们来瞧瞧
  "账号或则密码错误"
  
  接下来就给你们发一下比目的js操作文档和比目的一些详细说明吧!
  在你的陌陌小程序后台配置你的服务器域名
  在应用设置-&gt;配置上面把这几个域名填写到上图陌陌后台,设置https域名
  
  使用实时数据平台的js
  一、对实时数据对象进行初始化
  let BmobSocketIo =new Bmob.Socket()
  二、监听表
   //初始连接socket.io服务器后,需要监听的事件都写在这个函数内
BmobSocketIo.onInitListen = function () {
//订阅Chat表的数据更新事件
BmobSocketIo.updateTable("Chat"); //聊天记录表
    };
//监听服务器返回的更新表的数据
BmobSocketIo.onUpdateTable = function (tablename, data) {
if (tablename == "Chat") {
console.log(data);
}
};
  PS:更多请参考Bmob Demo上面的群聊功能。
  
  Demo地址:
  直接放自己的appid保存就可以了
  
  好啦,今天就给你们介绍到这儿吧!好好吸收吸收
  有哪些小问题,疑问,文章措辞错误都可以在公众号-&gt;&gt;关于我 加我陌陌联系我噢!

php怎么采集微信公众号文章的方式

采集交流优采云 发表了文章 • 0 个评论 • 415 次浏览 • 2020-08-24 03:10 • 来自相关话题

  php怎么采集微信公众号文章的方式
  最近有个需求是要采集微信公众号文章,于是研究了下。发现在刷新搜狗微信公众号文章列表的时侯,有个太难受的地方就是搜狗会直接的把你的ip给封了,要输入验证码。这一个步骤暂时不知道如何破解,我们这儿只是看php怎么采集微信公众号文章内容的方式,至于列表地址的获取,后面在进行研究。在写之前我搜索到用php写的爬虫程序有phpQuery,phpspider,QueryList(phpQuery的改进版)这三个。可能不止,这里只是我找到的。先记录,后面在研究。下面是我写的一个基本的微信公众号php采集类,有
  最近有个需求是要采集微信公众号文章,于是研究了下。发现在刷新搜狗微信公众号文章列表的时侯,有个太难受的地方就是搜狗会直接的把你的ip给封了,要输入验证码。这一个步骤暂时不知道如何破解,我们这儿只是看php怎么采集微信公众号文章内容的方式,至于列表地址的获取,后面在进行研究。
  在写之前我搜索到用php写的爬虫程序有phpQuery,phpspider,QueryList(phpQuery的改进版)这三个。可能不止,这里只是我找到的。先记录,后面在研究。
  下面是我写的一个基本的微信公众号php采集类,有待进一步建立。
  /**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/2/6
 * Time: 10:54
 * author: gm
 * 微信公众号文章采集类
 */
class DownWxArticle {
private   $mpwxurl = &#39;http://mp.weixin.qq.com&#39;;
private   $wxgzherr= &#39;公众号二维码下载失败=>&#39;;
private   $wximgerr= &#39;图片下载失败=>&#39;;
private   $direrr  = &#39;文件夹创建失败!&#39;;
private   $fileerr = &#39;资源不存在!&#39;;
private   $dirurl  = &#39;&#39;;
    /* 抓取微信公众号文章
 * $qcode    boolean 公众号二维码 false=>不下载 true=>下载
 * return
 * $content  string  内容
 * $tile     string  标题
 * $time     int     时间戳
 * $wxggh    string  微信公众号
 * $wxh      string  微信号
 * $qcode    string  公众号二维码
 * $tag      string  标签 原创
 */
    function get_file_article($url,$dir=&#39;&#39;,$qcode=false)
    {
$this->dirurl = $dir?:&#39;/Uploads/&#39;.date(&#39;Ymd&#39;,time());
        if(!$this->put_dir($this->dirurl)){
exit(json_encode(array(&#39;msg&#39;=>$this->direrr,&#39;code&#39;=>500)));
}
        $file = file_get_contents($url);
        if(!$file){
$this->put_error_log($this->dirurl,$this->fileerr);
            exit(json_encode(array(&#39;msg&#39;=>$this->fileerr,&#39;code&#39;=>500)));
        }
        // 内容主体
        preg_match(&#39;/[\s\S]*?/&#39;,$file,$content);
        // 标题
        preg_match(&#39;/(.*?)/&#39;,$file,$title);
        $title = $title?$title[1]:&#39;&#39;;
        // 时间
        preg_match(&#39;/(.*?)/&#39;,$file,$time);
        $time = $time?strtotime($time[1]):&#39;&#39;;
        // 公众号
        preg_match(&#39;/(.*?)/&#39;,$file,$wxgzh);
        $wxgzh = $wxgzh?$wxgzh[1]:&#39;&#39;;
        // 微信号
        preg_match(&#39;/([\s\S]*?)/&#39;,$file,$wxh);
        $wxh   = $wxh?$wxh[1]:&#39;&#39;;
        // 公众号二维码
        if($qcode){
            preg_match(&#39;/window.sg_qr_code="(.*?)";/&#39;,$file,$qcode);
            $qcodeurl = str_replace(&#39;\x26amp;&#39;,&#39;&&#39;,$this->mpwxurl.$qcode[1]);
            $qcode = $this->put_file_img($this->dirurl,$qcodeurl);
            if(!$qcode){
                $this->put_error_log($this->dirurl,$this->wxgzherr.$qcodeurl);
            }
        }
        // 获取标签
        preg_match(&#39;/(.*?)/&#39;,$file,$tag);
        $tag = $tag?$tag[1]:&#39;&#39;;
        // 图片
        preg_match_all(&#39;//&#39;,$content[0],$images);
        // 储存原地址和下载后地址
        $old = array();
        $new = array();
        // 去除重复图片地址
        $images = array_unique($images[1]);
        if($images){
            foreach($images as $v){
                $filename = $this->put_file_img($this->dirurl,$v);
                if($filename){
                    // 图片保存成功 替换地址
                    $old[] = $v;
                    $new[] = $filename;
                }else{
                    // 失败记录日志
                    $this->put_error_log($this->dirurl,$this->wximgerr.$v);
                }
            }
            $old[] = &#39;data-src&#39;;
            $new[] = &#39;src&#39;;
            $content = str_replace($old,$new,$content[0]);
        }
       // 替换音频
       $content = str_replace("preview.html","player.html",$content); 
       // 获取阅读点赞评论等信息
       $comment = $this->get_comment_article($url);
$data = array(&#39;content&#39;=>$content,&#39;title&#39;=>$title,&#39;time&#39;=>$time,&#39;wxgzh&#39;=>$wxgzh,&#39;wxh&#39;=>$wxh,&#39;qcode&#39;=>$qcode?:&#39;&#39;,&#39;tag&#39;=>$tag?:&#39;&#39;,&#39;comment&#39;=>$comment);
        return json_encode(array(&#39;data&#39;=>$data,&#39;code&#39;=>200,&#39;msg&#39;=>&#39;ok&#39;));
    }
    /* 抓取保存图片函数
     * return
     * $filename  string  图片地址
     */
    function put_file_img($dir=&#39;&#39;,$image=&#39;&#39;)
    {
        // 判断图片的保存类型 截取后四位地址
        $exts = array(&#39;jpeg&#39;,&#39;png&#39;,&#39;jpg&#39;);
        $filename = $dir.&#39;/&#39;.uniqid().time().rand(10000,99999);
        $ext = substr($image,-5);
        $ext = explode(&#39;=&#39;,$ext);
        if(in_array($ext[1],$exts) !== false){
            $filename .= &#39;.&#39;.$ext[1];
        }else{
            $filename .= &#39;.gif&#39;;
        }
        $souce = file_get_contents($image);
        if(file_put_contents($filename,$souce)){
            return $filename;
        }else{
            return false;
        }
    }
    /* 获取微信公众号文章的【点赞】【阅读】【评论】
     * 方法:将地址中的部分参数替换即可。
     *     1、s?     替换为 mp/getcomment?
     *     2、最后=  替换为 %3D
     * return
     * read_num  阅读数
     * like_num  点赞数
     * comment   评论详情
     */
    function get_comment_article($url=&#39;&#39;)
    {
        $url = substr($url,0,-1);
        $url = str_replace(&#39;/s&#39;,&#39;/mp/getcomment&#39;,$url).&#39;%3D&#39;;
        return file_get_contents($url);
    }
    /* 错误日志记录
     * $dir  string  文件路径
     * $data string  写入内容
     */
    function put_error_log($dir,$data)
    {
        file_put_contents($dir.&#39;/error.log&#39;,date(&#39;Y-m-d H:i:s&#39;,time()).$data.PHP_EOL,FILE_APPEND);
    }
    /* 创建文件夹
     * $dir string 文件夹路径
     */
    function put_dir($dir=&#39;&#39;){
$bool = true;
        if(!is_dir($dir)){
            if(!mkdir($dir,777,TRUE)){
$bool = false;
                $this->put_error_log($dir,$this->direrr.$dir);
            }
        }
return $bool;
    }
}
  使用方式: 查看全部

  php怎么采集微信公众号文章的方式
  最近有个需求是要采集微信公众号文章,于是研究了下。发现在刷新搜狗微信公众号文章列表的时侯,有个太难受的地方就是搜狗会直接的把你的ip给封了,要输入验证码。这一个步骤暂时不知道如何破解,我们这儿只是看php怎么采集微信公众号文章内容的方式,至于列表地址的获取,后面在进行研究。在写之前我搜索到用php写的爬虫程序有phpQuery,phpspider,QueryList(phpQuery的改进版)这三个。可能不止,这里只是我找到的。先记录,后面在研究。下面是我写的一个基本的微信公众号php采集类,有
  最近有个需求是要采集微信公众号文章,于是研究了下。发现在刷新搜狗微信公众号文章列表的时侯,有个太难受的地方就是搜狗会直接的把你的ip给封了,要输入验证码。这一个步骤暂时不知道如何破解,我们这儿只是看php怎么采集微信公众号文章内容的方式,至于列表地址的获取,后面在进行研究。
  在写之前我搜索到用php写的爬虫程序有phpQuery,phpspider,QueryList(phpQuery的改进版)这三个。可能不止,这里只是我找到的。先记录,后面在研究。
  下面是我写的一个基本的微信公众号php采集类,有待进一步建立。
  /**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/2/6
 * Time: 10:54
 * author: gm
 * 微信公众号文章采集类
 */
class DownWxArticle {
private   $mpwxurl = &#39;http://mp.weixin.qq.com&#39;;
private   $wxgzherr= &#39;公众号二维码下载失败=>&#39;;
private   $wximgerr= &#39;图片下载失败=>&#39;;
private   $direrr  = &#39;文件夹创建失败!&#39;;
private   $fileerr = &#39;资源不存在!&#39;;
private   $dirurl  = &#39;&#39;;
    /* 抓取微信公众号文章
 * $qcode    boolean 公众号二维码 false=>不下载 true=>下载
 * return
 * $content  string  内容
 * $tile     string  标题
 * $time     int     时间戳
 * $wxggh    string  微信公众号
 * $wxh      string  微信号
 * $qcode    string  公众号二维码
 * $tag      string  标签 原创
 */
    function get_file_article($url,$dir=&#39;&#39;,$qcode=false)
    {
$this->dirurl = $dir?:&#39;/Uploads/&#39;.date(&#39;Ymd&#39;,time());
        if(!$this->put_dir($this->dirurl)){
exit(json_encode(array(&#39;msg&#39;=>$this->direrr,&#39;code&#39;=>500)));
}
        $file = file_get_contents($url);
        if(!$file){
$this->put_error_log($this->dirurl,$this->fileerr);
            exit(json_encode(array(&#39;msg&#39;=>$this->fileerr,&#39;code&#39;=>500)));
        }
        // 内容主体
        preg_match(&#39;/[\s\S]*?/&#39;,$file,$content);
        // 标题
        preg_match(&#39;/(.*?)/&#39;,$file,$title);
        $title = $title?$title[1]:&#39;&#39;;
        // 时间
        preg_match(&#39;/(.*?)/&#39;,$file,$time);
        $time = $time?strtotime($time[1]):&#39;&#39;;
        // 公众号
        preg_match(&#39;/(.*?)/&#39;,$file,$wxgzh);
        $wxgzh = $wxgzh?$wxgzh[1]:&#39;&#39;;
        // 微信号
        preg_match(&#39;/([\s\S]*?)/&#39;,$file,$wxh);
        $wxh   = $wxh?$wxh[1]:&#39;&#39;;
        // 公众号二维码
        if($qcode){
            preg_match(&#39;/window.sg_qr_code="(.*?)";/&#39;,$file,$qcode);
            $qcodeurl = str_replace(&#39;\x26amp;&#39;,&#39;&&#39;,$this->mpwxurl.$qcode[1]);
            $qcode = $this->put_file_img($this->dirurl,$qcodeurl);
            if(!$qcode){
                $this->put_error_log($this->dirurl,$this->wxgzherr.$qcodeurl);
            }
        }
        // 获取标签
        preg_match(&#39;/(.*?)/&#39;,$file,$tag);
        $tag = $tag?$tag[1]:&#39;&#39;;
        // 图片
        preg_match_all(&#39;//&#39;,$content[0],$images);
        // 储存原地址和下载后地址
        $old = array();
        $new = array();
        // 去除重复图片地址
        $images = array_unique($images[1]);
        if($images){
            foreach($images as $v){
                $filename = $this->put_file_img($this->dirurl,$v);
                if($filename){
                    // 图片保存成功 替换地址
                    $old[] = $v;
                    $new[] = $filename;
                }else{
                    // 失败记录日志
                    $this->put_error_log($this->dirurl,$this->wximgerr.$v);
                }
            }
            $old[] = &#39;data-src&#39;;
            $new[] = &#39;src&#39;;
            $content = str_replace($old,$new,$content[0]);
        }
       // 替换音频
       $content = str_replace("preview.html","player.html",$content); 
       // 获取阅读点赞评论等信息
       $comment = $this->get_comment_article($url);
$data = array(&#39;content&#39;=>$content,&#39;title&#39;=>$title,&#39;time&#39;=>$time,&#39;wxgzh&#39;=>$wxgzh,&#39;wxh&#39;=>$wxh,&#39;qcode&#39;=>$qcode?:&#39;&#39;,&#39;tag&#39;=>$tag?:&#39;&#39;,&#39;comment&#39;=>$comment);
        return json_encode(array(&#39;data&#39;=>$data,&#39;code&#39;=>200,&#39;msg&#39;=>&#39;ok&#39;));
    }
    /* 抓取保存图片函数
     * return
     * $filename  string  图片地址
     */
    function put_file_img($dir=&#39;&#39;,$image=&#39;&#39;)
    {
        // 判断图片的保存类型 截取后四位地址
        $exts = array(&#39;jpeg&#39;,&#39;png&#39;,&#39;jpg&#39;);
        $filename = $dir.&#39;/&#39;.uniqid().time().rand(10000,99999);
        $ext = substr($image,-5);
        $ext = explode(&#39;=&#39;,$ext);
        if(in_array($ext[1],$exts) !== false){
            $filename .= &#39;.&#39;.$ext[1];
        }else{
            $filename .= &#39;.gif&#39;;
        }
        $souce = file_get_contents($image);
        if(file_put_contents($filename,$souce)){
            return $filename;
        }else{
            return false;
        }
    }
    /* 获取微信公众号文章的【点赞】【阅读】【评论】
     * 方法:将地址中的部分参数替换即可。
     *     1、s?     替换为 mp/getcomment?
     *     2、最后=  替换为 %3D
     * return
     * read_num  阅读数
     * like_num  点赞数
     * comment   评论详情
     */
    function get_comment_article($url=&#39;&#39;)
    {
        $url = substr($url,0,-1);
        $url = str_replace(&#39;/s&#39;,&#39;/mp/getcomment&#39;,$url).&#39;%3D&#39;;
        return file_get_contents($url);
    }
    /* 错误日志记录
     * $dir  string  文件路径
     * $data string  写入内容
     */
    function put_error_log($dir,$data)
    {
        file_put_contents($dir.&#39;/error.log&#39;,date(&#39;Y-m-d H:i:s&#39;,time()).$data.PHP_EOL,FILE_APPEND);
    }
    /* 创建文件夹
     * $dir string 文件夹路径
     */
    function put_dir($dir=&#39;&#39;){
$bool = true;
        if(!is_dir($dir)){
            if(!mkdir($dir,777,TRUE)){
$bool = false;
                $this->put_error_log($dir,$this->direrr.$dir);
            }
        }
return $bool;
    }
}
  使用方式:

分享文章:通过微信公众平台获取公众号文章的方法示例

采集交流优采云 发表了文章 • 0 个评论 • 348 次浏览 • 2020-09-20 12:00 • 来自相关话题

  如何通过微信公众平台获取官方帐户文章的示例
  我以前自己维护过一个官方帐户,但是由于我的个人关系很长时间没有更新,所以我今天起身去记住它,但是偶然发现了一种获取微信官方帐户的方法文章。
  以前有很多方法可以获取它,并且可以通过搜狗,青博,网络,客户端等来获取。这可能并不出色,但是操作简单易懂。
  因此,首先您需要拥有一个微信公众平台帐户
  微信公众平台:
  
  登录后,转到主页,然后单击“新建论坛帖子”。
  
  选择自己创建的图形:
  
  似乎是官方帐户操作教学
  进入编辑页面后,单击超链接
  
  弹出一个选择框,我们在框中输入相应的正式帐户名称,并出现相应的文章列表
  
  您感到惊讶吗?您可以打开控制台以检查请求的界面
  
  打开响应,我们需要文章链接
  
  确认数据后,我们需要分析此界面。
  感觉很简单。 GET请求带有一些参数。
  
  Fakeid是官方帐户的唯一ID,因此,如果您想直接通过名称获取文章列表,则还需要先获取伪造品。
  输入官方帐户名后,单击“搜索”。您会看到搜索界面已触发,并返回了假冒的商品。
  
  此界面不需要很多参数。
  
  接下来,我们可以使用代码来模拟上述操作。
  但是您还需要使用现有的cookie以避免登录。
  
  我尚未测试当前cookie的有效期。 Cookies可能需要及时更新。
  测试代码:
  
import requests
import json
Cookie = '请换上自己的Cookie,获取方法:直接复制下来'
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
headers = {
"Cookie": Cookie,
"User-Agent": 'Mozilla/5.0 (Linux; Android 10; YAL-AL00 Build/HUAWEIYAL-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.64 HuaweiBrowser/10.0.1.335 Mobile Safari/537.36'
}
keyword = 'pythonlx' # 公众号名字:可自定义
token = '你的token' # 获取方法:如上述 直接复制下来
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&query={}&token={}&lang=zh_CN&f=json&ajax=1'.format(keyword,token)
doc = requests.get(search_url,headers=headers).text
jstext = json.loads(doc)
fakeid = jstext['list'][0]['fakeid']
data = {
"token": token,
"lang": "zh_CN",
"f": "json",
"ajax": "1",
"action": "list_ex",
"begin": 0,
"count": "5",
"query": "",
"fakeid": fakeid,
"type": "9",
}
json_test = requests.get(url, headers=headers, params=data).text
json_test = json.loads(json_test)
print(json_test)
  这样,您可以获得最新的10篇文章文章。如果要获取更多历史记录文章,则可以修改数据中的“开始”参数,0是第一页,5是第二页,10是第三页(依此类推)
  但是,如果您想进行大规模爬网:
  请为自己和履带的速度安排一个稳定的代理人,并为可能被阻止的情况准备多个帐户。
  以上是本文的全部内容,希望对大家的学习有所帮助,希望大家都支持Ian。 查看全部

  如何通过微信公众平台获取官方帐户文章的示例
  我以前自己维护过一个官方帐户,但是由于我的个人关系很长时间没有更新,所以我今天起身去记住它,但是偶然发现了一种获取微信官方帐户的方法文章。
  以前有很多方法可以获取它,并且可以通过搜狗,青博,网络,客户端等来获取。这可能并不出色,但是操作简单易懂。
  因此,首先您需要拥有一个微信公众平台帐户
  微信公众平台:
  
  登录后,转到主页,然后单击“新建论坛帖子”。
  
  选择自己创建的图形:
  
  似乎是官方帐户操作教学
  进入编辑页面后,单击超链接
  
  弹出一个选择框,我们在框中输入相应的正式帐户名称,并出现相应的文章列表
  
  您感到惊讶吗?您可以打开控制台以检查请求的界面
  
  打开响应,我们需要文章链接
  
  确认数据后,我们需要分析此界面。
  感觉很简单。 GET请求带有一些参数。
  
  Fakeid是官方帐户的唯一ID,因此,如果您想直接通过名称获取文章列表,则还需要先获取伪造品。
  输入官方帐户名后,单击“搜索”。您会看到搜索界面已触发,并返回了假冒的商品。
  
  此界面不需要很多参数。
  
  接下来,我们可以使用代码来模拟上述操作。
  但是您还需要使用现有的cookie以避免登录。
  
  我尚未测试当前cookie的有效期。 Cookies可能需要及时更新。
  测试代码:
  
import requests
import json
Cookie = '请换上自己的Cookie,获取方法:直接复制下来'
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
headers = {
"Cookie": Cookie,
"User-Agent": 'Mozilla/5.0 (Linux; Android 10; YAL-AL00 Build/HUAWEIYAL-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.64 HuaweiBrowser/10.0.1.335 Mobile Safari/537.36'
}
keyword = 'pythonlx' # 公众号名字:可自定义
token = '你的token' # 获取方法:如上述 直接复制下来
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&query={}&token={}&lang=zh_CN&f=json&ajax=1'.format(keyword,token)
doc = requests.get(search_url,headers=headers).text
jstext = json.loads(doc)
fakeid = jstext['list'][0]['fakeid']
data = {
"token": token,
"lang": "zh_CN",
"f": "json",
"ajax": "1",
"action": "list_ex",
"begin": 0,
"count": "5",
"query": "",
"fakeid": fakeid,
"type": "9",
}
json_test = requests.get(url, headers=headers, params=data).text
json_test = json.loads(json_test)
print(json_test)
  这样,您可以获得最新的10篇文章文章。如果要获取更多历史记录文章,则可以修改数据中的“开始”参数,0是第一页,5是第二页,10是第三页(依此类推)
  但是,如果您想进行大规模爬网:
  请为自己和履带的速度安排一个稳定的代理人,并为可能被阻止的情况准备多个帐户。
  以上是本文的全部内容,希望对大家的学习有所帮助,希望大家都支持Ian。

分享方法:爬虫如何爬取微信公众号文章

采集交流优采云 发表了文章 • 0 个评论 • 176 次浏览 • 2020-09-06 21:12 • 来自相关话题

  爬虫如何抓取微信公众号文章
  第二部分文章:python爬虫如何抓取微信官方帐户文章(二)
  下一篇文章是如何连接python爬虫以实现每天抓取微信公众号的推送文章
  由于我最近在法庭上执业,因此我需要一些官方帐户数据,然后将其放入网页中以进行显示以便于查看。我之前写过一些爬虫,但是它们都对网站数据进行爬虫。这次我认为这很容易,但是遇到了很多麻烦,在这里与您分享。
  1、使用采集器搜寻数据的最基本也是最重要的事情是找到目标网站的url地址,然后遍历该地址以一个或多个线程对其进行搜寻。通常,后续的爬网地址主要是通过两种方式获得的,一种是基于页面分页来计算URL地址的规律,通常后跟参数page = num,另一种是过滤出当前地址的标签。页面,然后将该URL作为后续的抓取地址。不幸的是,这两种方法都不能在微信公众号中使用,因为官方帐号的文章地址之间没有关联,并且不可能通过一个文章地址找到所有文章地址
  2、那么我们如何获得官方帐户的历史文章地址?一种方法是通过搜狗微信网站搜索目标官方帐户,您可以看到最新的文章文章,但这仅仅是最新的一篇无法获取历史记录文章。如果要每天进行爬网,则可以使用此方法每天进行爬网。图片是这样的:
  
  3、当然,我们需要很多结果,因此我们仍然必须找到一种方法来获取所有历史文本,少说废话,然后直达主题:
<p>4、找到历史记录文章后,我们如何编写程序以获取所有URL地址? ,首先让我们分析一下浏览器在单击官方帐户名,调出检查页面,单击网络,首先清除所有数据,然后单击目标官方帐户时的行为,您可以看到以下界面: 查看全部

  爬虫如何抓取微信公众号文章
  第二部分文章:python爬虫如何抓取微信官方帐户文章(二)
  下一篇文章是如何连接python爬虫以实现每天抓取微信公众号的推送文章
  由于我最近在法庭上执业,因此我需要一些官方帐户数据,然后将其放入网页中以进行显示以便于查看。我之前写过一些爬虫,但是它们都对网站数据进行爬虫。这次我认为这很容易,但是遇到了很多麻烦,在这里与您分享。
  1、使用采集器搜寻数据的最基本也是最重要的事情是找到目标网站的url地址,然后遍历该地址以一个或多个线程对其进行搜寻。通常,后续的爬网地址主要是通过两种方式获得的,一种是基于页面分页来计算URL地址的规律,通常后跟参数page = num,另一种是过滤出当前地址的标签。页面,然后将该URL作为后续的抓取地址。不幸的是,这两种方法都不能在微信公众号中使用,因为官方帐号的文章地址之间没有关联,并且不可能通过一个文章地址找到所有文章地址
  2、那么我们如何获得官方帐户的历史文章地址?一种方法是通过搜狗微信网站搜索目标官方帐户,您可以看到最新的文章文章,但这仅仅是最新的一篇无法获取历史记录文章。如果要每天进行爬网,则可以使用此方法每天进行爬网。图片是这样的:
  
  3、当然,我们需要很多结果,因此我们仍然必须找到一种方法来获取所有历史文本,少说废话,然后直达主题:
<p>4、找到历史记录文章后,我们如何编写程序以获取所有URL地址? ,首先让我们分析一下浏览器在单击官方帐户名,调出检查页面,单击网络,首先清除所有数据,然后单击目标官方帐户时的行为,您可以看到以下界面:

解密:python批量爬取公众号文章

采集交流优采云 发表了文章 • 0 个评论 • 318 次浏览 • 2020-09-06 17:45 • 来自相关话题

  Python批量抓取公共帐户文章
  转载:
  Python检索官方帐户文章
  
  PS:如果您需要Python学习资料,可以单击下面的链接自行获得/ A6Zvjdun
  有多种爬网方式。今天,我将与您分享一个更简单的方法,即通过微信公众号背景的“超链接”功能进行爬网。也许有些朋友没有联系到微信公众号的后台,这是一张供大家理解的图片
  
  这里的一些朋友可能会说,我无法登录到正式帐户,该怎么办? ? ?
  没关系,尽管每个爬虫的目的都是为了获得我们想要的结果,但这并不是我们学习的重点。我们学习的重点在于抓取过程,如何获取目标数据,因此我们无法登录到公众文章阅读此内容文章之后,后台的朋友可能无法获得最终的抓取结果,但阅读此文章后,您也会有所收获。
  一、初步准备
  选择要爬网的目标官方帐户
  单击超链接-进入编辑超链接界面-进入我们需要抓取的搜索目标官方帐户
  今天我们将以“数据分析”官方帐户的抓取为例,供大家介绍
  
  单击官方帐户以查看每个文章对应的标题信息
  
  这次抓取工具的目标是获得文章标题和相应的链接。
  二、开始抓取
  爬行的三个步骤:
  1、请求页面
  首先导入我们需要使用此采集器的第三方库
  import re#用来解析网页
import requests#用来请求网页
import csv#用来保存数据
import time#用来设置每次爬取间隔的时间
  找到我们抓取的目标数据的位置,单击通过搜索获得的包,然后获取目标URL和请求标头信息
  
  请求网页
  headers={
&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36&#39;,
&#39;cookie&#39;: &#39;pgv_pvi=2389011456; RK=x4Sdy3WsT4; ptcz=4a2fe0ffda6742a230c94f168291afcce2bd001e5d6615132b55da90559cd463; pgv_pvid=6989331736; _ga=GA1.2.735850052.1585832762; ptui_loginuin=1207020736; ua_id=iJuK7hnHjcUE0e2dAAAAAHzCRcatCWOiHc-hdkhSDL4=; __guid=166713058.1972731636944397800.1590316882436.5461; openid2ticket_oY8wqwesgvgkdQ69wUeM5UxhOV5c=ION52/k2w4M3o44iht5BRt5yCyxP/3IaRXJ84RIpRZA=; mm_lang=zh_CN; pac_uid=0_5ecd1592971c3; uin=o1240069166; skey=@YLtvDuKyj; pgv_info=ssid=s4875389884; pgv_si=s8410697728; uuid=62839906b2a77b5f098cd91979af8b33; rand_info=CAESIC53TQFCwjIe4ZsrTRKvSs+ocfs4UTsj9swrrNwosjCd; slave_bizuin=3240807523; data_bizuin=3240807523; bizuin=3240807523; data_ticket=AiTk/OFWXCKxhaenCvEuP06mwWTI6YqCyt+74hoaXaNtKBbcnq//ZTXHzqByMhK6; slave_sid=YndxeFhCSkU5OUJtdFYycW9zN29FcG51NU5GNElBM3I2RF9wVjJBRGx2bWxrTXdiMDZFYzllUWNaMlN4N0RsOTlVMDRxZFZEMjJXdlRZcXBVOGptQ2ZDSVZiOEJlQW5BZDVCWlkzSnJ6WWNPWVRiN1J0cldCd0pvbTc3RGRiMm9pZ3ZISTl6WWhDUmNCZ2s3; slave_user=gh_5d822fe7fd08; xid=9794daa60db66fcf7a65c4054e3d68ce; mmad_session=43d4e5247a6b025b67ba3abd48d27a309ec4713911b6ef6f23cddb4b9953e771354ad1572fbc3fa895051725e95abb887cf2d03e9864084974db75c8588189699ea5b20b8fe35073831446ef98d24de600f107fe69d79646a3dd2907ab712e1f11de1c56c245721266e7088080fefde3; ts_last=mp.weixin.qq.com/cgi-bin/frame; ts_uid=1963034896; monitor_count=15&#39;
}#请求头信息,这里cookie信息必须添加,否则得不到网页信息
url=&#39;https://mp.weixin.qq.com/cgi-b ... 39%3B
response=requests.get(url,headers=headers)#得到响应内容
response.encoding=&#39;utf-8&#39;#设置响应内容为utf-8格式
html=response.text#得到网页的文本形式
print(html)
  此处的请求标头信息必须添加cookie信息,否则无法获取网页信息
  网页的请求结果如下图所示。红色框标记了我们需要的文章标题和文章链接。
  
  2、分析网页
  从网页响应结果中我们可以看到,每个文章的标题和链接都位于“ title”标签和“ cover”标签的后面,因此我们可以使用正则表达式直接对其进行解析
  title=re.findall(&#39;"title":"(.*?)"&#39;,html)#得到文章标题
cover=re.findall(&#39;"cover":"(.*?)"&#39;,html)#得到文章链接
all=zip(title,cover)#利用zip方法,将两个列表中的数据一一对应
print(list(all))#list是对zip方法得到的数据进行解压
  解析后的结果如下
  
  3、保存数据
  for data in all:#for循环遍历列表
time.sleep(3)#每爬取一篇文章间隔3秒,以防触发反爬
with open(&#39;C:\\Users\\Administrator\\Desktop\\爬取公众号文章.csv&#39;,&#39;a&#39;,encoding=&#39;utf-8-sig&#39;) as file:
#将数据保存到桌面
write=csv.writer(file)
write.writerow(data)
  到目前为止,该抓取工具已经完成,让我们看一下最终结果
  
  完整代码 查看全部

  Python批量抓取公共帐户文章
  转载:
  Python检索官方帐户文章
  
  PS:如果您需要Python学习资料,可以单击下面的链接自行获得/ A6Zvjdun
  有多种爬网方式。今天,我将与您分享一个更简单的方法,即通过微信公众号背景的“超链接”功能进行爬网。也许有些朋友没有联系到微信公众号的后台,这是一张供大家理解的图片
  
  这里的一些朋友可能会说,我无法登录到正式帐户,该怎么办? ? ?
  没关系,尽管每个爬虫的目的都是为了获得我们想要的结果,但这并不是我们学习的重点。我们学习的重点在于抓取过程,如何获取目标数据,因此我们无法登录到公众文章阅读此内容文章之后,后台的朋友可能无法获得最终的抓取结果,但阅读此文章后,您也会有所收获。
  一、初步准备
  选择要爬网的目标官方帐户
  单击超链接-进入编辑超链接界面-进入我们需要抓取的搜索目标官方帐户
  今天我们将以“数据分析”官方帐户的抓取为例,供大家介绍
  
  单击官方帐户以查看每个文章对应的标题信息
  
  这次抓取工具的目标是获得文章标题和相应的链接。
  二、开始抓取
  爬行的三个步骤:
  1、请求页面
  首先导入我们需要使用此采集器的第三方库
  import re#用来解析网页
import requests#用来请求网页
import csv#用来保存数据
import time#用来设置每次爬取间隔的时间
  找到我们抓取的目标数据的位置,单击通过搜索获得的包,然后获取目标URL和请求标头信息
  
  请求网页
  headers={
&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36&#39;,
&#39;cookie&#39;: &#39;pgv_pvi=2389011456; RK=x4Sdy3WsT4; ptcz=4a2fe0ffda6742a230c94f168291afcce2bd001e5d6615132b55da90559cd463; pgv_pvid=6989331736; _ga=GA1.2.735850052.1585832762; ptui_loginuin=1207020736; ua_id=iJuK7hnHjcUE0e2dAAAAAHzCRcatCWOiHc-hdkhSDL4=; __guid=166713058.1972731636944397800.1590316882436.5461; openid2ticket_oY8wqwesgvgkdQ69wUeM5UxhOV5c=ION52/k2w4M3o44iht5BRt5yCyxP/3IaRXJ84RIpRZA=; mm_lang=zh_CN; pac_uid=0_5ecd1592971c3; uin=o1240069166; skey=@YLtvDuKyj; pgv_info=ssid=s4875389884; pgv_si=s8410697728; uuid=62839906b2a77b5f098cd91979af8b33; rand_info=CAESIC53TQFCwjIe4ZsrTRKvSs+ocfs4UTsj9swrrNwosjCd; slave_bizuin=3240807523; data_bizuin=3240807523; bizuin=3240807523; data_ticket=AiTk/OFWXCKxhaenCvEuP06mwWTI6YqCyt+74hoaXaNtKBbcnq//ZTXHzqByMhK6; slave_sid=YndxeFhCSkU5OUJtdFYycW9zN29FcG51NU5GNElBM3I2RF9wVjJBRGx2bWxrTXdiMDZFYzllUWNaMlN4N0RsOTlVMDRxZFZEMjJXdlRZcXBVOGptQ2ZDSVZiOEJlQW5BZDVCWlkzSnJ6WWNPWVRiN1J0cldCd0pvbTc3RGRiMm9pZ3ZISTl6WWhDUmNCZ2s3; slave_user=gh_5d822fe7fd08; xid=9794daa60db66fcf7a65c4054e3d68ce; mmad_session=43d4e5247a6b025b67ba3abd48d27a309ec4713911b6ef6f23cddb4b9953e771354ad1572fbc3fa895051725e95abb887cf2d03e9864084974db75c8588189699ea5b20b8fe35073831446ef98d24de600f107fe69d79646a3dd2907ab712e1f11de1c56c245721266e7088080fefde3; ts_last=mp.weixin.qq.com/cgi-bin/frame; ts_uid=1963034896; monitor_count=15&#39;
}#请求头信息,这里cookie信息必须添加,否则得不到网页信息
url=&#39;https://mp.weixin.qq.com/cgi-b ... 39%3B
response=requests.get(url,headers=headers)#得到响应内容
response.encoding=&#39;utf-8&#39;#设置响应内容为utf-8格式
html=response.text#得到网页的文本形式
print(html)
  此处的请求标头信息必须添加cookie信息,否则无法获取网页信息
  网页的请求结果如下图所示。红色框标记了我们需要的文章标题和文章链接。
  
  2、分析网页
  从网页响应结果中我们可以看到,每个文章的标题和链接都位于“ title”标签和“ cover”标签的后面,因此我们可以使用正则表达式直接对其进行解析
  title=re.findall(&#39;"title":"(.*?)"&#39;,html)#得到文章标题
cover=re.findall(&#39;"cover":"(.*?)"&#39;,html)#得到文章链接
all=zip(title,cover)#利用zip方法,将两个列表中的数据一一对应
print(list(all))#list是对zip方法得到的数据进行解压
  解析后的结果如下
  
  3、保存数据
  for data in all:#for循环遍历列表
time.sleep(3)#每爬取一篇文章间隔3秒,以防触发反爬
with open(&#39;C:\\Users\\Administrator\\Desktop\\爬取公众号文章.csv&#39;,&#39;a&#39;,encoding=&#39;utf-8-sig&#39;) as file:
#将数据保存到桌面
write=csv.writer(file)
write.writerow(data)
  到目前为止,该抓取工具已经完成,让我们看一下最终结果
  
  完整代码

免费获取:微信公众号批量爬取Java版

采集交流优采云 发表了文章 • 0 个评论 • 199 次浏览 • 2020-09-06 17:21 • 来自相关话题

  微信公众号批量抓取Java版本
  最近,我们需要抓取微信公众号的文章信息。我在互联网上搜索后发现,抓取微信官方账号的困难在于无法在PC端打开官方账号文章的链接。您需要使用WeChat的浏览器(获取WeChat客户端的补充参数才能访问其他平台上的Open),这会给爬虫程序带来很多麻烦。后来,在知乎上,我看到了由一头大牛用PHP编写的微信官方帐户爬网程序,并且根据大佬的想法将其直接制成Java。在转换过程中遇到了很多详细的问题,因此请与大家分享。
  系统的基本思想是在Android模拟器上运行微信,模拟器设置代理,通过代理服务器拦截微信数据,并将获取的数据发送到自己的程序进行处理。
  要准备的环境:nodejs,anyproxy代理,Android仿真器
  nodejs下载地址:我下载了Windows版本,只需下载并直接安装即可。安装后,直接运行C:\ Program Files \ nodejs \ npm.cmd即可自动配置环境。
  anyproxy安装:在上一步中安装了nodejs之后,直接在cmd中运行npm install -g anyproxy,它将被安装
  互联网上只有一个Android模拟器。
  首先为代理服务器安装证书。默认情况下,Anyproxy不会解析https链接。安装证书后,可以解决它。在cmd中执行anyproxy --root将安装证书,然后必须在模拟器上下载证书。
  然后输入anyproxy -i命令打开代理服务。 (请记住要添加参数!)
  
  记住该IP和端口,然后Android仿真器的代理将使用此IP和端口。现在,使用浏览器打开网页:: 8002 /这是anyproxy的网络界面,用于显示http传输数据。
  
  单击上方红色框中的菜单,将显示QR码。使用Android模拟器扫描代码以进行识别。仿真器(手机)将下载证书并安装。
  现在我们准备为模拟器设置代理,代理模式设置为手动,代理ip是运行anyproxy的计算机的ip,端口为8001
  
  准备工作到此基本完成。在模拟器上打开微信并开设一个官方帐户文章。您可以从刚打开的Web界面中查看anyproxy捕获的数据:
  
  在上方的红色框中是微信文章的链接,单击进入以查看特定数据。如果响应正文中没有任何内容,则证书安装可能存在问题。
  如果一切都通过以上,则可以下去。
  在这里,我们依靠代理服务来捕获微信数据,但是我们无法捕获数据,而只能自己操作微信。最好手动复制它。因此,我们需要微信客户端自行跳转到页面。这时,您可以使用anyproxy拦截微信服务器返回的数据,向其中注入页面跳转代码,然后将处理后的数据返回给模拟器,以实现微信客户端的自动跳转。
  在anyproxy中打开一个名为rule_default.js的js文件,Windows下的文件为:C:\ Users \ Administrator \ AppData \ Roaming \ npm \ node_modules \ anyproxy \ lib
  文件中有一种称为replaceServerResDataAsync的方法:function(req,res,serverResData,callback)。此方法负责对anyproxy获得的数据进行各种操作。开头应该只有callback(serverResData);此语句意味着直接将服务器响应数据返回给客户端。直接删除此语句,并将其替换为Daniel编写的以下代码。我在这里没有对代码做任何更改,并且内部的注释也很清楚地解释了,只需按照逻辑来理解它,问题就不大了。
   1 replaceServerResDataAsync: function(req,res,serverResData,callback){
2 if(/mp\/getmasssendmsg/i.test(req.url)){//当链接地址为公众号历史消息页面时(第一种页面形式)
3 //console.log("开始第一种页面爬取");
4 if(serverResData.toString() !== ""){
try {//防止报错退出程序
7 var reg = /msgList = (.*?);/;//定义历史消息正则匹配规则
8 var ret = reg.exec(serverResData.toString());//转换变量为string
9 HttpPost(ret[1],req.url,"/InternetSpider/getData/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
10 var http = require('http');
11 http.get('http://xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
12 res.on('data', function(chunk){
13 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
14 })
15 });
16 }catch(e){//如果上面的正则没有匹配到,那么这个页面内容可能是公众号历史消息页面向下翻动的第二页,因为历史消息第一页是html格式的,第二页就是json格式的。
17 //console.log("开始第一种页面爬取向下翻形式");
18 try {
19 var json = JSON.parse(serverResData.toString());
20 if (json.general_msg_list != []) {
21 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
22 }
23 }catch(e){
24 console.log(e);//错误捕捉
25 }
26 callback(serverResData);//直接返回第二页json内容
27 }
28 }
29 //console.log("开始第一种页面爬取 结束");
30 }else if(/mp\/profile_ext\?action=home/i.test(req.url)){//当链接地址为公众号历史消息页面时(第二种页面形式)
31 try {
32 var reg = /var msgList = \'(.*?)\';/;//定义历史消息正则匹配规则(和第一种页面形式的正则不同)
33 var ret = reg.exec(serverResData.toString());//转换变量为string
34 HttpPost(ret[1],req.url,"/xxx/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
35 var http = require('http');
36 http.get('xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
37 res.on('data', function(chunk){
38 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
39 })
40 });
41 }catch(e){
42 //console.log(e);
43 callback(serverResData);
44 }
45 }else if(/mp\/profile_ext\?action=getmsg/i.test(req.url)){//第二种页面表现形式的向下翻页后的json
46 try {
47 var json = JSON.parse(serverResData.toString());
48 if (json.general_msg_list != []) {
49 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
50 }
51 }catch(e){
52 console.log(e);
53 }
54 callback(serverResData);
55 }else if(/mp\/getappmsgext/i.test(req.url)){//当链接地址为公众号文章阅读量和点赞量时
56 try {
57 HttpPost(serverResData,req.url,"/xxx/getMsgExt");//函数是后文定义的,功能是将文章阅读量点赞量的json发送到服务器
58 }catch(e){
59
60 }
61 callback(serverResData);
62 }else if(/s\?__biz/i.test(req.url) || /mp\/rumor/i.test(req.url)){//当链接地址为公众号文章时(rumor这个地址是公众号文章被辟谣了)
63 try {
64 var http = require('http');
65 http.get('http://xxx/getWxPost', function(res) {//这个地址是自己服务器上的另一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxPost.php的原理。
66 res.on('data', function(chunk){
67 callback(chunk+serverResData);
68 })
69 });
70 }catch(e){
71 callback(serverResData);
72 }
73 }else{
74 callback(serverResData);
75 }
76 //callback(serverResData);
77 }
  这里是一个简短的解释。链接到微信官方帐户历史新闻页面的链接有两种形式:一种以/ mp / getmasssendmsg开头,另一种以/ mp / profile_ext开头。历史记录页面可以关闭。如果将其关闭,则会触发js事件,以发送请求以获取json数据(下一页内容)。也有指向官方帐户文章的链接,也有指向文章的阅读次数和喜欢次数的链接(返回json数据)。这些链接的形式是固定的,可以通过逻辑判断加以区分。这里的问题是,如果需要对所有历史页面进行爬网,该怎么做。我的想法是模拟鼠标在js中向下滑动,以触发提交请求以加载列表的下一部分。或者直接使用anyproxy分析滑动加载请求,并将请求直接发送至微信服务器。但是,如何判断没有剩余数据始终存在问题。我正在搜寻最新数据。我暂时没有这个要求。以后可能需要。如果需要,可以尝试一下。 查看全部

  微信公众号批量抓取Java版本
  最近,我们需要抓取微信公众号的文章信息。我在互联网上搜索后发现,抓取微信官方账号的困难在于无法在PC端打开官方账号文章的链接。您需要使用WeChat的浏览器(获取WeChat客户端的补充参数才能访问其他平台上的Open),这会给爬虫程序带来很多麻烦。后来,在知乎上,我看到了由一头大牛用PHP编写的微信官方帐户爬网程序,并且根据大佬的想法将其直接制成Java。在转换过程中遇到了很多详细的问题,因此请与大家分享。
  系统的基本思想是在Android模拟器上运行微信,模拟器设置代理,通过代理服务器拦截微信数据,并将获取的数据发送到自己的程序进行处理。
  要准备的环境:nodejs,anyproxy代理,Android仿真器
  nodejs下载地址:我下载了Windows版本,只需下载并直接安装即可。安装后,直接运行C:\ Program Files \ nodejs \ npm.cmd即可自动配置环境。
  anyproxy安装:在上一步中安装了nodejs之后,直接在cmd中运行npm install -g anyproxy,它将被安装
  互联网上只有一个Android模拟器。
  首先为代理服务器安装证书。默认情况下,Anyproxy不会解析https链接。安装证书后,可以解决它。在cmd中执行anyproxy --root将安装证书,然后必须在模拟器上下载证书。
  然后输入anyproxy -i命令打开代理服务。 (请记住要添加参数!)
  
  记住该IP和端口,然后Android仿真器的代理将使用此IP和端口。现在,使用浏览器打开网页:: 8002 /这是anyproxy的网络界面,用于显示http传输数据。
  
  单击上方红色框中的菜单,将显示QR码。使用Android模拟器扫描代码以进行识别。仿真器(手机)将下载证书并安装。
  现在我们准备为模拟器设置代理,代理模式设置为手动,代理ip是运行anyproxy的计算机的ip,端口为8001
  
  准备工作到此基本完成。在模拟器上打开微信并开设一个官方帐户文章。您可以从刚打开的Web界面中查看anyproxy捕获的数据:
  
  在上方的红色框中是微信文章的链接,单击进入以查看特定数据。如果响应正文中没有任何内容,则证书安装可能存在问题。
  如果一切都通过以上,则可以下去。
  在这里,我们依靠代理服务来捕获微信数据,但是我们无法捕获数据,而只能自己操作微信。最好手动复制它。因此,我们需要微信客户端自行跳转到页面。这时,您可以使用anyproxy拦截微信服务器返回的数据,向其中注入页面跳转代码,然后将处理后的数据返回给模拟器,以实现微信客户端的自动跳转。
  在anyproxy中打开一个名为rule_default.js的js文件,Windows下的文件为:C:\ Users \ Administrator \ AppData \ Roaming \ npm \ node_modules \ anyproxy \ lib
  文件中有一种称为replaceServerResDataAsync的方法:function(req,res,serverResData,callback)。此方法负责对anyproxy获得的数据进行各种操作。开头应该只有callback(serverResData);此语句意味着直接将服务器响应数据返回给客户端。直接删除此语句,并将其替换为Daniel编写的以下代码。我在这里没有对代码做任何更改,并且内部的注释也很清楚地解释了,只需按照逻辑来理解它,问题就不大了。
   1 replaceServerResDataAsync: function(req,res,serverResData,callback){
2 if(/mp\/getmasssendmsg/i.test(req.url)){//当链接地址为公众号历史消息页面时(第一种页面形式)
3 //console.log("开始第一种页面爬取");
4 if(serverResData.toString() !== ""){
try {//防止报错退出程序
7 var reg = /msgList = (.*?);/;//定义历史消息正则匹配规则
8 var ret = reg.exec(serverResData.toString());//转换变量为string
9 HttpPost(ret[1],req.url,"/InternetSpider/getData/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
10 var http = require('http');
11 http.get('http://xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
12 res.on('data', function(chunk){
13 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
14 })
15 });
16 }catch(e){//如果上面的正则没有匹配到,那么这个页面内容可能是公众号历史消息页面向下翻动的第二页,因为历史消息第一页是html格式的,第二页就是json格式的。
17 //console.log("开始第一种页面爬取向下翻形式");
18 try {
19 var json = JSON.parse(serverResData.toString());
20 if (json.general_msg_list != []) {
21 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
22 }
23 }catch(e){
24 console.log(e);//错误捕捉
25 }
26 callback(serverResData);//直接返回第二页json内容
27 }
28 }
29 //console.log("开始第一种页面爬取 结束");
30 }else if(/mp\/profile_ext\?action=home/i.test(req.url)){//当链接地址为公众号历史消息页面时(第二种页面形式)
31 try {
32 var reg = /var msgList = \'(.*?)\';/;//定义历史消息正则匹配规则(和第一种页面形式的正则不同)
33 var ret = reg.exec(serverResData.toString());//转换变量为string
34 HttpPost(ret[1],req.url,"/xxx/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
35 var http = require('http');
36 http.get('xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
37 res.on('data', function(chunk){
38 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
39 })
40 });
41 }catch(e){
42 //console.log(e);
43 callback(serverResData);
44 }
45 }else if(/mp\/profile_ext\?action=getmsg/i.test(req.url)){//第二种页面表现形式的向下翻页后的json
46 try {
47 var json = JSON.parse(serverResData.toString());
48 if (json.general_msg_list != []) {
49 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
50 }
51 }catch(e){
52 console.log(e);
53 }
54 callback(serverResData);
55 }else if(/mp\/getappmsgext/i.test(req.url)){//当链接地址为公众号文章阅读量和点赞量时
56 try {
57 HttpPost(serverResData,req.url,"/xxx/getMsgExt");//函数是后文定义的,功能是将文章阅读量点赞量的json发送到服务器
58 }catch(e){
59
60 }
61 callback(serverResData);
62 }else if(/s\?__biz/i.test(req.url) || /mp\/rumor/i.test(req.url)){//当链接地址为公众号文章时(rumor这个地址是公众号文章被辟谣了)
63 try {
64 var http = require('http');
65 http.get('http://xxx/getWxPost', function(res) {//这个地址是自己服务器上的另一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxPost.php的原理。
66 res.on('data', function(chunk){
67 callback(chunk+serverResData);
68 })
69 });
70 }catch(e){
71 callback(serverResData);
72 }
73 }else{
74 callback(serverResData);
75 }
76 //callback(serverResData);
77 }
  这里是一个简短的解释。链接到微信官方帐户历史新闻页面的链接有两种形式:一种以/ mp / getmasssendmsg开头,另一种以/ mp / profile_ext开头。历史记录页面可以关闭。如果将其关闭,则会触发js事件,以发送请求以获取json数据(下一页内容)。也有指向官方帐户文章的链接,也有指向文章的阅读次数和喜欢次数的链接(返回json数据)。这些链接的形式是固定的,可以通过逻辑判断加以区分。这里的问题是,如果需要对所有历史页面进行爬网,该怎么做。我的想法是模拟鼠标在js中向下滑动,以触发提交请求以加载列表的下一部分。或者直接使用anyproxy分析滑动加载请求,并将请求直接发送至微信服务器。但是,如何判断没有剩余数据始终存在问题。我正在搜寻最新数据。我暂时没有这个要求。以后可能需要。如果需要,可以尝试一下。

内容分享:微信公众号文章爬取实战

采集交流优采云 发表了文章 • 0 个评论 • 176 次浏览 • 2020-09-06 05:54 • 来自相关话题

  微信公众号文章抓实战
  在之前的爬虫实战中,我们基于关键词搜索了相关的微信公众号文章,并获得了一系列相关的文章标题,链接等。找到文章后,我们需要保存,此实验的目的是抓取微信公众号文章文本内容。
  实验环境
  python3
  主要使用的请求pyquery库
  步骤分析
  本文使用CSDN公共帐户的Python来抓取北京二手房数据,以分析北票人是否负担得起房屋? 随附完整的源代码作为示例,
  在请求此页面后,我们获得文章标题,作者,官方帐户信息和文章文本信息。由于我们要显示文章的内容,因此为了确保文章文本的格式不变,我们提取html格式,最后将所有提取的内容合并为html格式,并通过浏览器保持文章的原创格式。
  应注意,文章中的所有图片均来自互联网。这些图片无法通过打开本地html进行解析,因此我们提取了图片链接,然后将其下载并保存到本地,并且html中的图片链接替换了本地位置。
  在实验过程中确定文章标题
  文章标题位于以下位置:
  
  1<br />2<br />
  <br />title = doc.find(&#39;.rich_media_title&#39;).text()<br />
  确认官方帐户信息
  作者信息,官方帐户的来源,微信帐户以及官方帐户的介绍都可以通过pyquery提取:
  
  1<br />2<br />3<br />4<br />
  # 微信公众号<br />author = doc.find(&#39;#meta_content .rich_media_meta_text&#39;).text()<br />source = doc.find(&#39;#js_name&#39;).text()<br />source_info = doc.find(&#39;.profile_meta_value&#39;).text()<br />
  确认文章的内容
  文章的正文内容无法通过text()提取,因为提取的内容只是文本部分,而且缺少格式,因此显示起来非常难看,因此我们使用html()保留身体部位的html元素:
  
  1<br />2<br />
  # 正文内容<br />content = doc.find(&#39;.rich_media_content&#39;)<br />
  提取所有图像链接
  所有图像链接都在img元素的data-src属性中:
  
  1<br />2<br />3<br />4<br />5<br />6<br />
  # 所有图片链接<br />pics_src = content.find(&#39;img&#39;).items()<br />for each in pics_src:<br /> if &#39;=&#39; in each.attr(&#39;data-src&#39;):<br /> pic.append(each.attr(&#39;data-src&#39;))<br />#print(pic)<br />
  下载图片
  下载文章中的所有图片并将其保存在本地文件中
  1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />
  def (title,url):<br /> print(url)<br /> pic_name = url.split(&#39;/&#39;)[4]<br /> pic_type = url.split(&#39;=&#39;)[1]<br /> response = requests.get(url,headers=random.choice(headers))<br /> try:<br /> if response.status_code == 200:<br /> file_dir = "{0}/{1}".format(os.getcwd(), title)<br /> if not os.path.isdir(file_dir):<br /> os.mkdir(file_dir)<br /> path = os.path.join(file_dir,pic_name+&#39;.&#39;+pic_type)<br /> if not os.path.exists(path):<br /> with open(path,&#39;wb&#39;) as f:<br /> f.write(response.content)<br /> except:<br /> pass<br />
  替换图片
  将文本链接中的图像链接替换为本地图像的链接,但要注意,我们需要在img元素中添加src属性,因为实际的图像链接存储在此处,然后存储图像的位置用作src属性值。
  1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />
  for item in content.find(&#39;img&#39;).items():<br /> pic_url = item.attr(&#39;data-src&#39;)<br /> if &#39;=&#39; in pic_url:<br /> pic_name = pic_url.split(&#39;/&#39;)[4]<br /> pic_type = pic_url.split(&#39;=&#39;)[1]<br /> image = pic_name + &#39;.&#39; + pic_type<br /> item.add_class(&#39;src&#39;)<br /> item.attr(&#39;src&#39;,image)<br />
  生成index.html
  以html格式添加先前提取的文章标题,作者和官方帐户信息以生成index.html,然后将其打开以查看微信正文内容。
  1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />
  file_dir = "{0}/{1}".format(os.getcwd(), title)<br />path = os.path.join(file_dir,&#39;index.html&#39;)<br /><br />index = &#39;&#39;+title+&#39;
&#39;<br />index += &#39;&#39;+author+&#39;&#39;+source+&#39;
&#39;<br />index += &#39;&#39;+source_info+&#39;
&#39;<br />index += content<br />with open(path, &#39;wb&#39;) as f:<br /> f.write(index.encode(&#39;utf-8&#39;))<br />
  结果分析与解释
  有关完整代码,请参见微信2. py
  运行代码:
  1<br />
  python https://mp.weixin.qq.com/s/QAw ... %3Bbr />
  
  检索到的index.html如下: 查看全部

  微信公众号文章抓实战
  在之前的爬虫实战中,我们基于关键词搜索了相关的微信公众号文章,并获得了一系列相关的文章标题,链接等。找到文章后,我们需要保存,此实验的目的是抓取微信公众号文章文本内容。
  实验环境
  python3
  主要使用的请求pyquery库
  步骤分析
  本文使用CSDN公共帐户的Python来抓取北京二手房数据,以分析北票人是否负担得起房屋? 随附完整的源代码作为示例,
  在请求此页面后,我们获得文章标题,作者,官方帐户信息和文章文本信息。由于我们要显示文章的内容,因此为了确保文章文本的格式不变,我们提取html格式,最后将所有提取的内容合并为html格式,并通过浏览器保持文章的原创格式。
  应注意,文章中的所有图片均来自互联网。这些图片无法通过打开本地html进行解析,因此我们提取了图片链接,然后将其下载并保存到本地,并且html中的图片链接替换了本地位置。
  在实验过程中确定文章标题
  文章标题位于以下位置:
  
  1<br />2<br />
  <br />title = doc.find(&#39;.rich_media_title&#39;).text()<br />
  确认官方帐户信息
  作者信息,官方帐户的来源,微信帐户以及官方帐户的介绍都可以通过pyquery提取:
  
  1<br />2<br />3<br />4<br />
  # 微信公众号<br />author = doc.find(&#39;#meta_content .rich_media_meta_text&#39;).text()<br />source = doc.find(&#39;#js_name&#39;).text()<br />source_info = doc.find(&#39;.profile_meta_value&#39;).text()<br />
  确认文章的内容
  文章的正文内容无法通过text()提取,因为提取的内容只是文本部分,而且缺少格式,因此显示起来非常难看,因此我们使用html()保留身体部位的html元素:
  
  1<br />2<br />
  # 正文内容<br />content = doc.find(&#39;.rich_media_content&#39;)<br />
  提取所有图像链接
  所有图像链接都在img元素的data-src属性中:
  
  1<br />2<br />3<br />4<br />5<br />6<br />
  # 所有图片链接<br />pics_src = content.find(&#39;img&#39;).items()<br />for each in pics_src:<br /> if &#39;=&#39; in each.attr(&#39;data-src&#39;):<br /> pic.append(each.attr(&#39;data-src&#39;))<br />#print(pic)<br />
  下载图片
  下载文章中的所有图片并将其保存在本地文件中
  1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />
  def (title,url):<br /> print(url)<br /> pic_name = url.split(&#39;/&#39;)[4]<br /> pic_type = url.split(&#39;=&#39;)[1]<br /> response = requests.get(url,headers=random.choice(headers))<br /> try:<br /> if response.status_code == 200:<br /> file_dir = "{0}/{1}".format(os.getcwd(), title)<br /> if not os.path.isdir(file_dir):<br /> os.mkdir(file_dir)<br /> path = os.path.join(file_dir,pic_name+&#39;.&#39;+pic_type)<br /> if not os.path.exists(path):<br /> with open(path,&#39;wb&#39;) as f:<br /> f.write(response.content)<br /> except:<br /> pass<br />
  替换图片
  将文本链接中的图像链接替换为本地图像的链接,但要注意,我们需要在img元素中添加src属性,因为实际的图像链接存储在此处,然后存储图像的位置用作src属性值。
  1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />
  for item in content.find(&#39;img&#39;).items():<br /> pic_url = item.attr(&#39;data-src&#39;)<br /> if &#39;=&#39; in pic_url:<br /> pic_name = pic_url.split(&#39;/&#39;)[4]<br /> pic_type = pic_url.split(&#39;=&#39;)[1]<br /> image = pic_name + &#39;.&#39; + pic_type<br /> item.add_class(&#39;src&#39;)<br /> item.attr(&#39;src&#39;,image)<br />
  生成index.html
  以html格式添加先前提取的文章标题,作者和官方帐户信息以生成index.html,然后将其打开以查看微信正文内容。
  1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />
  file_dir = "{0}/{1}".format(os.getcwd(), title)<br />path = os.path.join(file_dir,&#39;index.html&#39;)<br /><br />index = &#39;&#39;+title+&#39;
&#39;<br />index += &#39;&#39;+author+&#39;&#39;+source+&#39;
&#39;<br />index += &#39;&#39;+source_info+&#39;
&#39;<br />index += content<br />with open(path, &#39;wb&#39;) as f:<br /> f.write(index.encode(&#39;utf-8&#39;))<br />
  结果分析与解释
  有关完整代码,请参见微信2. py
  运行代码:
  1<br />
  python https://mp.weixin.qq.com/s/QAw ... %3Bbr />
  
  检索到的index.html如下:

干货内容:[Python]抓取微信公众号文章

采集交流优采云 发表了文章 • 0 个评论 • 214 次浏览 • 2020-09-01 02:09 • 来自相关话题

  [Python]抢到微信官方账号文章
  
  我目前正在开发自己的项目,该项目涉及文章,该项目需要通过python抓取微信官方帐户. 由于微信的独特方法,不可能直接爬网. 研究了一些文章之后,我可能会有想法. 目前,Internet可以毫无问题地搜索提议的解决方案,但是由于第三方库中的某些更改,内部代码基本上无法使用. 本文是为需要爬网公共帐户文章的朋友而写的. 最后还将提供python源代码下载.
  ##公共帐户捕获方法
  当前有两种主流的公共帐户爬网解决方案. 一种是搜索搜狗的微信官方帐户页面,找到文章地址,然后获取特定的文章内容. 第二种方法是注册一个公共帐户,然后通过官方帐户的搜索界面可以查询产品地址,然后根据该地址获取产品内容.
  这两种方案各有优缺点. 搜狗搜索的核心思想是通过请求模拟搜狗搜索公共账号,然后解析搜索结果页面,然后根据公共账号的首页地址对抓取工具进行爬网. }已捕获详细信息. 由于搜狗与腾讯之间的协议,只能显示最新的10个文章,但无法获取所有文章. 如果要获取所有文章,则朋友可能必须使用第二种方法. 第二种方法的缺点是通过腾讯身份验证注册公共帐户. 这个过程比较麻烦. 您可以通过调用该界面的公共帐户查询界面进行查询,但是您需要使用硒来模拟滑动页面翻页操作. 整个过程仍然很麻烦. 是. 因为我的项目不需要历史记录文章,所以我使用搜狗搜索功能来检索公共帐户.
  检索最近的10个公共帐户文章
  Python需要依赖的第三方库如下:
  
  urllib,pyquery,请求,硒
  具体逻辑写在注释中,没有什么特别复杂的.
  核心爬虫课程
  ```python
  #! / usr / bin / python
  #代码: utf-8
  
  [Python]纯文本视图复制代码
  import sys
reload(sys)
sys.setdefaultencoding('utf-8')
from urllib import quote
from pyquery import PyQuery as pq
import requests
import time
import re
import os
from selenium.webdriver import Chrome
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support.wait import WebDriverWait
# 搜索入口地址,以公众为关键字搜索该公众号
def get_search_result_by_keywords(sogou_search_url):
# 爬虫伪装头部设置
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0'}
# 设置操作超时时长
timeout = 5
# 爬虫模拟在一个request.session中完成
s = requests.Session()
log(u'搜索地址为:%s' % sogou_search_url)
return s.get(sogou_search_url, headers=headers, timeout=timeout).content
# 获得公众号主页地址
def get_wx_url_by_sougou_search_html(sougou_search_html):
doc = pq(sougou_search_html)
return doc('div[class=txt-box]')('p[class=tit]')('a').attr('href')
# 使用webdriver 加载公众号主页内容,主要是js渲染的部分
def get_selenium_js_html(url):
options = Options()
options.add_argument('-headless') # 无头参数
driver = Chrome(executable_path='chromedriver', chrome_options=options)
wait = WebDriverWait(driver, timeout=10)
driver.get(url)
time.sleep(3)
# 执行js得到整个页面内容
html = driver.execute_script("return document.documentElement.outerHTML")
driver.close()
return html
# 获取公众号文章内容
def parse_wx_articles_by_html(selenium_html):
doc = pq(selenium_html)
return doc('div[class="weui_media_box appmsg"]')
# 将获取到的文章转换为字典
def switch_arctiles_to_list(articles):
# 定义存贮变量
articles_list = []
i = 1
# 遍历找到的文章,解析里面的内容
if articles:
for article in articles.items():
log(u'开始整合(%d/%d)' % (i, len(articles)))
# 处理单个文章
articles_list.append(parse_one_article(article))
i += 1
return articles_list
# 解析单篇文章
def parse_one_article(article):
article_dict = {}
# 获取标题
title = article('h4[class="weui_media_title"]').text().strip()
###log(u'标题是: %s' % title)
# 获取标题对应的地址
url = 'http://mp.weixin.qq.com' + article('h4[class="weui_media_title"]').attr('hrefs')
log(u'地址为: %s' % url)
# 获取概要内容
summary = article('.weui_media_desc').text()
log(u'文章简述: %s' % summary)
# 获取文章发表时间
date = article('.weui_media_extra_info').text().strip()
log(u'发表时间为: %s' % date)
# 获取封面图片
pic = parse_cover_pic(article)
# 返回字典数据
return {
'title': title,
'url': url,
'summary': summary,
'date': date,
'pic': pic
}
# 查找封面图片,获取封面图片地址
def parse_cover_pic(article):
pic = article('.weui_media_hd').attr('style')
p = re.compile(r'background-image:url\((.*?)\)')
rs = p.findall(pic)
log(u'封面图片是:%s ' % rs[0] if len(rs) > 0 else '')
return rs[0] if len(rs) > 0 else ''
# 自定义log函数,主要是加上时间
def log(msg):
print u'%s: %s' % (time.strftime('%Y-%m-%d_%H-%M-%S'), msg)
# 验证函数
def need_verify(selenium_html):
' 有时候对方会封锁ip,这里做一下判断,检测html中是否包含id=verify_change的标签,有的话,代表被重定向了,提醒过一阵子重试 '
return pq(selenium_html)('#verify_change').text() != ''
# 创建公众号命名的文件夹
def create_dir(keywords):
if not os.path.exists(keywords):
os.makedirs(keywords)
# 爬虫主函数
def run(keywords):
' 爬虫入口函数 '
# Step 0 : 创建公众号命名的文件夹
create_dir(keywords)
# 搜狐微信搜索链接入口
sogou_search_url = 'http://weixin.sogou.com/weixin?type=1&query=%s&ie=utf8&s_from=input&_sug_=n&_sug_type_=' % quote(
keywords)
# Step 1:GET请求到搜狗微信引擎,以微信公众号英文名称作为查询关键字
log(u'开始获取,微信公众号英文名为:%s' % keywords)
log(u'开始调用sougou搜索引擎')
sougou_search_html = get_search_result_by_keywords(sogou_search_url)
# Step 2:从搜索结果页中解析出公众号主页链接
log(u'获取sougou_search_html成功,开始抓取公众号对应的主页wx_url')
wx_url = get_wx_url_by_sougou_search_html(sougou_search_html)
log(u'获取wx_url成功,%s' % wx_url)
# Step 3:Selenium+PhantomJs获取js异步加载渲染后的html
log(u'开始调用selenium渲染html')
selenium_html = get_selenium_js_html(wx_url)
# Step 4: 检测目标网站是否进行了封锁
if need_verify(selenium_html):
log(u'爬虫被目标网站封锁,请稍后再试')
else:
# Step 5: 使用PyQuery,从Step 3获取的html中解析出公众号文章列表的数据
log(u'调用selenium渲染html完成,开始解析公众号文章')
articles = parse_wx_articles_by_html(selenium_html)
log(u'抓取到微信文章%d篇' % len(articles))
# Step 6: 把微信文章数据封装成字典的list
log(u'开始整合微信文章数据为字典')
articles_list = switch_arctiles_to_list(articles)
return [content['title'] for content in articles_list]
```
main入口函数:
```python
# coding: utf8
import spider_weixun_by_sogou
if __name__ == '__main__':
gongzhonghao = raw_input(u'input weixin gongzhonghao:')
if not gongzhonghao:
gongzhonghao = 'spider'
text = " ".join(spider_weixun_by_sogou.run(gongzhonghao))
print text
  ```
<p>直接运行main方法,然后在控制台中输入要爬网的公共帐户的英文名称. 中文搜索可能不止一个. 此处所做的只是对精确搜索的搜索. 只需检查电话并检查公共帐户号的英文,请单击公共帐户,然后查看公共帐户信息以查看以下与“ mask5}爬网的爬虫结果相关的信息. 您可以通过在代码中调用webdriver.py来检索文章的特定内容. 查看全部

  [Python]抢到微信官方账号文章
  
  我目前正在开发自己的项目,该项目涉及文章,该项目需要通过python抓取微信官方帐户. 由于微信的独特方法,不可能直接爬网. 研究了一些文章之后,我可能会有想法. 目前,Internet可以毫无问题地搜索提议的解决方案,但是由于第三方库中的某些更改,内部代码基本上无法使用. 本文是为需要爬网公共帐户文章的朋友而写的. 最后还将提供python源代码下载.
  ##公共帐户捕获方法
  当前有两种主流的公共帐户爬网解决方案. 一种是搜索搜狗的微信官方帐户页面,找到文章地址,然后获取特定的文章内容. 第二种方法是注册一个公共帐户,然后通过官方帐户的搜索界面可以查询产品地址,然后根据该地址获取产品内容.
  这两种方案各有优缺点. 搜狗搜索的核心思想是通过请求模拟搜狗搜索公共账号,然后解析搜索结果页面,然后根据公共账号的首页地址对抓取工具进行爬网. }已捕获详细信息. 由于搜狗与腾讯之间的协议,只能显示最新的10个文章,但无法获取所有文章. 如果要获取所有文章,则朋友可能必须使用第二种方法. 第二种方法的缺点是通过腾讯身份验证注册公共帐户. 这个过程比较麻烦. 您可以通过调用该界面的公共帐户查询界面进行查询,但是您需要使用硒来模拟滑动页面翻页操作. 整个过程仍然很麻烦. 是. 因为我的项目不需要历史记录文章,所以我使用搜狗搜索功能来检索公共帐户.
  检索最近的10个公共帐户文章
  Python需要依赖的第三方库如下:
  
  urllib,pyquery,请求,硒
  具体逻辑写在注释中,没有什么特别复杂的.
  核心爬虫课程
  ```python
  #! / usr / bin / python
  #代码: utf-8
  
  [Python]纯文本视图复制代码
  import sys
reload(sys)
sys.setdefaultencoding('utf-8')
from urllib import quote
from pyquery import PyQuery as pq
import requests
import time
import re
import os
from selenium.webdriver import Chrome
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support.wait import WebDriverWait
# 搜索入口地址,以公众为关键字搜索该公众号
def get_search_result_by_keywords(sogou_search_url):
# 爬虫伪装头部设置
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0'}
# 设置操作超时时长
timeout = 5
# 爬虫模拟在一个request.session中完成
s = requests.Session()
log(u'搜索地址为:%s' % sogou_search_url)
return s.get(sogou_search_url, headers=headers, timeout=timeout).content
# 获得公众号主页地址
def get_wx_url_by_sougou_search_html(sougou_search_html):
doc = pq(sougou_search_html)
return doc('div[class=txt-box]')('p[class=tit]')('a').attr('href')
# 使用webdriver 加载公众号主页内容,主要是js渲染的部分
def get_selenium_js_html(url):
options = Options()
options.add_argument('-headless') # 无头参数
driver = Chrome(executable_path='chromedriver', chrome_options=options)
wait = WebDriverWait(driver, timeout=10)
driver.get(url)
time.sleep(3)
# 执行js得到整个页面内容
html = driver.execute_script("return document.documentElement.outerHTML")
driver.close()
return html
# 获取公众号文章内容
def parse_wx_articles_by_html(selenium_html):
doc = pq(selenium_html)
return doc('div[class="weui_media_box appmsg"]')
# 将获取到的文章转换为字典
def switch_arctiles_to_list(articles):
# 定义存贮变量
articles_list = []
i = 1
# 遍历找到的文章,解析里面的内容
if articles:
for article in articles.items():
log(u'开始整合(%d/%d)' % (i, len(articles)))
# 处理单个文章
articles_list.append(parse_one_article(article))
i += 1
return articles_list
# 解析单篇文章
def parse_one_article(article):
article_dict = {}
# 获取标题
title = article('h4[class="weui_media_title"]').text().strip()
###log(u'标题是: %s' % title)
# 获取标题对应的地址
url = 'http://mp.weixin.qq.com' + article('h4[class="weui_media_title"]').attr('hrefs')
log(u'地址为: %s' % url)
# 获取概要内容
summary = article('.weui_media_desc').text()
log(u'文章简述: %s' % summary)
# 获取文章发表时间
date = article('.weui_media_extra_info').text().strip()
log(u'发表时间为: %s' % date)
# 获取封面图片
pic = parse_cover_pic(article)
# 返回字典数据
return {
'title': title,
'url': url,
'summary': summary,
'date': date,
'pic': pic
}
# 查找封面图片,获取封面图片地址
def parse_cover_pic(article):
pic = article('.weui_media_hd').attr('style')
p = re.compile(r'background-image:url\((.*?)\)')
rs = p.findall(pic)
log(u'封面图片是:%s ' % rs[0] if len(rs) > 0 else '')
return rs[0] if len(rs) > 0 else ''
# 自定义log函数,主要是加上时间
def log(msg):
print u'%s: %s' % (time.strftime('%Y-%m-%d_%H-%M-%S'), msg)
# 验证函数
def need_verify(selenium_html):
' 有时候对方会封锁ip,这里做一下判断,检测html中是否包含id=verify_change的标签,有的话,代表被重定向了,提醒过一阵子重试 '
return pq(selenium_html)('#verify_change').text() != ''
# 创建公众号命名的文件夹
def create_dir(keywords):
if not os.path.exists(keywords):
os.makedirs(keywords)
# 爬虫主函数
def run(keywords):
' 爬虫入口函数 '
# Step 0 : 创建公众号命名的文件夹
create_dir(keywords)
# 搜狐微信搜索链接入口
sogou_search_url = 'http://weixin.sogou.com/weixin?type=1&query=%s&ie=utf8&s_from=input&_sug_=n&_sug_type_=' % quote(
keywords)
# Step 1:GET请求到搜狗微信引擎,以微信公众号英文名称作为查询关键字
log(u'开始获取,微信公众号英文名为:%s' % keywords)
log(u'开始调用sougou搜索引擎')
sougou_search_html = get_search_result_by_keywords(sogou_search_url)
# Step 2:从搜索结果页中解析出公众号主页链接
log(u'获取sougou_search_html成功,开始抓取公众号对应的主页wx_url')
wx_url = get_wx_url_by_sougou_search_html(sougou_search_html)
log(u'获取wx_url成功,%s' % wx_url)
# Step 3:Selenium+PhantomJs获取js异步加载渲染后的html
log(u'开始调用selenium渲染html')
selenium_html = get_selenium_js_html(wx_url)
# Step 4: 检测目标网站是否进行了封锁
if need_verify(selenium_html):
log(u'爬虫被目标网站封锁,请稍后再试')
else:
# Step 5: 使用PyQuery,从Step 3获取的html中解析出公众号文章列表的数据
log(u'调用selenium渲染html完成,开始解析公众号文章')
articles = parse_wx_articles_by_html(selenium_html)
log(u'抓取到微信文章%d篇' % len(articles))
# Step 6: 把微信文章数据封装成字典的list
log(u'开始整合微信文章数据为字典')
articles_list = switch_arctiles_to_list(articles)
return [content['title'] for content in articles_list]
```
main入口函数:
```python
# coding: utf8
import spider_weixun_by_sogou
if __name__ == '__main__':
gongzhonghao = raw_input(u'input weixin gongzhonghao:')
if not gongzhonghao:
gongzhonghao = 'spider'
text = " ".join(spider_weixun_by_sogou.run(gongzhonghao))
print text
  ```
<p>直接运行main方法,然后在控制台中输入要爬网的公共帐户的英文名称. 中文搜索可能不止一个. 此处所做的只是对精确搜索的搜索. 只需检查电话并检查公共帐户号的英文,请单击公共帐户,然后查看公共帐户信息以查看以下与“ mask5}爬网的爬虫结果相关的信息. 您可以通过在代码中调用webdriver.py来检索文章的特定内容.

干货内容:Python入门学习教程:50行Python代码,教你获取公众号全部文章

采集交流优采云 发表了文章 • 0 个评论 • 206 次浏览 • 2020-08-31 16:07 • 来自相关话题

  Python入门学习教程: 50行Python代码,教您获得所有正式帐户的文章
  今天的Python入门学习教程主要告诉您如何获取官方帐户的所有文章!
  在阅读官方帐户的文章时,我们通常会遇到一个问题-阅读历史文章的经验不好.
  我们知道,有两种常见的爬网官方帐户的方法: 通过搜狗搜索获得它. 缺点是只能获取最新的十篇文章. 通过微信官方账号的物料管理获取官方账号. 缺点是您需要申请自己的官方帐户.
  
  今天,我们将介绍一种通过在PC端捕获微信来获取官方帐户文章的方法. 与其他方法相比,它非常方便.
  
  
  如上图所示,我们通过数据包捕获工具获得了微信网络信息请求. 我们发现,每次下拉列表中的文章时,我们都会请求/ mp / xxx(官方帐户不允许添加首页链接,xxx表示profile_ext).
  经过多次测试和分析,使用了以下参数
  数据如下
  {
"ret": 0,
"errmsg": "ok", # 请求状态
"msg_count": 10, # 信息条数
"can_msg_continue": 1, # 是否还可以继续获取,1代表可以。0代表不可以,也就是最后一页
"general_msg_list": "{"list":[]}", # 公众号文本信息
"next_offset": 20,
"video_count": 1,
"use_video_tab": 1,
"real_type": 0,
"home_page_list": []
}
  部分代码如下
   params = {
'__biz': biz,
'uin': uin,
'key': key,
'offset': offset,
'count': count,
'action': 'getmsg',
'f': 'json'
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
}
response = requests.get(url=url, params=params, headers=headers)
resp_json = response.json()
if resp_json.get('errmsg') == 'ok':
resp_json = response.json()
# 是否还有分页数据, 用于判断return的值
can_msg_continue = resp_json['can_msg_continue']
# 当前分页文章数
msg_count = resp_json['msg_count']
general_msg_list = json.loads(resp_json['general_msg_list'])
list = general_msg_list.get('list')
print(list, "**************")
  最后打印的列表是官方帐户的文章信息详细信息. 包括标题(标题),摘要(摘要),文章地址(content_url),阅读源地址(source_url),封面图像(封面),作者(作者)等...
  输出结果如下:
  [{
"comm_msg_info": {
"id": 1000000038,
"type": 49,
"datetime": 1560474000,
"fakeid": "3881067844",
"status": 2,
"content": ""
},
"app_msg_ext_info": {
"title": "入门爬虫,这一篇就够了!!!",
"digest": "入门爬虫,这一篇就够了!!!",
"content": "",
"fileid": 0,
"content_url": "http:XXXXXX",
"source_url": "",
"cover": "I5kME6BVXeLibZDUhsiaEYiaX7zOoibxa9sb4stIwrfuqID5ttmiaoVAFyxKF6IjOCyl22vg8n2NPv98ibow\\/0?wx_fmt=jpeg",
"subtype": 9,
"is_multi": 0,
"multi_app_msg_item_list": [],
"author": "Python3X",
"copyright_stat": 11,
"duration": 0,
"del_flag": 1,
"item_show_type": 0,
"audio_fileid": 0,
"play_url": "",
"malicious_title_reason_id": 0,
"malicious_content_type": 0
}
},{...},{...},{...},{...},{...},{...},{...},{...},{...}]
  获取数据后,可以将其保存在数据库中或将文章保存在PDF中.
  1,保存在Mongo中
  # Mongo配置
conn = MongoClient('127.0.0.1', 27017)
db = conn.wx #连接wx数据库,没有则自动创建
mongo_wx = db.article #使用article集合,没有则自动创建
for i in list:
app_msg_ext_info = i['app_msg_ext_info']
# 标题
title = app_msg_ext_info['title']
# 文章地址
content_url = app_msg_ext_info['content_url']
# 封面图
cover = app_msg_ext_info['cover']
# 发布时间
datetime = i['comm_msg_info']['datetime']
datetime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(datetime))
mongo_wx.insert({
'title': title,
'content_url': content_url,
'cover': cover,
'datetime': datetime
})
  结果如下
  
  2. 导入PDF文件
  在Python3中处理PDF的常用库包括python-pdf和pdfkit. 我使用pdfkit模块导出pdf文件.
  pdfkit是Wkhtmltopdf工具包的软件包类,因此需要安装Wkhtmltopdf才能使用它.
  有权下载与操作系统匹配的工具包.
  
  实现代码也相对简单,只需要传入导入文件的URL即可.
  安装pdfkit库
  pip3 install pdfkit -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
  import pdfkit
pdfkit.from_url('公众号文章地址', 'out.pdf')
  运行后成功导出pdf文件.
  
  完整代码 查看全部

  Python入门学习教程: 50行Python代码,教您获得所有正式帐户的文章
  今天的Python入门学习教程主要告诉您如何获取官方帐户的所有文章!
  在阅读官方帐户的文章时,我们通常会遇到一个问题-阅读历史文章的经验不好.
  我们知道,有两种常见的爬网官方帐户的方法: 通过搜狗搜索获得它. 缺点是只能获取最新的十篇文章. 通过微信官方账号的物料管理获取官方账号. 缺点是您需要申请自己的官方帐户.
  
  今天,我们将介绍一种通过在PC端捕获微信来获取官方帐户文章的方法. 与其他方法相比,它非常方便.
  
  
  如上图所示,我们通过数据包捕获工具获得了微信网络信息请求. 我们发现,每次下拉列表中的文章时,我们都会请求/ mp / xxx(官方帐户不允许添加首页链接,xxx表示profile_ext).
  经过多次测试和分析,使用了以下参数
  数据如下
  {
"ret": 0,
"errmsg": "ok", # 请求状态
"msg_count": 10, # 信息条数
"can_msg_continue": 1, # 是否还可以继续获取,1代表可以。0代表不可以,也就是最后一页
"general_msg_list": "{"list":[]}", # 公众号文本信息
"next_offset": 20,
"video_count": 1,
"use_video_tab": 1,
"real_type": 0,
"home_page_list": []
}
  部分代码如下
   params = {
'__biz': biz,
'uin': uin,
'key': key,
'offset': offset,
'count': count,
'action': 'getmsg',
'f': 'json'
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
}
response = requests.get(url=url, params=params, headers=headers)
resp_json = response.json()
if resp_json.get('errmsg') == 'ok':
resp_json = response.json()
# 是否还有分页数据, 用于判断return的值
can_msg_continue = resp_json['can_msg_continue']
# 当前分页文章数
msg_count = resp_json['msg_count']
general_msg_list = json.loads(resp_json['general_msg_list'])
list = general_msg_list.get('list')
print(list, "**************")
  最后打印的列表是官方帐户的文章信息详细信息. 包括标题(标题),摘要(摘要),文章地址(content_url),阅读源地址(source_url),封面图像(封面),作者(作者)等...
  输出结果如下:
  [{
"comm_msg_info": {
"id": 1000000038,
"type": 49,
"datetime": 1560474000,
"fakeid": "3881067844",
"status": 2,
"content": ""
},
"app_msg_ext_info": {
"title": "入门爬虫,这一篇就够了!!!",
"digest": "入门爬虫,这一篇就够了!!!",
"content": "",
"fileid": 0,
"content_url": "http:XXXXXX",
"source_url": "",
"cover": "I5kME6BVXeLibZDUhsiaEYiaX7zOoibxa9sb4stIwrfuqID5ttmiaoVAFyxKF6IjOCyl22vg8n2NPv98ibow\\/0?wx_fmt=jpeg",
"subtype": 9,
"is_multi": 0,
"multi_app_msg_item_list": [],
"author": "Python3X",
"copyright_stat": 11,
"duration": 0,
"del_flag": 1,
"item_show_type": 0,
"audio_fileid": 0,
"play_url": "",
"malicious_title_reason_id": 0,
"malicious_content_type": 0
}
},{...},{...},{...},{...},{...},{...},{...},{...},{...}]
  获取数据后,可以将其保存在数据库中或将文章保存在PDF中.
  1,保存在Mongo中
  # Mongo配置
conn = MongoClient('127.0.0.1', 27017)
db = conn.wx #连接wx数据库,没有则自动创建
mongo_wx = db.article #使用article集合,没有则自动创建
for i in list:
app_msg_ext_info = i['app_msg_ext_info']
# 标题
title = app_msg_ext_info['title']
# 文章地址
content_url = app_msg_ext_info['content_url']
# 封面图
cover = app_msg_ext_info['cover']
# 发布时间
datetime = i['comm_msg_info']['datetime']
datetime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(datetime))
mongo_wx.insert({
'title': title,
'content_url': content_url,
'cover': cover,
'datetime': datetime
})
  结果如下
  
  2. 导入PDF文件
  在Python3中处理PDF的常用库包括python-pdf和pdfkit. 我使用pdfkit模块导出pdf文件.
  pdfkit是Wkhtmltopdf工具包的软件包类,因此需要安装Wkhtmltopdf才能使用它.
  有权下载与操作系统匹配的工具包.
  
  实现代码也相对简单,只需要传入导入文件的URL即可.
  安装pdfkit库
  pip3 install pdfkit -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
  import pdfkit
pdfkit.from_url('公众号文章地址', 'out.pdf')
  运行后成功导出pdf文件.
  
  完整代码

福利:微信公众号文章“号内搜”新功能玩法

采集交流优采云 发表了文章 • 0 个评论 • 349 次浏览 • 2020-08-31 05:46 • 来自相关话题

  微信公众号文章“号码搜索”新功能玩法
  
  01官方帐户文章增加了“搜索”组件功能
  从今天开始的Xida Puben,用户可以直接在文章中搜索官方帐户历史记录新闻!什么也不要说,只看图片即可.
  
  
  如图所示,官方帐户文章可以具有内置的“搜索”组件. 该组件的左上角标有正式帐户的头像和指导词“推荐的正式帐户搜索”. 单击后,用户将进入搜索界面.
  正式帐户“推荐的搜索关键字”显示在搜索框下方. 用户可以根据需要在搜索框中输入任何关键字,也可以单击推荐的关键字进行搜索.
  通常,此新功能可以帮助用户快速检索帐户中的相关内容,这等效于内置在官方帐户历史记录页面中的“在帐户中搜索”条目. 不同之处在于该路径要浅得多. 更方便.
  毕竟,此功能如何工作?
  打开官方帐户后台编辑器页面,您将在页面顶部的菜单栏中看到新添加的“搜索”组件,单击以插入设置.
  
  只能为一篇文章创建一个搜索组件. 您最多可以设置6个搜索关键字. 拖放最右边的“三栏”图标以对关键字进行排序. 具体效果可在左侧视图的“图案预览”中找到.
  
  此外,先前设置的“历史搜索字词”将显示在关键字组下,以帮助操作员更好地设置它们. 点击“放大镜”图标以查看关键字搜索结果的预览.
  经过全面的体验,果酱女孩只想大声说: 这次微信终于不乏味了! (这就像一个梦,当我醒来时我仍然感动……)
  除了在文章中添加了新的“搜索”组件外,历史消息页面上隐藏的“数字内搜索”条目也已更改.
  1. “搜索范围”选项已添加到搜索内容中,下面有两个“无限”和“最近阅读”范围;
  2. 除了“按时间排序”之外,搜索结果还按“按阅读量排序”排序.
  02官方帐户搜索优化有什么影响?
  事实上,早在2017年,在最新版本的ios 6.5.6中,“帐户内搜索”功能已在官方帐户历史记录消息页面上启动,但由于入口不明显,实际上许多用户不知道该操作仍然可用.
  运营商不太可能希望增加用户对过去文章的浏览. 但是新功能的出现是另一种说法.
  1. 它有助于培养用户对官方帐户的搜索习惯
  现在,您可以为每个文章添加一个搜索框,条目会变浅,并且用户的操作路径也会缩短. 经过一段时间的指导,用户可以养成独立单击和搜索的习惯,这有助于他们更方便地获取所需的信息,另一方面,这也有助于增加官方帐户的粘性.
  目前,官方帐户背景不提供已设置关键字的点击数据. 将来会有相关数据来帮助运营商更好地计划主题选择吗?值得期待.
  2,帮助官方帐户整理内容
  文章中的搜索框最多可以收录6个关键字,这意味着操作员需要从他们最感兴趣或对读者最感兴趣的内容中提取关键字.
  如果您通常对内容指导有计划,这并不困难;如果您害怕编写所有内容,那么可能很难考虑关键字.
  如果您想突出显示自己的产品或服务,还可以设置关键字作为指导以加深用户的印象. 这样看来,新添加的搜索框是一个不错的广告牌. 装饰方式取决于个人.
  03操作员应如何充分利用此入口?
  1. 把它放在文章的开头,以吸引用户点击
  最高位置始终是最引人注目的,尤其是这是一项新功能. 应该注意的是,顶部的横幅图像不应太复杂,否则可能会使搜索框的光线模糊. 换句话说,它就像一个导航栏.
  如果您不知道要设置什么关键字,则可以参考后台的[Message Analysis]-[Message Keyword]数据,此数据分析将计算用户在后台答复的关键字频率TOP200. 查看全部

  微信公众号文章“号码搜索”新功能玩法
  
  01官方帐户文章增加了“搜索”组件功能
  从今天开始的Xida Puben,用户可以直接在文章中搜索官方帐户历史记录新闻!什么也不要说,只看图片即可.
  
  
  如图所示,官方帐户文章可以具有内置的“搜索”组件. 该组件的左上角标有正式帐户的头像和指导词“推荐的正式帐户搜索”. 单击后,用户将进入搜索界面.
  正式帐户“推荐的搜索关键字”显示在搜索框下方. 用户可以根据需要在搜索框中输入任何关键字,也可以单击推荐的关键字进行搜索.
  通常,此新功能可以帮助用户快速检索帐户中的相关内容,这等效于内置在官方帐户历史记录页面中的“在帐户中搜索”条目. 不同之处在于该路径要浅得多. 更方便.
  毕竟,此功能如何工作?
  打开官方帐户后台编辑器页面,您将在页面顶部的菜单栏中看到新添加的“搜索”组件,单击以插入设置.
  
  只能为一篇文章创建一个搜索组件. 您最多可以设置6个搜索关键字. 拖放最右边的“三栏”图标以对关键字进行排序. 具体效果可在左侧视图的“图案预览”中找到.
  
  此外,先前设置的“历史搜索字词”将显示在关键字组下,以帮助操作员更好地设置它们. 点击“放大镜”图标以查看关键字搜索结果的预览.
  经过全面的体验,果酱女孩只想大声说: 这次微信终于不乏味了! (这就像一个梦,当我醒来时我仍然感动……)
  除了在文章中添加了新的“搜索”组件外,历史消息页面上隐藏的“数字内搜索”条目也已更改.
  1. “搜索范围”选项已添加到搜索内容中,下面有两个“无限”和“最近阅读”范围;
  2. 除了“按时间排序”之外,搜索结果还按“按阅读量排序”排序.
  02官方帐户搜索优化有什么影响?
  事实上,早在2017年,在最新版本的ios 6.5.6中,“帐户内搜索”功能已在官方帐户历史记录消息页面上启动,但由于入口不明显,实际上许多用户不知道该操作仍然可用.
  运营商不太可能希望增加用户对过去文章的浏览. 但是新功能的出现是另一种说法.
  1. 它有助于培养用户对官方帐户的搜索习惯
  现在,您可以为每个文章添加一个搜索框,条目会变浅,并且用户的操作路径也会缩短. 经过一段时间的指导,用户可以养成独立单击和搜索的习惯,这有助于他们更方便地获取所需的信息,另一方面,这也有助于增加官方帐户的粘性.
  目前,官方帐户背景不提供已设置关键字的点击数据. 将来会有相关数据来帮助运营商更好地计划主题选择吗?值得期待.
  2,帮助官方帐户整理内容
  文章中的搜索框最多可以收录6个关键字,这意味着操作员需要从他们最感兴趣或对读者最感兴趣的内容中提取关键字.
  如果您通常对内容指导有计划,这并不困难;如果您害怕编写所有内容,那么可能很难考虑关键字.
  如果您想突出显示自己的产品或服务,还可以设置关键字作为指导以加深用户的印象. 这样看来,新添加的搜索框是一个不错的广告牌. 装饰方式取决于个人.
  03操作员应如何充分利用此入口?
  1. 把它放在文章的开头,以吸引用户点击
  最高位置始终是最引人注目的,尤其是这是一项新功能. 应该注意的是,顶部的横幅图像不应太复杂,否则可能会使搜索框的光线模糊. 换句话说,它就像一个导航栏.
  如果您不知道要设置什么关键字,则可以参考后台的[Message Analysis]-[Message Keyword]数据,此数据分析将计算用户在后台答复的关键字频率TOP200.

微信文章爬虫实现方式.docx

采集交流优采云 发表了文章 • 0 个评论 • 171 次浏览 • 2020-08-28 06:02 • 来自相关话题

  微信文章爬虫实现方式.docx
  文档介绍:
  微信文章爬虫实现方式
  如今越来越多的优质内容发布在微信公众号中,对那些内容,有些同事会有采集下来的需求,下面为你们介绍使用优采云爬虫工具去抓取采集微信文章信息。
  本文将以搜狗陌陌文章为例,介绍使用优采云采集网页文章正文的技巧。文章正文里通常包括文本和图片两种。本文将采集文章正文中的文本+图片URL。
  将采集以下数组:文章标题、时间、来源和正文(正文中的所有文本,将合并到一个excel单元格中,将使用到“自定义数据合并方法”功能,请你们注意)。同时,采集文章正文中的文本+图片URL,将用到“判断条件”,“判断条件”的使用,有很多须要注意的地方。以下两个教程,大家可先熟悉一下。
  “自定义数据合并方法”详解教程:
  orialdetail-1/zdyhb_7.html
  “判断条件”详解教程:
  orialdetail-1/judge.html
  采集网站:
  使用功能点:
  分页列表信息采集
  orial/fylb-70.aspx?t=1
  Xpath
  rch?query=XPath
  AJAX点击和翻页
  orial/ajaxdjfy_7.aspx?t=1
  判断条件
  orialdetail-1/judge.html
  AJAX滚动
  orialdetail-1/ajgd_7.html
  步骤1:创建采集任务
  1)进入主界面,选择“自定义模式”
  微信文章爬虫实现方式步骤1
  2)将要采集的网址URL复制粘贴到网站输入框中,点击“保存网址”
  微信文章爬虫实现方式步骤2
  步骤2:创建翻页循环
  在页面右上角,打开“流程”,以诠释出“流程设计器”和“定制当前操作”两个蓝筹股。网页打开后,默认显示“热门”文章。下拉页面,找到并点击“加载更多内容”按钮,在操作提示框中,选择“更多操作”
  微信文章爬虫实现方式步骤3
  选择“循环点击单个元素”,以创建一个翻页循环
  微信文章爬虫实现方式步骤4
  由于此网页涉及Ajax技术,我们须要进行一些中级选项的设置。选中“点击元素”步骤,打开“高级选项”,勾选“Ajax加载数据”,设置时间为“2秒”
  微信文章爬虫实现方式步骤5
  注:AJAX即延时加载、异步更新的一种脚本技术,通过在后台与服务器进行少量数据交换,可以在不重新加载整个网页的情况下,对网页的某部份进行更新。
  表现特点:a、点击网页中某个选项时,大部分网站的网址不会改变;b、网页不是完全加载,只是局部进行了数据加载,有所变化。 查看全部

  微信文章爬虫实现方式.docx
  文档介绍:
  微信文章爬虫实现方式
  如今越来越多的优质内容发布在微信公众号中,对那些内容,有些同事会有采集下来的需求,下面为你们介绍使用优采云爬虫工具去抓取采集微信文章信息。
  本文将以搜狗陌陌文章为例,介绍使用优采云采集网页文章正文的技巧。文章正文里通常包括文本和图片两种。本文将采集文章正文中的文本+图片URL。
  将采集以下数组:文章标题、时间、来源和正文(正文中的所有文本,将合并到一个excel单元格中,将使用到“自定义数据合并方法”功能,请你们注意)。同时,采集文章正文中的文本+图片URL,将用到“判断条件”,“判断条件”的使用,有很多须要注意的地方。以下两个教程,大家可先熟悉一下。
  “自定义数据合并方法”详解教程:
  orialdetail-1/zdyhb_7.html
  “判断条件”详解教程:
  orialdetail-1/judge.html
  采集网站:
  使用功能点:
  分页列表信息采集
  orial/fylb-70.aspx?t=1
  Xpath
  rch?query=XPath
  AJAX点击和翻页
  orial/ajaxdjfy_7.aspx?t=1
  判断条件
  orialdetail-1/judge.html
  AJAX滚动
  orialdetail-1/ajgd_7.html
  步骤1:创建采集任务
  1)进入主界面,选择“自定义模式”
  微信文章爬虫实现方式步骤1
  2)将要采集的网址URL复制粘贴到网站输入框中,点击“保存网址”
  微信文章爬虫实现方式步骤2
  步骤2:创建翻页循环
  在页面右上角,打开“流程”,以诠释出“流程设计器”和“定制当前操作”两个蓝筹股。网页打开后,默认显示“热门”文章。下拉页面,找到并点击“加载更多内容”按钮,在操作提示框中,选择“更多操作”
  微信文章爬虫实现方式步骤3
  选择“循环点击单个元素”,以创建一个翻页循环
  微信文章爬虫实现方式步骤4
  由于此网页涉及Ajax技术,我们须要进行一些中级选项的设置。选中“点击元素”步骤,打开“高级选项”,勾选“Ajax加载数据”,设置时间为“2秒”
  微信文章爬虫实现方式步骤5
  注:AJAX即延时加载、异步更新的一种脚本技术,通过在后台与服务器进行少量数据交换,可以在不重新加载整个网页的情况下,对网页的某部份进行更新。
  表现特点:a、点击网页中某个选项时,大部分网站的网址不会改变;b、网页不是完全加载,只是局部进行了数据加载,有所变化。

微信公众号文章爬取

采集交流优采云 发表了文章 • 0 个评论 • 226 次浏览 • 2020-08-28 03:12 • 来自相关话题

  微信公众号文章爬取
  哈哈,终于找到一个可以一键获取所有公众号上面的文章了,虽然比较笨,但是先凑活着,毕竟还破解不了登陆。
  参考链接:
  第一步:先注册一个公众号
  注册以后登陆到主页,找到这个素材管理
  
  然后你会看见下边这个页面
  
  点击这个绿色箭头指向的这个链接
  
  记得打开调试工具
  然后搜索你想爬取的公众号
  
  这个恳求会返回我们搜索到的公众号,我们要的公众号也在这个列表上面,假如在第一个
  
  我们须要这个fake-id来标记这个公众号
  接下选中,然后点一下
  
  然后文章列表就下来了
  整个过程就须要token,公众号名子,还有cookie了
  最后直接上代码了
  # -*- coding: utf-8 -*-
import pymysql as pymysql
from fake_useragent import UserAgent
import requests
import json
from retrying import retry
@retry(stop_max_attempt_number=5)
def get_author_list():
"""
获取搜索到的公众号列表
:return:
"""
global s
url = "https://mp.weixin.qq.com/cgi-b ... ry%3D{}&token={}&lang=zh_CN&f=json&ajax=1".format(
name, token)
try:
response = s.get(url, headers=headers, cookies=cookie)
text = json.loads(response.text)
# print('一共查询出来{}个公众号'.format(text['total']))
return text
except Exception as e:
print(e)
reset_parmas()
@retry(stop_max_attempt_number=5)
def get_first_author_params(text):
"""
获取单个公众号的参数
:param text: 前面搜索获取的公众号列表
:return:fake_id公众号id, text请求公众号详情的相应内容
"""
fake_id = text['list'][0] # 一般第一个就是咱们需要的,所以取第一个
# print(text['list'][0])
url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin=0&count=5&fakeid={}&type=9&query=&token={}&lang=zh_CN&f=json&ajax=1'.format(fake_id['fakeid'], token)
response = s.get(url, headers=headers, cookies=cookie)
try:
text1 = json.loads(response.text)
return text1, fake_id
except Exception as e:
print(e)
reset_parmas()
@retry(stop_max_attempt_number=5)
def get_title_url(text, fake_id):
"""
得到公众号的标题和链接
:param text:
:param fake_id:
:return:
"""
print(text)
num = int(text['app_msg_cnt'])
if num % 5 > 0:
num = num // 5 + 1
for i in range(num):
# token begin:参数传入
url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin={}&count=5&fakeid={}&type=9&query=&token={}&lang=zh_CN&f=json&ajax=1'.format(str(i * 5),fake_id['fakeid'], token,)
try:
response = s.get(url, headers=headers, cookies=cookie)
text = json.loads(response.text)
print(text)
artile_list = text['app_msg_list']
for artile in artile_list:
print('标题:{}'.format(artile['title']))
print('标题链接:{}'.format(artile['link']))
save_mysql(name, artile['title'], artile['link'])
except Exception as e:
print(e)
reset_parmas()
def save_mysql(name, title, url):
"""
保存数据到数据库
:param name: 作者名字
:param title:文章标题
:param url: 文章链接
:return:
"""
try:
sql = """INSERT INTO title_url(author_name, title, url) values ('{}', '{}', '{}')""".format(name, title, url)
conn.ping(reconnect=False)
cur.execute(sql)
conn.commit()
except Exception as e:
print(e)
def reset_parmas():
"""
失效后重新输入参数
:return:
"""
global name, token, s, cookie, headers
name = input("请输入你要查看的公众号名字: ")
token = input("请输入你当前登录自己公众号的token: ")
cookies = input("请输入当前页面的cookie: ")
s = requests.session()
cookie = {'cookie': cookies}
headers = {
"User-Agent": UserAgent().random,
"Host": "mp.weixin.qq.com",
}
def run():
reset_parmas()
text = get_author_list()
text1, fake_id = get_first_author_params(text)
get_title_url(text1, fake_id)
run()
  需要说明一下,数据库自己连我都不上代码了
  还有就是似乎插口更新的频繁,所以你只须要弄懂我的代码的逻辑就可以了
  OK 查看全部

  微信公众号文章爬取
  哈哈,终于找到一个可以一键获取所有公众号上面的文章了,虽然比较笨,但是先凑活着,毕竟还破解不了登陆。
  参考链接:
  第一步:先注册一个公众号
  注册以后登陆到主页,找到这个素材管理
  
  然后你会看见下边这个页面
  
  点击这个绿色箭头指向的这个链接
  
  记得打开调试工具
  然后搜索你想爬取的公众号
  
  这个恳求会返回我们搜索到的公众号,我们要的公众号也在这个列表上面,假如在第一个
  
  我们须要这个fake-id来标记这个公众号
  接下选中,然后点一下
  
  然后文章列表就下来了
  整个过程就须要token,公众号名子,还有cookie了
  最后直接上代码了
  # -*- coding: utf-8 -*-
import pymysql as pymysql
from fake_useragent import UserAgent
import requests
import json
from retrying import retry
@retry(stop_max_attempt_number=5)
def get_author_list():
"""
获取搜索到的公众号列表
:return:
"""
global s
url = "https://mp.weixin.qq.com/cgi-b ... ry%3D{}&token={}&lang=zh_CN&f=json&ajax=1".format(
name, token)
try:
response = s.get(url, headers=headers, cookies=cookie)
text = json.loads(response.text)
# print('一共查询出来{}个公众号'.format(text['total']))
return text
except Exception as e:
print(e)
reset_parmas()
@retry(stop_max_attempt_number=5)
def get_first_author_params(text):
"""
获取单个公众号的参数
:param text: 前面搜索获取的公众号列表
:return:fake_id公众号id, text请求公众号详情的相应内容
"""
fake_id = text['list'][0] # 一般第一个就是咱们需要的,所以取第一个
# print(text['list'][0])
url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin=0&count=5&fakeid={}&type=9&query=&token={}&lang=zh_CN&f=json&ajax=1'.format(fake_id['fakeid'], token)
response = s.get(url, headers=headers, cookies=cookie)
try:
text1 = json.loads(response.text)
return text1, fake_id
except Exception as e:
print(e)
reset_parmas()
@retry(stop_max_attempt_number=5)
def get_title_url(text, fake_id):
"""
得到公众号的标题和链接
:param text:
:param fake_id:
:return:
"""
print(text)
num = int(text['app_msg_cnt'])
if num % 5 > 0:
num = num // 5 + 1
for i in range(num):
# token begin:参数传入
url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin={}&count=5&fakeid={}&type=9&query=&token={}&lang=zh_CN&f=json&ajax=1'.format(str(i * 5),fake_id['fakeid'], token,)
try:
response = s.get(url, headers=headers, cookies=cookie)
text = json.loads(response.text)
print(text)
artile_list = text['app_msg_list']
for artile in artile_list:
print('标题:{}'.format(artile['title']))
print('标题链接:{}'.format(artile['link']))
save_mysql(name, artile['title'], artile['link'])
except Exception as e:
print(e)
reset_parmas()
def save_mysql(name, title, url):
"""
保存数据到数据库
:param name: 作者名字
:param title:文章标题
:param url: 文章链接
:return:
"""
try:
sql = """INSERT INTO title_url(author_name, title, url) values ('{}', '{}', '{}')""".format(name, title, url)
conn.ping(reconnect=False)
cur.execute(sql)
conn.commit()
except Exception as e:
print(e)
def reset_parmas():
"""
失效后重新输入参数
:return:
"""
global name, token, s, cookie, headers
name = input("请输入你要查看的公众号名字: ")
token = input("请输入你当前登录自己公众号的token: ")
cookies = input("请输入当前页面的cookie: ")
s = requests.session()
cookie = {'cookie': cookies}
headers = {
"User-Agent": UserAgent().random,
"Host": "mp.weixin.qq.com",
}
def run():
reset_parmas()
text = get_author_list()
text1, fake_id = get_first_author_params(text)
get_title_url(text1, fake_id)
run()
  需要说明一下,数据库自己连我都不上代码了
  还有就是似乎插口更新的频繁,所以你只须要弄懂我的代码的逻辑就可以了
  OK

用 Python 进行微信公众号开发

采集交流优采云 发表了文章 • 0 个评论 • 208 次浏览 • 2020-08-27 18:26 • 来自相关话题

  用 Python 进行微信公众号开发
  <p>本篇文章首先实现与公众号的对接,实现简单的回复文字、图片内容。下一篇会对接腾讯的AI平台,实现对照片的人脸检测与分析,分析年龄、性别、表情、魅力值等。
<a id="_2"></a>准备工作
  首先要注册一个公众号,这个很简单,我们到微信公众平台注册就可以了,选择个人订阅号就可以。但是如果可以认证的,我建议选择认证订阅号,因为未认证的号很多功能权限都没有。好了,话不多说进入正题。
  1. 配置公众号
打开公众号,在 开发->基本配置 页面填写内容。

下面说下需要填的内容,第一个URL要填的就是我们的服务地址,这个地址必须是外网地址并且是80端口。我们要本地开发时可以用 ngrok 解决。在ngrok.com官网下载。解压后就是一个exe程序。在当前目录下输入.\ngrok.exe http 80即可启动。启动后如下图所示,图片中网址就是我们需要的

然后我们复制红色方框里面的地址到微信的URL输入框中,比如我的就输入http://c9b15df5.ngrok.io/connect
后面这个connect是我自己的服务的地址。就是我们在程序开发中自己命名的一个请求路径,如果是新手的话建议按照我的来。不要改动,避免程序跑不起来。
第二个Token,自己想一个就行了,随便填,你可以当他为一个密码。
第三个自己生成就可以了。
最后一个消息加解密方式选择明文模式。配置到这里就结束了,我们先不要关闭这个页面,等我们Python程序验证部分写好以后点击页面下面的提交就可以了。现在点会报错的。
<a id="2_18"></a>2.接口验证部分代码编写
  查看官方文档,当我们点击配置页面的提交按钮时,微信后台会向我们配置的地址发送signature、timestamp、nonce、echostr四个信息,我们拿到这部分信息后通过哈希加密算法计算出(timestamp,nonce,token)的哈希值与微信发送的signature对比,如果相等则说明是微信后台的请求,然后把echostr返回,就表示验证成功。
  这一步,我们使用三个库,wechatpy-微信的Python SDK,falcon一个非常微小的Python Web框架,Waitress-一个Python WSGI服务器,当然在Linux上可以使用gunicorn代替waitress。通过pip install wechatpy[pycrypto]和pip install falcon,pip install waitress安装。代码如下,只需要把配置界面的token替换到代码里
import falcon
from falcon import uri
from wechatpy.utils import check_signature
from wechatpy.exceptions import InvalidSignatureException
class Connect(object):
def on_get(self, req, resp):
query_string = req.query_string
query_list = query_string.split('&')
b = {}
for i in query_list:
b[i.split('=')[0]] = i.split('=')[1]
try:
check_signature(token='这里填写配置界面你输入的token', signature=b['signature'], timestamp=b['timestamp'], nonce=b['nonce'])
resp.body = (b['echostr'])
except InvalidSignatureException:
pass
resp.status = falcon.HTTP_200
app = falcon.API()
connect = Connect()
app.add_route('/connect', connect)
</p>
  代码写好之后,我们在命令行输入 waitress-serve --port=80 connect:app在80端口启动我们的程序。启动后如下图,代表启动成功,这时候我们到陌陌的配置页面点击递交,会弹出递交成功消息框,代表我们成功接入陌陌
  
  简单说明以下里面代码,on_get函数接收陌陌发来的get恳求,并且通过query_string领到陌陌发送的参数,之后通过wechatpy的check_signature函数来校准。校验成功后把echostr返回给陌陌。
  3.发送文本信息给用户
  接入成功后,就可以回复用户的信息了。我们降低一个函数处理用户发送的消息,整体代码如下:
  import falcon
from wechatpy.utils import check_signature
from wechatpy.exceptions import InvalidSignatureException
from wechatpy import parse_message
from wechatpy.replies import TextReply, ImageReply
'''
遇到不懂的问题?Python学习交流群:821460695满足你的需求,资料都已经上传群文件,可以自行下载!
'''
class Connect(object):
def on_get(self, req, resp):
query_string = req.query_string
query_list = query_string.split('&')
b = {}
for i in query_list:
b[i.split('=')[0]] = i.split('=')[1]
try:
check_signature(token='xxxxx', signature=b['signature'], timestamp=b['timestamp'], nonce=b['nonce'])
resp.body = (b['echostr'])
except InvalidSignatureException:
pass
resp.status = falcon.HTTP_200
def on_post(self, req, resp):
xml = req.stream.read()
msg = parse_message(xml)
if msg.type == 'text':
reply = TextReply(content=msg.content, message=msg)
xml = reply.render()
resp.body = (xml)
resp.status = falcon.HTTP_200
app = falcon.API()
connect = Connect()
app.add_route('/connect', connect)
  我们导入了parse_message,TextReply,ImageReply函数。当领到用户消息时,判断是文本消息,就原貌返回给用户。现在我们启动脚本后,向公众号发送文本消息都会收到手动回复了。
  4. 发送图片信息给用户
  我们简单更改下on_post函数,使其除了能处理文本,也能处理图片信息。完整代码如下:
  import falcon
from wechatpy.utils import check_signature
from wechatpy.exceptions import InvalidSignatureException
from wechatpy import parse_message
from wechatpy.replies import TextReply, ImageReply
class Connect(object):
def on_get(self, req, resp):
query_string = req.query_string
query_list = query_string.split('&')
b = {}
for i in query_list:
b[i.split('=')[0]] = i.split('=')[1]
try:
check_signature(token='xxxxxxx', signature=b['signature'], timestamp=b['timestamp'], nonce=b['nonce'])
resp.body = (b['echostr'])
except InvalidSignatureException:
pass
resp.status = falcon.HTTP_200
def on_post(self, req, resp):
xml = req.stream.read()
msg = parse_message(xml)
if msg.type == 'text':
reply = TextReply(content=msg.content, message=msg)
xml = reply.render()
resp.body = (xml)
resp.status = falcon.HTTP_200
elif msg.type == 'image':
reply = ImageReply(media_id=msg.media_id, message=msg)
xml = reply.render()
resp.body = (xml)
resp.status = falcon.HTTP_200
app = falcon.API()
connect = Connect()
app.add_route('/connect', connect)
  我们在代码中加入了图片处理逻辑,如果是图片类型的消息,则把图片返回给用户。我们把图片发送给陌陌后台后,会手动生成一个media_id,我们发送这个media_id就可以了。
  效果图 查看全部

  用 Python 进行微信公众号开发
  <p>本篇文章首先实现与公众号的对接,实现简单的回复文字、图片内容。下一篇会对接腾讯的AI平台,实现对照片的人脸检测与分析,分析年龄、性别、表情、魅力值等。
<a id="_2"></a>准备工作
  首先要注册一个公众号,这个很简单,我们到微信公众平台注册就可以了,选择个人订阅号就可以。但是如果可以认证的,我建议选择认证订阅号,因为未认证的号很多功能权限都没有。好了,话不多说进入正题。
  1. 配置公众号
打开公众号,在 开发->基本配置 页面填写内容。

下面说下需要填的内容,第一个URL要填的就是我们的服务地址,这个地址必须是外网地址并且是80端口。我们要本地开发时可以用 ngrok 解决。在ngrok.com官网下载。解压后就是一个exe程序。在当前目录下输入.\ngrok.exe http 80即可启动。启动后如下图所示,图片中网址就是我们需要的

然后我们复制红色方框里面的地址到微信的URL输入框中,比如我的就输入http://c9b15df5.ngrok.io/connect
后面这个connect是我自己的服务的地址。就是我们在程序开发中自己命名的一个请求路径,如果是新手的话建议按照我的来。不要改动,避免程序跑不起来。
第二个Token,自己想一个就行了,随便填,你可以当他为一个密码。
第三个自己生成就可以了。
最后一个消息加解密方式选择明文模式。配置到这里就结束了,我们先不要关闭这个页面,等我们Python程序验证部分写好以后点击页面下面的提交就可以了。现在点会报错的。
<a id="2_18"></a>2.接口验证部分代码编写
  查看官方文档,当我们点击配置页面的提交按钮时,微信后台会向我们配置的地址发送signature、timestamp、nonce、echostr四个信息,我们拿到这部分信息后通过哈希加密算法计算出(timestamp,nonce,token)的哈希值与微信发送的signature对比,如果相等则说明是微信后台的请求,然后把echostr返回,就表示验证成功。
  这一步,我们使用三个库,wechatpy-微信的Python SDK,falcon一个非常微小的Python Web框架,Waitress-一个Python WSGI服务器,当然在Linux上可以使用gunicorn代替waitress。通过pip install wechatpy[pycrypto]和pip install falcon,pip install waitress安装。代码如下,只需要把配置界面的token替换到代码里
import falcon
from falcon import uri
from wechatpy.utils import check_signature
from wechatpy.exceptions import InvalidSignatureException
class Connect(object):
def on_get(self, req, resp):
query_string = req.query_string
query_list = query_string.split('&')
b = {}
for i in query_list:
b[i.split('=')[0]] = i.split('=')[1]
try:
check_signature(token='这里填写配置界面你输入的token', signature=b['signature'], timestamp=b['timestamp'], nonce=b['nonce'])
resp.body = (b['echostr'])
except InvalidSignatureException:
pass
resp.status = falcon.HTTP_200
app = falcon.API()
connect = Connect()
app.add_route('/connect', connect)
</p>
  代码写好之后,我们在命令行输入 waitress-serve --port=80 connect:app在80端口启动我们的程序。启动后如下图,代表启动成功,这时候我们到陌陌的配置页面点击递交,会弹出递交成功消息框,代表我们成功接入陌陌
  
  简单说明以下里面代码,on_get函数接收陌陌发来的get恳求,并且通过query_string领到陌陌发送的参数,之后通过wechatpy的check_signature函数来校准。校验成功后把echostr返回给陌陌。
  3.发送文本信息给用户
  接入成功后,就可以回复用户的信息了。我们降低一个函数处理用户发送的消息,整体代码如下:
  import falcon
from wechatpy.utils import check_signature
from wechatpy.exceptions import InvalidSignatureException
from wechatpy import parse_message
from wechatpy.replies import TextReply, ImageReply
'''
遇到不懂的问题?Python学习交流群:821460695满足你的需求,资料都已经上传群文件,可以自行下载!
'''
class Connect(object):
def on_get(self, req, resp):
query_string = req.query_string
query_list = query_string.split('&')
b = {}
for i in query_list:
b[i.split('=')[0]] = i.split('=')[1]
try:
check_signature(token='xxxxx', signature=b['signature'], timestamp=b['timestamp'], nonce=b['nonce'])
resp.body = (b['echostr'])
except InvalidSignatureException:
pass
resp.status = falcon.HTTP_200
def on_post(self, req, resp):
xml = req.stream.read()
msg = parse_message(xml)
if msg.type == 'text':
reply = TextReply(content=msg.content, message=msg)
xml = reply.render()
resp.body = (xml)
resp.status = falcon.HTTP_200
app = falcon.API()
connect = Connect()
app.add_route('/connect', connect)
  我们导入了parse_message,TextReply,ImageReply函数。当领到用户消息时,判断是文本消息,就原貌返回给用户。现在我们启动脚本后,向公众号发送文本消息都会收到手动回复了。
  4. 发送图片信息给用户
  我们简单更改下on_post函数,使其除了能处理文本,也能处理图片信息。完整代码如下:
  import falcon
from wechatpy.utils import check_signature
from wechatpy.exceptions import InvalidSignatureException
from wechatpy import parse_message
from wechatpy.replies import TextReply, ImageReply
class Connect(object):
def on_get(self, req, resp):
query_string = req.query_string
query_list = query_string.split('&')
b = {}
for i in query_list:
b[i.split('=')[0]] = i.split('=')[1]
try:
check_signature(token='xxxxxxx', signature=b['signature'], timestamp=b['timestamp'], nonce=b['nonce'])
resp.body = (b['echostr'])
except InvalidSignatureException:
pass
resp.status = falcon.HTTP_200
def on_post(self, req, resp):
xml = req.stream.read()
msg = parse_message(xml)
if msg.type == 'text':
reply = TextReply(content=msg.content, message=msg)
xml = reply.render()
resp.body = (xml)
resp.status = falcon.HTTP_200
elif msg.type == 'image':
reply = ImageReply(media_id=msg.media_id, message=msg)
xml = reply.render()
resp.body = (xml)
resp.status = falcon.HTTP_200
app = falcon.API()
connect = Connect()
app.add_route('/connect', connect)
  我们在代码中加入了图片处理逻辑,如果是图片类型的消息,则把图片返回给用户。我们把图片发送给陌陌后台后,会手动生成一个media_id,我们发送这个media_id就可以了。
  效果图

微信公众号文章爬虫

采集交流优采云 发表了文章 • 0 个评论 • 264 次浏览 • 2020-08-27 08:38 • 来自相关话题

  微信公众号文章爬虫
  很多的微信公众号都提供了质量比较高的文章阅读,对于自己喜欢的微信公众号,所以想做个微信公众号爬虫,爬取相关公众号的所有文章。抓取公众号的所有的文章,需要获取两个比较重要的参数。一个是微信公众号的惟一ID(__biz)和获取单一公众号的文章权限值wap_sid2。接下来说一下思路。
  
  搜索结果
  //*[@id="sogou_vr_11002301_box_n"]/div/div[2]/p[1]/a
  http://mp.weixin.qq.com/profil ... QOYo6*w5VxrUgy7RbCsdkuzfFQ1RiSgM3i9buMZPrYzmOne6mJxCtW*g==
  
  只有10条文章达不到要求
   //其中biz值就是微信公众号的唯一id值。前面和后面省略了大部分代码;该段代码位于script标签里面;该代码还有最近10条文章的数据,如果单纯想获取最近10条,可以通过正则表达式来直接获取   var biz = "MzIwNDA1OTM4NQ==" || "";   var src = "3" ;    var ver = "1" ;    var timestamp = "1508003829" ;    var signature = "Eu9LOYSA47p6WE0mojhMtFR-gSr7zsQOYo6*w5VxrUgy7RbCsdkuzfFQ1RiSgM3i9buMZPrYzmOne6mJxCtW*g==" ;    var name="python6359"||"python";
  获取到微信公众号的id值以后,就是要获取wap_sid值(即单个微信公众号的文章权限值。)这个部份从陌陌客户端获取,接下来通过Fiddler抓包工具获取,如果不知道抓包工具的环境搭建,可以参考 fiddler抓取摩拜自行车数据包
  获取的wap_sid2和__biz值
  # -*- coding: utf-8 -*- import scrapy from scrapy import Request from .mongo import MongoOperate import json from .settings import * class DataSpider(scrapy.Spider):     name = "data"     allowed_domains = ["mp.weixin.qq.com"]     start_urls = [&#39;https://mp.weixin.qq.com/&#39;]     count=10     url="https://mp.weixin.qq.com/mp/pr ... iz%3D{biz}&f=json&offset={index}&count=10&is_ok=1&scene=124&uin=777&key=777&pass_ticket=ULeI%2BILkTLA2IpuIDqbIla4jG6zBTm1jj75UIZCgIUAFzOX29YQeTm5UKYuXU6JY&wxtoken=&appmsg_token=925_%252B4oEmoVo6AFzfOotcwPrPnBvKbEdnLNzg5mK8Q~~&x5=0&f=json"     def start_requests(self):       MongoObj=MongoOperate(MONGO_URI,MONGO_DATABASE,MONGO_USER,MONGO_PASS,RESPONSE)         MongoObj.connect()         items=MongoObj.finddata()         for item in items:             headers={                 &#39;Accept-Encoding&#39;:&#39;gzip, deflate&#39;,                 &#39;Connection&#39;:&#39;keep-alive&#39;,                 &#39;Accept&#39;:&#39;*/*&#39;,                 &#39;User-Agent&#39;: &#39;Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_1 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Mobile/14A403 MicroMessenger/6.5.18 NetType/WIFI Language/zh_CN&#39;,                 &#39;Accept-Language&#39;: &#39;zh-cn&#39;,                 &#39;X-Requested-With&#39;: &#39;XMLHttpRequest&#39;,                 &#39;X-WECHAT-KEY&#39;: &#39;62526065241838a5d44f7e7e14d5ffa3e87f079dc50a66e615fe9b6169c8fdde0f7b9f36f3897212092d73a3a223ffd21514b690dd8503b774918d8e86dfabbf46d1aedb66a2c7d29b8cc4f017eadee6&#39;,                 &#39;X-WECHAT-UIN&#39;: &#39;MTU2MzIxNjQwMQ%3D%3D&#39;,                 &#39;Cookie&#39;:&#39;;wxuin=1563216401;pass_ticket=oQDl45NRtfvQIxv2j2pYDSOOeflIXU7V3x1TUaOTpi6SkMp2B3fJwF6TE40ATCpU;ua_id=Wz1u21T8nrdNEyNaAAAAAOcFaBcyz4SH5DoQIVDcnao=;pgv_pvid=7103943278;sd_cookie_crttime=1501115135519;sd_userid=8661501115135519;3g_guest_id=-8872936809911279616;tvfe_boss_uuid=8ed9ed1b3a838836;mobileUV=1_15c8d374ca8_da9c8;pgv_pvi=8005854208&#39;             }             biz=item["biz"]       #主要验证是wap_sid2;pass_ticket不一样无所谓             headers["Cookie"]="wap_sid2="+item["wap_sid2"]+headers["Cookie"]             yield Request(url=self.url.format(biz=biz,index="10"),headers=headers,callback=self.parse,dont_filter=True,meta={"biz":biz,"headers":headers},)     def parse(self, response):         biz=response.request.meta["biz"]         headers=response.request.meta["headers"]         resText=json.loads(response.text)         print(resText)         list=json.loads(resText["general_msg_list"])         print(list)         yield list         if resText["can_msg_continue"]==1:             self.count=self.count+10             yield Request(url=self.url.format(biz=biz,index=str(self.count)),headers=headers,callback=self.parse,dont_filter=True,meta={"biz":biz,"headers":headers})         else:             print("end")
  
  最终捕获的数据
  static function OnBeforeResponse(oSession: Session) {       if (oSession.HostnameIs("mp.weixin.qq.com") && oSession.uriContains("/mp/profile_ext?action=home")) {           oSession["ui-color"] = "orange";           oSession.SaveResponse("C:\\Users\\Administrator\\Desktop\\2.txt",false);           //oSession.SaveResponseBody("C:\\Users\\Administrator\\Desktop\\1.txt")       }       if (m_Hide304s && oSession.responseCode == 304) {           oSession["ui-hide"] = "true";       }   }
  响应头
  
  哈哈
  源代码的readme.md文件介绍使用的方法,需要可以直接到github里面获取源码,github源码地址;喜欢的给个star哟。
  其他类似文章
  作者:Evtion
  链接: 查看全部

  微信公众号文章爬虫
  很多的微信公众号都提供了质量比较高的文章阅读,对于自己喜欢的微信公众号,所以想做个微信公众号爬虫,爬取相关公众号的所有文章。抓取公众号的所有的文章,需要获取两个比较重要的参数。一个是微信公众号的惟一ID(__biz)和获取单一公众号的文章权限值wap_sid2。接下来说一下思路。
  
  搜索结果
  //*[@id="sogou_vr_11002301_box_n"]/div/div[2]/p[1]/a
  http://mp.weixin.qq.com/profil ... QOYo6*w5VxrUgy7RbCsdkuzfFQ1RiSgM3i9buMZPrYzmOne6mJxCtW*g==
  
  只有10条文章达不到要求
   //其中biz值就是微信公众号的唯一id值。前面和后面省略了大部分代码;该段代码位于script标签里面;该代码还有最近10条文章的数据,如果单纯想获取最近10条,可以通过正则表达式来直接获取   var biz = "MzIwNDA1OTM4NQ==" || "";   var src = "3" ;    var ver = "1" ;    var timestamp = "1508003829" ;    var signature = "Eu9LOYSA47p6WE0mojhMtFR-gSr7zsQOYo6*w5VxrUgy7RbCsdkuzfFQ1RiSgM3i9buMZPrYzmOne6mJxCtW*g==" ;    var name="python6359"||"python";
  获取到微信公众号的id值以后,就是要获取wap_sid值(即单个微信公众号的文章权限值。)这个部份从陌陌客户端获取,接下来通过Fiddler抓包工具获取,如果不知道抓包工具的环境搭建,可以参考 fiddler抓取摩拜自行车数据包
  获取的wap_sid2和__biz值
  # -*- coding: utf-8 -*- import scrapy from scrapy import Request from .mongo import MongoOperate import json from .settings import * class DataSpider(scrapy.Spider):     name = "data"     allowed_domains = ["mp.weixin.qq.com"]     start_urls = [&#39;https://mp.weixin.qq.com/&#39;]     count=10     url="https://mp.weixin.qq.com/mp/pr ... iz%3D{biz}&f=json&offset={index}&count=10&is_ok=1&scene=124&uin=777&key=777&pass_ticket=ULeI%2BILkTLA2IpuIDqbIla4jG6zBTm1jj75UIZCgIUAFzOX29YQeTm5UKYuXU6JY&wxtoken=&appmsg_token=925_%252B4oEmoVo6AFzfOotcwPrPnBvKbEdnLNzg5mK8Q~~&x5=0&f=json"     def start_requests(self):       MongoObj=MongoOperate(MONGO_URI,MONGO_DATABASE,MONGO_USER,MONGO_PASS,RESPONSE)         MongoObj.connect()         items=MongoObj.finddata()         for item in items:             headers={                 &#39;Accept-Encoding&#39;:&#39;gzip, deflate&#39;,                 &#39;Connection&#39;:&#39;keep-alive&#39;,                 &#39;Accept&#39;:&#39;*/*&#39;,                 &#39;User-Agent&#39;: &#39;Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_1 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Mobile/14A403 MicroMessenger/6.5.18 NetType/WIFI Language/zh_CN&#39;,                 &#39;Accept-Language&#39;: &#39;zh-cn&#39;,                 &#39;X-Requested-With&#39;: &#39;XMLHttpRequest&#39;,                 &#39;X-WECHAT-KEY&#39;: &#39;62526065241838a5d44f7e7e14d5ffa3e87f079dc50a66e615fe9b6169c8fdde0f7b9f36f3897212092d73a3a223ffd21514b690dd8503b774918d8e86dfabbf46d1aedb66a2c7d29b8cc4f017eadee6&#39;,                 &#39;X-WECHAT-UIN&#39;: &#39;MTU2MzIxNjQwMQ%3D%3D&#39;,                 &#39;Cookie&#39;:&#39;;wxuin=1563216401;pass_ticket=oQDl45NRtfvQIxv2j2pYDSOOeflIXU7V3x1TUaOTpi6SkMp2B3fJwF6TE40ATCpU;ua_id=Wz1u21T8nrdNEyNaAAAAAOcFaBcyz4SH5DoQIVDcnao=;pgv_pvid=7103943278;sd_cookie_crttime=1501115135519;sd_userid=8661501115135519;3g_guest_id=-8872936809911279616;tvfe_boss_uuid=8ed9ed1b3a838836;mobileUV=1_15c8d374ca8_da9c8;pgv_pvi=8005854208&#39;             }             biz=item["biz"]       #主要验证是wap_sid2;pass_ticket不一样无所谓             headers["Cookie"]="wap_sid2="+item["wap_sid2"]+headers["Cookie"]             yield Request(url=self.url.format(biz=biz,index="10"),headers=headers,callback=self.parse,dont_filter=True,meta={"biz":biz,"headers":headers},)     def parse(self, response):         biz=response.request.meta["biz"]         headers=response.request.meta["headers"]         resText=json.loads(response.text)         print(resText)         list=json.loads(resText["general_msg_list"])         print(list)         yield list         if resText["can_msg_continue"]==1:             self.count=self.count+10             yield Request(url=self.url.format(biz=biz,index=str(self.count)),headers=headers,callback=self.parse,dont_filter=True,meta={"biz":biz,"headers":headers})         else:             print("end")
  
  最终捕获的数据
  static function OnBeforeResponse(oSession: Session) {       if (oSession.HostnameIs("mp.weixin.qq.com") && oSession.uriContains("/mp/profile_ext?action=home")) {           oSession["ui-color"] = "orange";           oSession.SaveResponse("C:\\Users\\Administrator\\Desktop\\2.txt",false);           //oSession.SaveResponseBody("C:\\Users\\Administrator\\Desktop\\1.txt")       }       if (m_Hide304s && oSession.responseCode == 304) {           oSession["ui-hide"] = "true";       }   }
  响应头
  
  哈哈
  源代码的readme.md文件介绍使用的方法,需要可以直接到github里面获取源码,github源码地址;喜欢的给个star哟。
  其他类似文章
  作者:Evtion
  链接:

如何进行微信公众号数据统计 微信公众号数据统计功略

采集交流优采云 发表了文章 • 0 个评论 • 370 次浏览 • 2020-08-26 12:24 • 来自相关话题

  如何进行微信公众号数据统计 微信公众号数据统计功略
  
  很多人在做微信公众号的时侯都是比较盲目的,因为她们不懂得微信公众号数据统计要怎样做,下面我们追随拓途数据一起来了解一下怎样进行微信公众号数据统计的相关资料吧。
  如何进行微信公众号数据统计步骤一
  用搜索引擎搜索“微信公众平台”,找到微信公众平台的官网。点击进去,找到登陆入口,登录网页版陌陌公众号。
  如何进行微信公众号数据统计步骤二
  进入微信公众号的主页。下拉页面,在两侧工具栏找到“统计剖析”,下面收录有不同种类的数据统计。
  
  如何进行微信公众号数据统计
  如何进行微信公众号数据统计步骤三
  用户剖析——新关注、取消关注、净增关注、累积关注。点击用户剖析,这里就是你的微信公众号人数粉丝的下降,有多少人是新降低的关注,有多少人取关,都在这里可以看见。如果你想愈发直观的看你的帐号粉丝变化数,就将页面往下拉,下面就是图文的剖析,曲线图还有具体的数字变化。
  如何进行微信公众号数据统计步骤四
  图文剖析——指的就是你发布的陌陌文章送达给多少人,有多少人阅读了有多少人点赞转发了,这个比较直观的看清晰。
  如何进行微信公众号数据统计步骤五
  菜单剖析——菜单剖析指的是你的微信公众号下边设置的菜单以及子菜单都有多少人点击,对这个数据的统计。页面往下拉同样也是曲线图以及具体的数字剖析和对比。
  
  如何进行微信公众号数据统计
  如何进行微信公众号数据统计步骤六
  消息剖析——指消息发送人数次数以及人均的数据,以及,消息发送人数跟今日一周的对比,送达人数的对比还有人均的数据。
  如何进行微信公众号数据统计步骤七
  点击一侧的消息关键词指的是用户回复的消息中出现的频度,比如说排第一的就是你们最近一个月回复最多的关键词,有利于我们剖析。下面还有一个插口剖析是关于技术层面,第三方绑定数据等的统计。
  如何进行微信公众号数据统计呢?相信有了拓途数据到这一份微信公众号数据统计功略以后,一定可以帮助你更好地进行微信公众号的数据统计工作哦! 查看全部

  如何进行微信公众号数据统计 微信公众号数据统计功略
  
  很多人在做微信公众号的时侯都是比较盲目的,因为她们不懂得微信公众号数据统计要怎样做,下面我们追随拓途数据一起来了解一下怎样进行微信公众号数据统计的相关资料吧。
  如何进行微信公众号数据统计步骤一
  用搜索引擎搜索“微信公众平台”,找到微信公众平台的官网。点击进去,找到登陆入口,登录网页版陌陌公众号。
  如何进行微信公众号数据统计步骤二
  进入微信公众号的主页。下拉页面,在两侧工具栏找到“统计剖析”,下面收录有不同种类的数据统计。
  
  如何进行微信公众号数据统计
  如何进行微信公众号数据统计步骤三
  用户剖析——新关注、取消关注、净增关注、累积关注。点击用户剖析,这里就是你的微信公众号人数粉丝的下降,有多少人是新降低的关注,有多少人取关,都在这里可以看见。如果你想愈发直观的看你的帐号粉丝变化数,就将页面往下拉,下面就是图文的剖析,曲线图还有具体的数字变化。
  如何进行微信公众号数据统计步骤四
  图文剖析——指的就是你发布的陌陌文章送达给多少人,有多少人阅读了有多少人点赞转发了,这个比较直观的看清晰。
  如何进行微信公众号数据统计步骤五
  菜单剖析——菜单剖析指的是你的微信公众号下边设置的菜单以及子菜单都有多少人点击,对这个数据的统计。页面往下拉同样也是曲线图以及具体的数字剖析和对比。
  
  如何进行微信公众号数据统计
  如何进行微信公众号数据统计步骤六
  消息剖析——指消息发送人数次数以及人均的数据,以及,消息发送人数跟今日一周的对比,送达人数的对比还有人均的数据。
  如何进行微信公众号数据统计步骤七
  点击一侧的消息关键词指的是用户回复的消息中出现的频度,比如说排第一的就是你们最近一个月回复最多的关键词,有利于我们剖析。下面还有一个插口剖析是关于技术层面,第三方绑定数据等的统计。
  如何进行微信公众号数据统计呢?相信有了拓途数据到这一份微信公众号数据统计功略以后,一定可以帮助你更好地进行微信公众号的数据统计工作哦!

如何制做精致的公众号文章排版?微信公众号排版如何弄!

采集交流优采云 发表了文章 • 0 个评论 • 150 次浏览 • 2020-08-26 04:20 • 来自相关话题

  如何制做精致的公众号文章排版?微信公众号排版如何弄!
  
  我们平常在公众号里阅读文章就会发觉,有些公众号的文章排版特别的精致、非常的协调,但是有些公众号的文章排版就是比较的零乱,哪怕你的内容太有价值,文章的排版不精致的话,也会影响用户的阅读体验。那么精巧的公众号文章排版究竟是如何制做的呢?接下来,营销圈就和你们分享下微信公众号排版如何弄的方式!
  第1:精美的公众号文章排版是如何制做下来的?
  精美的公众号文章排版都是通过一种工具实现的,这个就是微信编辑器,这个工具中有很多图文模板可以使我们进行套用,我们中意哪一个模板,直接在陌陌编辑器中直接编辑就可以了。当我们的图文编辑好了以后,那么可以直接复制到微信公众号的素材管理中就可以群发了。
  第2:公众号文章排版的时侯须要注意哪些?
  当我们使用公众号文章排版的时侯,有些功能是vip会员才可以使用的,当然了这个也是可以理解。大家选择的时侯,尽量的多用几个平台尝试下,选择适宜自己的。另外,营销圈须要提醒下,让我们想在陌陌图文中插入一些图文链接的时侯,记得须要插入早已群发过的图文地址,否则会群发失败的,这点谨记。
  第3:有哪些微信公众号排版工具推荐的?
  在互联网上有很多微信公众号排版的平台,就营销圈自身的尝试来看好用的却是没有几个,这里推荐一个常用的就是这个“135陌陌编辑器”,大家可以自行百度尝试下。
  90%的人又阅读以下文章:微信如何能够更新到最新版本?微信更新最新版本的方式! 怎么提升微信公众号文章的阅读量?这篇文章帮你提升30%的浏览量! 微信公众号怎样做营运企划?营销圈教你公众号营运企划! 微信公众号中的订阅号、服务号、企业号的区别在于那里? 微信公众平台如何使用?营销圈告诉你微信公众平台使用方式! 查看全部

  如何制做精致的公众号文章排版?微信公众号排版如何弄!
  
  我们平常在公众号里阅读文章就会发觉,有些公众号的文章排版特别的精致、非常的协调,但是有些公众号的文章排版就是比较的零乱,哪怕你的内容太有价值,文章的排版不精致的话,也会影响用户的阅读体验。那么精巧的公众号文章排版究竟是如何制做的呢?接下来,营销圈就和你们分享下微信公众号排版如何弄的方式!
  第1:精美的公众号文章排版是如何制做下来的?
  精美的公众号文章排版都是通过一种工具实现的,这个就是微信编辑器,这个工具中有很多图文模板可以使我们进行套用,我们中意哪一个模板,直接在陌陌编辑器中直接编辑就可以了。当我们的图文编辑好了以后,那么可以直接复制到微信公众号的素材管理中就可以群发了。
  第2:公众号文章排版的时侯须要注意哪些?
  当我们使用公众号文章排版的时侯,有些功能是vip会员才可以使用的,当然了这个也是可以理解。大家选择的时侯,尽量的多用几个平台尝试下,选择适宜自己的。另外,营销圈须要提醒下,让我们想在陌陌图文中插入一些图文链接的时侯,记得须要插入早已群发过的图文地址,否则会群发失败的,这点谨记。
  第3:有哪些微信公众号排版工具推荐的?
  在互联网上有很多微信公众号排版的平台,就营销圈自身的尝试来看好用的却是没有几个,这里推荐一个常用的就是这个“135陌陌编辑器”,大家可以自行百度尝试下。
  90%的人又阅读以下文章:微信如何能够更新到最新版本?微信更新最新版本的方式! 怎么提升微信公众号文章的阅读量?这篇文章帮你提升30%的浏览量! 微信公众号怎样做营运企划?营销圈教你公众号营运企划! 微信公众号中的订阅号、服务号、企业号的区别在于那里? 微信公众平台如何使用?营销圈告诉你微信公众平台使用方式!

公众号文章采集可以应用什么方式

采集交流优采云 发表了文章 • 0 个评论 • 296 次浏览 • 2020-08-26 00:46 • 来自相关话题

  公众号文章采集可以应用什么方式
  如今微信公众号早已对于人们十分熟悉了,并且许多行业都在借助微信公众号来做营销,而公众号最主要的营销方法就是图文,那么公众号文章采集有什么方式?下面由拓途数据说一下。
  
  公众号文章采集
  公众号文章标题应当如何写才吸引人
  1.标题党
  标题党就是给你制造一种震惊或则吸引力,然后点进来却发觉“货不对版”给心中引起一种落差,这类标题对于三四十岁的阿姨大叔比较好使。
  2.标新立异
  就是很难去明白的标题,具有深层的含意或则压根就看不懂说的是啥。谓独创新意,理论和他人不一样。通常指提出新的主张、见解或创造出新奇的款式。也指为了显示自己,故意显露自己的与众不同或则用往常不同的抒发方法来吸引人。
  3.繁杂重复
  标题又长又罗嗦,起标题的人恨不得把全篇文章的意思都说出来,字眼重复。
  公众号文章采集整理怎样进行 介绍下边实用的方式
  方案一:基于搜狗入口
  在网上能搜索到的公众号文章采集相关的信息来看来看,这是最多、最直接、也是最简单的一种方案。
  一般流程是:
  1、搜狗微信搜索入口进行公众号搜索。
  2、选取公众号步入公众号历史文章列表3、对文章内容进行解析入库。
  采集过于频繁的话,搜狗搜索和公众号历史文章列表访问就会出现验证码。直接采用通常的脚本采集是难以领到验证码的。这里可以使用无头浏览器来进行访问,通过对接打码平台识别验证码。无头浏览器可采用selenium。
  即便采用无头浏览器同样存在问题:
  1、效率低下(实际上就是在跑一个完整的浏览器来模拟人类操作)。
  2、网页资源浏览器加载难以控制,脚本对浏览器加载很难控制3、验证码识别也未能做到100%,中途太可能会打断抓取流程。
  如果坚持使用搜狗入口并想进行完美采集的话只有降低代理IP。顺便说一句,公开免费的IP地址就别想了,非常不稳定,而且基本都被陌陌给封了。
  除了面临搜狗/微信的反爬虫机制之外,采用此方案还有其他的缺点: 查看全部

  公众号文章采集可以应用什么方式
  如今微信公众号早已对于人们十分熟悉了,并且许多行业都在借助微信公众号来做营销,而公众号最主要的营销方法就是图文,那么公众号文章采集有什么方式?下面由拓途数据说一下。
  
  公众号文章采集
  公众号文章标题应当如何写才吸引人
  1.标题党
  标题党就是给你制造一种震惊或则吸引力,然后点进来却发觉“货不对版”给心中引起一种落差,这类标题对于三四十岁的阿姨大叔比较好使。
  2.标新立异
  就是很难去明白的标题,具有深层的含意或则压根就看不懂说的是啥。谓独创新意,理论和他人不一样。通常指提出新的主张、见解或创造出新奇的款式。也指为了显示自己,故意显露自己的与众不同或则用往常不同的抒发方法来吸引人。
  3.繁杂重复
  标题又长又罗嗦,起标题的人恨不得把全篇文章的意思都说出来,字眼重复。
  公众号文章采集整理怎样进行 介绍下边实用的方式
  方案一:基于搜狗入口
  在网上能搜索到的公众号文章采集相关的信息来看来看,这是最多、最直接、也是最简单的一种方案。
  一般流程是:
  1、搜狗微信搜索入口进行公众号搜索。
  2、选取公众号步入公众号历史文章列表3、对文章内容进行解析入库。
  采集过于频繁的话,搜狗搜索和公众号历史文章列表访问就会出现验证码。直接采用通常的脚本采集是难以领到验证码的。这里可以使用无头浏览器来进行访问,通过对接打码平台识别验证码。无头浏览器可采用selenium。
  即便采用无头浏览器同样存在问题:
  1、效率低下(实际上就是在跑一个完整的浏览器来模拟人类操作)。
  2、网页资源浏览器加载难以控制,脚本对浏览器加载很难控制3、验证码识别也未能做到100%,中途太可能会打断抓取流程。
  如果坚持使用搜狗入口并想进行完美采集的话只有降低代理IP。顺便说一句,公开免费的IP地址就别想了,非常不稳定,而且基本都被陌陌给封了。
  除了面临搜狗/微信的反爬虫机制之外,采用此方案还有其他的缺点:

Python爬虫实战练习:爬取微信公众号文章

采集交流优采云 发表了文章 • 0 个评论 • 996 次浏览 • 2020-08-25 22:24 • 来自相关话题

  Python爬虫实战练习:爬取微信公众号文章
  接着,我们通过Python来获取同样的资源,但直接运行如下代码是难以获取资源的
  import requests
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B
requests.get(url).json()
# {'base_resp': {'ret': 200003, 'err_msg': 'invalid session'}}
  我们之所以能在浏览器上获取资源,是因为我们登陆了微信公众号前端。而Python并没有我们的登入信息,所以恳求是无效的。我们须要在requests中设置headers参数,在其中传入Cookie和User-Agent,来模拟登录
  由于每次头信息内容还会变动,因此我将这种内容装入在单独的文件中,即"wechat.yaml",信息如下
  cookie: ua_id=wuzWM9FKE14...<br />user_agent: Mozilla/5.0...
  之后只须要读取即可
  # 读取cookie和user_agent
import yaml
with open("wechat.yaml", "r") as file:
file_data = file.read()
config = yaml.safe_load(file_data)
headers = {
"Cookie": config['cookie'],
"User-Agent": config['user_agent']
}
requests.get(url, headers=headers, verify=False).json()
  在返回的JSON中,我们就听到了每位文章的标题(title), 摘要(digest), 链接(link), 推送时间(update_time)和封面地址(cover)等信息。
  appmsgid是每一次推送的惟一标识符,aid则是整篇推文的惟一标识符。
  
  实际上,除了Cookie外,URL中的token参数也会拿来限制爬虫,因此上述代码太有可能输出会是{'base_resp': {'ret': 200040, 'err_msg': 'invalid csrf token'}}
  接着我们写一个循环,获取所有文章的JSON,并进行保存。
  import json
import requests
import time
import random
import yaml
with open("wechat.yaml", "r") as file:
file_data = file.read()
config = yaml.safe_load(file_data)
headers = {
"Cookie": config['cookie'],
"User-Agent": config['user_agent']
}
# 请求参数
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
begin = "0"
params = {
"action": "list_ex",
"begin": begin,
"count": "5",
"fakeid": config['fakeid'],
"type": "9",
"token": config['token'],
"lang": "zh_CN",
"f": "json",
"ajax": "1"
}
# 存放结果
app_msg_list = []
# 在不知道公众号有多少文章的情况下,使用while语句
# 也方便重新运行时设置页数
i = 0
while True:
begin = i * 5
params["begin"] = str(begin)
# 随机暂停几秒,避免过快的请求导致过快的被查到
time.sleep(random.randint(1,10))
resp = requests.get(url, headers=headers, params = params, verify=False)
# 微信流量控制, 退出
if resp.json()['base_resp']['ret'] == 200013:
print("frequencey control, stop at {}".format(str(begin)))
break

# 如果返回的内容中为空则结束
if len(resp.json()['app_msg_list']) == 0:
print("all ariticle parsed")
break

app_msg_list.append(resp.json())
# 翻页
i += 1
  在里面代码中,我将fakeid和token也储存在了"wechat.yaml"文件中,这是因为fakeid是每位公众号都特有的标识符,而token则会经常性变动,该信息既可以通过解析URL获取,也可以从开发者工具中查看
  
  在爬取一段时间后,就会碰到如下的问题
  {'base_resp': {'err_msg': 'freq control', 'ret': 200013}}
  此时你在公众号后台尝试插入超链接时才能遇见如下这个提示
  
  这是公众号的流量限制,通常须要等上30-60分钟能够继续。为了完美处理这个问题,你可能须要申请多个公众号,可能须要和微信公众号的登陆系统斗智斗勇,或许还须要设置代理池。
  但是我并不需要一个工业级别的爬虫,只想爬取自己公众号的信息,因此等个一小时,重新登陆公众号,获取cookie和token,然后运行即可。我可不想用自己的兴趣挑战他人的饭碗。
  最后将结果以JSON格式保存。
  # 保存结果为JSON
json_name = "mp_data_{}.json".format(str(begin))
with open(json_name, "w") as file:
file.write(json.dumps(app_msg_list, indent=2, ensure_ascii=False))
  或者提取文章标识符,标题,URL,发布时间这四列信息,保存成CSV。 查看全部

  Python爬虫实战练习:爬取微信公众号文章
  接着,我们通过Python来获取同样的资源,但直接运行如下代码是难以获取资源的
  import requests
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B
requests.get(url).json()
# {'base_resp': {'ret': 200003, 'err_msg': 'invalid session'}}
  我们之所以能在浏览器上获取资源,是因为我们登陆了微信公众号前端。而Python并没有我们的登入信息,所以恳求是无效的。我们须要在requests中设置headers参数,在其中传入Cookie和User-Agent,来模拟登录
  由于每次头信息内容还会变动,因此我将这种内容装入在单独的文件中,即"wechat.yaml",信息如下
  cookie: ua_id=wuzWM9FKE14...<br />user_agent: Mozilla/5.0...
  之后只须要读取即可
  # 读取cookie和user_agent
import yaml
with open("wechat.yaml", "r") as file:
file_data = file.read()
config = yaml.safe_load(file_data)
headers = {
"Cookie": config['cookie'],
"User-Agent": config['user_agent']
}
requests.get(url, headers=headers, verify=False).json()
  在返回的JSON中,我们就听到了每位文章的标题(title), 摘要(digest), 链接(link), 推送时间(update_time)和封面地址(cover)等信息。
  appmsgid是每一次推送的惟一标识符,aid则是整篇推文的惟一标识符。
  
  实际上,除了Cookie外,URL中的token参数也会拿来限制爬虫,因此上述代码太有可能输出会是{'base_resp': {'ret': 200040, 'err_msg': 'invalid csrf token'}}
  接着我们写一个循环,获取所有文章的JSON,并进行保存。
  import json
import requests
import time
import random
import yaml
with open("wechat.yaml", "r") as file:
file_data = file.read()
config = yaml.safe_load(file_data)
headers = {
"Cookie": config['cookie'],
"User-Agent": config['user_agent']
}
# 请求参数
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
begin = "0"
params = {
"action": "list_ex",
"begin": begin,
"count": "5",
"fakeid": config['fakeid'],
"type": "9",
"token": config['token'],
"lang": "zh_CN",
"f": "json",
"ajax": "1"
}
# 存放结果
app_msg_list = []
# 在不知道公众号有多少文章的情况下,使用while语句
# 也方便重新运行时设置页数
i = 0
while True:
begin = i * 5
params["begin"] = str(begin)
# 随机暂停几秒,避免过快的请求导致过快的被查到
time.sleep(random.randint(1,10))
resp = requests.get(url, headers=headers, params = params, verify=False)
# 微信流量控制, 退出
if resp.json()['base_resp']['ret'] == 200013:
print("frequencey control, stop at {}".format(str(begin)))
break

# 如果返回的内容中为空则结束
if len(resp.json()['app_msg_list']) == 0:
print("all ariticle parsed")
break

app_msg_list.append(resp.json())
# 翻页
i += 1
  在里面代码中,我将fakeid和token也储存在了"wechat.yaml"文件中,这是因为fakeid是每位公众号都特有的标识符,而token则会经常性变动,该信息既可以通过解析URL获取,也可以从开发者工具中查看
  
  在爬取一段时间后,就会碰到如下的问题
  {'base_resp': {'err_msg': 'freq control', 'ret': 200013}}
  此时你在公众号后台尝试插入超链接时才能遇见如下这个提示
  
  这是公众号的流量限制,通常须要等上30-60分钟能够继续。为了完美处理这个问题,你可能须要申请多个公众号,可能须要和微信公众号的登陆系统斗智斗勇,或许还须要设置代理池。
  但是我并不需要一个工业级别的爬虫,只想爬取自己公众号的信息,因此等个一小时,重新登陆公众号,获取cookie和token,然后运行即可。我可不想用自己的兴趣挑战他人的饭碗。
  最后将结果以JSON格式保存。
  # 保存结果为JSON
json_name = "mp_data_{}.json".format(str(begin))
with open(json_name, "w") as file:
file.write(json.dumps(app_msg_list, indent=2, ensure_ascii=False))
  或者提取文章标识符,标题,URL,发布时间这四列信息,保存成CSV。

python爬虫公众号所有信息,并批量下载公众号视频

采集交流优采云 发表了文章 • 0 个评论 • 157 次浏览 • 2020-08-25 02:06 • 来自相关话题

  python爬虫公众号所有信息,并批量下载公众号视频
  目录
  前言
  本文的文字及图片来源于网路,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。
  作者: 数据剖析实战
  PS:如有须要Python学习资料的小伙伴可以加点击下方链接自行获取
  主要功能一、获取公众号信息:标题、摘要、封面、文章URL
  操作步骤:
  1、先自己申请一个公众号 2、登录自己的帐号,新建文章图文,点击超链接
  代码
   1 import re
2 ​
3 import requests
4 import jsonpath
5 import json
6 ​
7 headers = {
8 "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
9 "Host": "mp.weixin.qq.com",
10 "Referer": "https://mp.weixin.qq.com/cgi-b ... ot%3B,
11 "Cookie": "自己获取信息时的cookie"
12 }
13 ​
14 def getInfo():
15 for i in range(80):
16 # token random 需要要自己的 begin:参数传入
17 url = "https://mp.weixin.qq.com/cgi-b ... in%3D{}&count=5&query=&fakeid=MzI4MzkzMTc3OA%3D%3D&type=9".format(str(i * 5))
18 ​
19 response = requests.get(url, headers = headers)
20 ​
21 jsonRes = response.json()
22 ​
23 ​
24 titleList = jsonpath.jsonpath(jsonRes, "$..title")
25 coverList = jsonpath.jsonpath(jsonRes, "$..cover")
26 urlList = jsonpath.jsonpath(jsonRes, "$..link")
27 ​
28 # 遍历 构造可存储字符串
29 for index in range(len(titleList)):
30 title = titleList[index]
31 cover = coverList[index]
32 url = urlList[index]
33 ​
34 scvStr = "%s,%s, %s,\n" % (title, cover, url)
35 with open("info.csv", "a+", encoding="gbk", newline='') as f:
36 f.write(scvStr)
  获取结果(成功):
  
  二、获取文章内视频:实现批量下载
  通过对单篇视频文章分析,我找到了这个链接:
  
  通过网页打开发觉,是视频的网页下载链接:
  
  哎,好像有点意思了,找到了视频的网页纯下载链接,那就开始吧。
  发现链接里的有一个关键参数vid 不知道哪来的? 和获取到的其他信息也没有关系,那就只能硬来了。
  通过对单文章的url恳求信息里发觉了这个参数,然后进行获取。
  1 response = requests.get(url_wxv, headers=headers)
2 ​
3 # 我用的是正则,也可以使用xpath
4 jsonRes = response.text # 匹配:wxv_1105179750743556096
5 dirRe = r"wxv_.{19}"
6 result = re.search(dirRe, jsonRes)
7 ​
8 wxv = result.group(0)
9 print(wxv)
  视频下载:
   1 def getVideo(video_title, url_wxv):
2 video_path = './videoFiles/' + video_title + ".mp4"
3 ​
4 # 页面可下载形式
5 video_url_temp = "https://mp.weixin.qq.com/mp/vi ... ot%3B + wxv
6 response = requests.get(video_url_temp, headers=headers)
7 content = response.content.decode()
8 content = json.loads(content)
9 url_info = content.get("url_info")
10 video_url2 = url_info[0].get("url")
11 print(video_url2)
12 ​
13 # 请求要下载的url地址
14 html = requests.get(video_url2)
15 # content返回的是bytes型也就是二进制的数据。
16 html = html.content
17 with open(video_path, 'wb') as f:
18 f.write(html)
  那么所有信息就都完成了,进行code组装。
  a、获取公众号信息
  b、筛选单篇文章信息
  c、获取vid信息
  d、拼接视频页面下载URL
  e、下载视频,保存
  代码实验结果:
  
  
  . 查看全部

  python爬虫公众号所有信息,并批量下载公众号视频
  目录
  前言
  本文的文字及图片来源于网路,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。
  作者: 数据剖析实战
  PS:如有须要Python学习资料的小伙伴可以加点击下方链接自行获取
  主要功能一、获取公众号信息:标题、摘要、封面、文章URL
  操作步骤:
  1、先自己申请一个公众号 2、登录自己的帐号,新建文章图文,点击超链接
  代码
   1 import re
2 ​
3 import requests
4 import jsonpath
5 import json
6 ​
7 headers = {
8 "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
9 "Host": "mp.weixin.qq.com",
10 "Referer": "https://mp.weixin.qq.com/cgi-b ... ot%3B,
11 "Cookie": "自己获取信息时的cookie"
12 }
13 ​
14 def getInfo():
15 for i in range(80):
16 # token random 需要要自己的 begin:参数传入
17 url = "https://mp.weixin.qq.com/cgi-b ... in%3D{}&count=5&query=&fakeid=MzI4MzkzMTc3OA%3D%3D&type=9".format(str(i * 5))
18 ​
19 response = requests.get(url, headers = headers)
20 ​
21 jsonRes = response.json()
22 ​
23 ​
24 titleList = jsonpath.jsonpath(jsonRes, "$..title")
25 coverList = jsonpath.jsonpath(jsonRes, "$..cover")
26 urlList = jsonpath.jsonpath(jsonRes, "$..link")
27 ​
28 # 遍历 构造可存储字符串
29 for index in range(len(titleList)):
30 title = titleList[index]
31 cover = coverList[index]
32 url = urlList[index]
33 ​
34 scvStr = "%s,%s, %s,\n" % (title, cover, url)
35 with open("info.csv", "a+", encoding="gbk", newline='') as f:
36 f.write(scvStr)
  获取结果(成功):
  
  二、获取文章内视频:实现批量下载
  通过对单篇视频文章分析,我找到了这个链接:
  
  通过网页打开发觉,是视频的网页下载链接:
  
  哎,好像有点意思了,找到了视频的网页纯下载链接,那就开始吧。
  发现链接里的有一个关键参数vid 不知道哪来的? 和获取到的其他信息也没有关系,那就只能硬来了。
  通过对单文章的url恳求信息里发觉了这个参数,然后进行获取。
  1 response = requests.get(url_wxv, headers=headers)
2 ​
3 # 我用的是正则,也可以使用xpath
4 jsonRes = response.text # 匹配:wxv_1105179750743556096
5 dirRe = r"wxv_.{19}"
6 result = re.search(dirRe, jsonRes)
7 ​
8 wxv = result.group(0)
9 print(wxv)
  视频下载:
   1 def getVideo(video_title, url_wxv):
2 video_path = './videoFiles/' + video_title + ".mp4"
3 ​
4 # 页面可下载形式
5 video_url_temp = "https://mp.weixin.qq.com/mp/vi ... ot%3B + wxv
6 response = requests.get(video_url_temp, headers=headers)
7 content = response.content.decode()
8 content = json.loads(content)
9 url_info = content.get("url_info")
10 video_url2 = url_info[0].get("url")
11 print(video_url2)
12 ​
13 # 请求要下载的url地址
14 html = requests.get(video_url2)
15 # content返回的是bytes型也就是二进制的数据。
16 html = html.content
17 with open(video_path, 'wb') as f:
18 f.write(html)
  那么所有信息就都完成了,进行code组装。
  a、获取公众号信息
  b、筛选单篇文章信息
  c、获取vid信息
  d、拼接视频页面下载URL
  e、下载视频,保存
  代码实验结果:
  
  
  .

通过微信公众平台获取公众号文章的方式示例

采集交流优采云 发表了文章 • 0 个评论 • 217 次浏览 • 2020-08-25 02:04 • 来自相关话题

  通过微信公众平台获取公众号文章的方式示例
  
  选择自建图文:
  
  似乎象是公众号营运教学了
  进入编辑页面以后,点击超链接
  
  弹出选择框,我们在框中输入对应的公众号名子,即可出现对应的文章列表
  
  是不是太惊奇,可以打开控制台,查看一下恳求的插口
  
  打开response,里面就是我们须要的文章链接
  
  确定了数据之后,我们须要剖析一下这个插口。
  感觉很简单,一个GET恳求,携带一些参数。
  
  fakeid是公众号的独有ID,所以想通过名子直接获取文章列表,还须要先获取一下fakeid。
  当我们输入公众号名子后,点击搜索。可以看见触发了搜索插口,返回了fakeid。
  
  这个插口所需参数也不多。
  
  接下来,我们可以用代码来模拟以上的操作了。
  但是还须要使用现有Cookie防止登入。
  
  目前Cookie的有效期,我还没有测试。可能须要及时更新Cookie。
  测试代码:
  
import requests
import json
Cookie = '请换上自己的Cookie,获取方法:直接复制下来'
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
headers = {
"Cookie": Cookie,
"User-Agent": 'Mozilla/5.0 (Linux; Android 10; YAL-AL00 Build/HUAWEIYAL-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.64 HuaweiBrowser/10.0.1.335 Mobile Safari/537.36'
}
keyword = 'pythonlx' # 公众号名字:可自定义
token = '你的token' # 获取方法:如上述 直接复制下来
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&query={}&token={}&lang=zh_CN&f=json&ajax=1'.format(keyword,token)
doc = requests.get(search_url,headers=headers).text
jstext = json.loads(doc)
fakeid = jstext['list'][0]['fakeid']
data = {
"token": token,
"lang": "zh_CN",
"f": "json",
"ajax": "1",
"action": "list_ex",
"begin": 0,
"count": "5",
"query": "",
"fakeid": fakeid,
"type": "9",
}
json_test = requests.get(url, headers=headers, params=data).text
json_test = json.loads(json_test)
print(json_test)
  这样能够获取最新的10篇文章了,如果想要获取更多的历史文章,可以更改data中的"begin"参数,0是第一页,5是第二页,10是第三页(以此类推)
  但是若果想要大规模抓取的话:
  请给自己安排一个稳定的代理,降低爬虫的速率,准备多个帐号,来降低被封禁的可能性。 查看全部

  通过微信公众平台获取公众号文章的方式示例
  
  选择自建图文:
  
  似乎象是公众号营运教学了
  进入编辑页面以后,点击超链接
  
  弹出选择框,我们在框中输入对应的公众号名子,即可出现对应的文章列表
  
  是不是太惊奇,可以打开控制台,查看一下恳求的插口
  
  打开response,里面就是我们须要的文章链接
  
  确定了数据之后,我们须要剖析一下这个插口。
  感觉很简单,一个GET恳求,携带一些参数。
  
  fakeid是公众号的独有ID,所以想通过名子直接获取文章列表,还须要先获取一下fakeid。
  当我们输入公众号名子后,点击搜索。可以看见触发了搜索插口,返回了fakeid。
  
  这个插口所需参数也不多。
  
  接下来,我们可以用代码来模拟以上的操作了。
  但是还须要使用现有Cookie防止登入。
  
  目前Cookie的有效期,我还没有测试。可能须要及时更新Cookie。
  测试代码:
  
import requests
import json
Cookie = '请换上自己的Cookie,获取方法:直接复制下来'
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
headers = {
"Cookie": Cookie,
"User-Agent": 'Mozilla/5.0 (Linux; Android 10; YAL-AL00 Build/HUAWEIYAL-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.64 HuaweiBrowser/10.0.1.335 Mobile Safari/537.36'
}
keyword = 'pythonlx' # 公众号名字:可自定义
token = '你的token' # 获取方法:如上述 直接复制下来
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&query={}&token={}&lang=zh_CN&f=json&ajax=1'.format(keyword,token)
doc = requests.get(search_url,headers=headers).text
jstext = json.loads(doc)
fakeid = jstext['list'][0]['fakeid']
data = {
"token": token,
"lang": "zh_CN",
"f": "json",
"ajax": "1",
"action": "list_ex",
"begin": 0,
"count": "5",
"query": "",
"fakeid": fakeid,
"type": "9",
}
json_test = requests.get(url, headers=headers, params=data).text
json_test = json.loads(json_test)
print(json_test)
  这样能够获取最新的10篇文章了,如果想要获取更多的历史文章,可以更改data中的"begin"参数,0是第一页,5是第二页,10是第三页(以此类推)
  但是若果想要大规模抓取的话:
  请给自己安排一个稳定的代理,降低爬虫的速率,准备多个帐号,来降低被封禁的可能性。

bmob前端云联接自己服务器

采集交流优采云 发表了文章 • 0 个评论 • 176 次浏览 • 2020-08-24 16:36 • 来自相关话题

  bmob后端云联接自己服务器
  // 引用Bomb
import Bmob from "hydrogen-js-sdk";
// 挂载到全局使用
Vue.prototype.Bmob = Bmob
// 初始化SDK 放入你数据库对应的 appid 和 key
Bmob.initialize("你的Application ID", "你的REST API Key");
// 调试模式
Bmob.debug(true)
  // 在方法中写入调用
let data = {
&#39;username&#39;:&#39;yjh&#39;,
&#39;password&#39;:&#39;123456&#39;
}
GetLogin(data){
  Bmob.User.login(data).then(res => {
console.log(res)
}).catch(err => {
console.log(err)
});
}
  
  这是成功返回参数由于我们 _User 表中存在此用户
  
  咯看这个恳求我们早已成功返回了
  ACL是该用户的权限,其他的都是该用户的信息了,比如创建时间,用户爱称,微信头像啥的
  肯定有杠精了,“那么错误返回是哪些样子呢?”
  不着急答案马上来,小二上图
  注意看我的password正确的是 123456而我可以写成 123451
  
  然后返回的结果我们来瞧瞧
  "账号或则密码错误"
  
  接下来就给你们发一下比目的js操作文档和比目的一些详细说明吧!
  在你的陌陌小程序后台配置你的服务器域名
  在应用设置-&gt;配置上面把这几个域名填写到上图陌陌后台,设置https域名
  
  使用实时数据平台的js
  一、对实时数据对象进行初始化
  let BmobSocketIo =new Bmob.Socket()
  二、监听表
   //初始连接socket.io服务器后,需要监听的事件都写在这个函数内
BmobSocketIo.onInitListen = function () {
//订阅Chat表的数据更新事件
BmobSocketIo.updateTable("Chat"); //聊天记录表
    };
//监听服务器返回的更新表的数据
BmobSocketIo.onUpdateTable = function (tablename, data) {
if (tablename == "Chat") {
console.log(data);
}
};
  PS:更多请参考Bmob Demo上面的群聊功能。
  
  Demo地址:
  直接放自己的appid保存就可以了
  
  好啦,今天就给你们介绍到这儿吧!好好吸收吸收
  有哪些小问题,疑问,文章措辞错误都可以在公众号-&gt;&gt;关于我 加我陌陌联系我噢! 查看全部

  bmob后端云联接自己服务器
  // 引用Bomb
import Bmob from "hydrogen-js-sdk";
// 挂载到全局使用
Vue.prototype.Bmob = Bmob
// 初始化SDK 放入你数据库对应的 appid 和 key
Bmob.initialize("你的Application ID", "你的REST API Key");
// 调试模式
Bmob.debug(true)
  // 在方法中写入调用
let data = {
&#39;username&#39;:&#39;yjh&#39;,
&#39;password&#39;:&#39;123456&#39;
}
GetLogin(data){
  Bmob.User.login(data).then(res => {
console.log(res)
}).catch(err => {
console.log(err)
});
}
  
  这是成功返回参数由于我们 _User 表中存在此用户
  
  咯看这个恳求我们早已成功返回了
  ACL是该用户的权限,其他的都是该用户的信息了,比如创建时间,用户爱称,微信头像啥的
  肯定有杠精了,“那么错误返回是哪些样子呢?”
  不着急答案马上来,小二上图
  注意看我的password正确的是 123456而我可以写成 123451
  
  然后返回的结果我们来瞧瞧
  "账号或则密码错误"
  
  接下来就给你们发一下比目的js操作文档和比目的一些详细说明吧!
  在你的陌陌小程序后台配置你的服务器域名
  在应用设置-&gt;配置上面把这几个域名填写到上图陌陌后台,设置https域名
  
  使用实时数据平台的js
  一、对实时数据对象进行初始化
  let BmobSocketIo =new Bmob.Socket()
  二、监听表
   //初始连接socket.io服务器后,需要监听的事件都写在这个函数内
BmobSocketIo.onInitListen = function () {
//订阅Chat表的数据更新事件
BmobSocketIo.updateTable("Chat"); //聊天记录表
    };
//监听服务器返回的更新表的数据
BmobSocketIo.onUpdateTable = function (tablename, data) {
if (tablename == "Chat") {
console.log(data);
}
};
  PS:更多请参考Bmob Demo上面的群聊功能。
  
  Demo地址:
  直接放自己的appid保存就可以了
  
  好啦,今天就给你们介绍到这儿吧!好好吸收吸收
  有哪些小问题,疑问,文章措辞错误都可以在公众号-&gt;&gt;关于我 加我陌陌联系我噢!

php怎么采集微信公众号文章的方式

采集交流优采云 发表了文章 • 0 个评论 • 415 次浏览 • 2020-08-24 03:10 • 来自相关话题

  php怎么采集微信公众号文章的方式
  最近有个需求是要采集微信公众号文章,于是研究了下。发现在刷新搜狗微信公众号文章列表的时侯,有个太难受的地方就是搜狗会直接的把你的ip给封了,要输入验证码。这一个步骤暂时不知道如何破解,我们这儿只是看php怎么采集微信公众号文章内容的方式,至于列表地址的获取,后面在进行研究。在写之前我搜索到用php写的爬虫程序有phpQuery,phpspider,QueryList(phpQuery的改进版)这三个。可能不止,这里只是我找到的。先记录,后面在研究。下面是我写的一个基本的微信公众号php采集类,有
  最近有个需求是要采集微信公众号文章,于是研究了下。发现在刷新搜狗微信公众号文章列表的时侯,有个太难受的地方就是搜狗会直接的把你的ip给封了,要输入验证码。这一个步骤暂时不知道如何破解,我们这儿只是看php怎么采集微信公众号文章内容的方式,至于列表地址的获取,后面在进行研究。
  在写之前我搜索到用php写的爬虫程序有phpQuery,phpspider,QueryList(phpQuery的改进版)这三个。可能不止,这里只是我找到的。先记录,后面在研究。
  下面是我写的一个基本的微信公众号php采集类,有待进一步建立。
  /**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/2/6
 * Time: 10:54
 * author: gm
 * 微信公众号文章采集类
 */
class DownWxArticle {
private   $mpwxurl = &#39;http://mp.weixin.qq.com&#39;;
private   $wxgzherr= &#39;公众号二维码下载失败=>&#39;;
private   $wximgerr= &#39;图片下载失败=>&#39;;
private   $direrr  = &#39;文件夹创建失败!&#39;;
private   $fileerr = &#39;资源不存在!&#39;;
private   $dirurl  = &#39;&#39;;
    /* 抓取微信公众号文章
 * $qcode    boolean 公众号二维码 false=>不下载 true=>下载
 * return
 * $content  string  内容
 * $tile     string  标题
 * $time     int     时间戳
 * $wxggh    string  微信公众号
 * $wxh      string  微信号
 * $qcode    string  公众号二维码
 * $tag      string  标签 原创
 */
    function get_file_article($url,$dir=&#39;&#39;,$qcode=false)
    {
$this->dirurl = $dir?:&#39;/Uploads/&#39;.date(&#39;Ymd&#39;,time());
        if(!$this->put_dir($this->dirurl)){
exit(json_encode(array(&#39;msg&#39;=>$this->direrr,&#39;code&#39;=>500)));
}
        $file = file_get_contents($url);
        if(!$file){
$this->put_error_log($this->dirurl,$this->fileerr);
            exit(json_encode(array(&#39;msg&#39;=>$this->fileerr,&#39;code&#39;=>500)));
        }
        // 内容主体
        preg_match(&#39;/[\s\S]*?/&#39;,$file,$content);
        // 标题
        preg_match(&#39;/(.*?)/&#39;,$file,$title);
        $title = $title?$title[1]:&#39;&#39;;
        // 时间
        preg_match(&#39;/(.*?)/&#39;,$file,$time);
        $time = $time?strtotime($time[1]):&#39;&#39;;
        // 公众号
        preg_match(&#39;/(.*?)/&#39;,$file,$wxgzh);
        $wxgzh = $wxgzh?$wxgzh[1]:&#39;&#39;;
        // 微信号
        preg_match(&#39;/([\s\S]*?)/&#39;,$file,$wxh);
        $wxh   = $wxh?$wxh[1]:&#39;&#39;;
        // 公众号二维码
        if($qcode){
            preg_match(&#39;/window.sg_qr_code="(.*?)";/&#39;,$file,$qcode);
            $qcodeurl = str_replace(&#39;\x26amp;&#39;,&#39;&&#39;,$this->mpwxurl.$qcode[1]);
            $qcode = $this->put_file_img($this->dirurl,$qcodeurl);
            if(!$qcode){
                $this->put_error_log($this->dirurl,$this->wxgzherr.$qcodeurl);
            }
        }
        // 获取标签
        preg_match(&#39;/(.*?)/&#39;,$file,$tag);
        $tag = $tag?$tag[1]:&#39;&#39;;
        // 图片
        preg_match_all(&#39;//&#39;,$content[0],$images);
        // 储存原地址和下载后地址
        $old = array();
        $new = array();
        // 去除重复图片地址
        $images = array_unique($images[1]);
        if($images){
            foreach($images as $v){
                $filename = $this->put_file_img($this->dirurl,$v);
                if($filename){
                    // 图片保存成功 替换地址
                    $old[] = $v;
                    $new[] = $filename;
                }else{
                    // 失败记录日志
                    $this->put_error_log($this->dirurl,$this->wximgerr.$v);
                }
            }
            $old[] = &#39;data-src&#39;;
            $new[] = &#39;src&#39;;
            $content = str_replace($old,$new,$content[0]);
        }
       // 替换音频
       $content = str_replace("preview.html","player.html",$content); 
       // 获取阅读点赞评论等信息
       $comment = $this->get_comment_article($url);
$data = array(&#39;content&#39;=>$content,&#39;title&#39;=>$title,&#39;time&#39;=>$time,&#39;wxgzh&#39;=>$wxgzh,&#39;wxh&#39;=>$wxh,&#39;qcode&#39;=>$qcode?:&#39;&#39;,&#39;tag&#39;=>$tag?:&#39;&#39;,&#39;comment&#39;=>$comment);
        return json_encode(array(&#39;data&#39;=>$data,&#39;code&#39;=>200,&#39;msg&#39;=>&#39;ok&#39;));
    }
    /* 抓取保存图片函数
     * return
     * $filename  string  图片地址
     */
    function put_file_img($dir=&#39;&#39;,$image=&#39;&#39;)
    {
        // 判断图片的保存类型 截取后四位地址
        $exts = array(&#39;jpeg&#39;,&#39;png&#39;,&#39;jpg&#39;);
        $filename = $dir.&#39;/&#39;.uniqid().time().rand(10000,99999);
        $ext = substr($image,-5);
        $ext = explode(&#39;=&#39;,$ext);
        if(in_array($ext[1],$exts) !== false){
            $filename .= &#39;.&#39;.$ext[1];
        }else{
            $filename .= &#39;.gif&#39;;
        }
        $souce = file_get_contents($image);
        if(file_put_contents($filename,$souce)){
            return $filename;
        }else{
            return false;
        }
    }
    /* 获取微信公众号文章的【点赞】【阅读】【评论】
     * 方法:将地址中的部分参数替换即可。
     *     1、s?     替换为 mp/getcomment?
     *     2、最后=  替换为 %3D
     * return
     * read_num  阅读数
     * like_num  点赞数
     * comment   评论详情
     */
    function get_comment_article($url=&#39;&#39;)
    {
        $url = substr($url,0,-1);
        $url = str_replace(&#39;/s&#39;,&#39;/mp/getcomment&#39;,$url).&#39;%3D&#39;;
        return file_get_contents($url);
    }
    /* 错误日志记录
     * $dir  string  文件路径
     * $data string  写入内容
     */
    function put_error_log($dir,$data)
    {
        file_put_contents($dir.&#39;/error.log&#39;,date(&#39;Y-m-d H:i:s&#39;,time()).$data.PHP_EOL,FILE_APPEND);
    }
    /* 创建文件夹
     * $dir string 文件夹路径
     */
    function put_dir($dir=&#39;&#39;){
$bool = true;
        if(!is_dir($dir)){
            if(!mkdir($dir,777,TRUE)){
$bool = false;
                $this->put_error_log($dir,$this->direrr.$dir);
            }
        }
return $bool;
    }
}
  使用方式: 查看全部

  php怎么采集微信公众号文章的方式
  最近有个需求是要采集微信公众号文章,于是研究了下。发现在刷新搜狗微信公众号文章列表的时侯,有个太难受的地方就是搜狗会直接的把你的ip给封了,要输入验证码。这一个步骤暂时不知道如何破解,我们这儿只是看php怎么采集微信公众号文章内容的方式,至于列表地址的获取,后面在进行研究。在写之前我搜索到用php写的爬虫程序有phpQuery,phpspider,QueryList(phpQuery的改进版)这三个。可能不止,这里只是我找到的。先记录,后面在研究。下面是我写的一个基本的微信公众号php采集类,有
  最近有个需求是要采集微信公众号文章,于是研究了下。发现在刷新搜狗微信公众号文章列表的时侯,有个太难受的地方就是搜狗会直接的把你的ip给封了,要输入验证码。这一个步骤暂时不知道如何破解,我们这儿只是看php怎么采集微信公众号文章内容的方式,至于列表地址的获取,后面在进行研究。
  在写之前我搜索到用php写的爬虫程序有phpQuery,phpspider,QueryList(phpQuery的改进版)这三个。可能不止,这里只是我找到的。先记录,后面在研究。
  下面是我写的一个基本的微信公众号php采集类,有待进一步建立。
  /**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/2/6
 * Time: 10:54
 * author: gm
 * 微信公众号文章采集类
 */
class DownWxArticle {
private   $mpwxurl = &#39;http://mp.weixin.qq.com&#39;;
private   $wxgzherr= &#39;公众号二维码下载失败=>&#39;;
private   $wximgerr= &#39;图片下载失败=>&#39;;
private   $direrr  = &#39;文件夹创建失败!&#39;;
private   $fileerr = &#39;资源不存在!&#39;;
private   $dirurl  = &#39;&#39;;
    /* 抓取微信公众号文章
 * $qcode    boolean 公众号二维码 false=>不下载 true=>下载
 * return
 * $content  string  内容
 * $tile     string  标题
 * $time     int     时间戳
 * $wxggh    string  微信公众号
 * $wxh      string  微信号
 * $qcode    string  公众号二维码
 * $tag      string  标签 原创
 */
    function get_file_article($url,$dir=&#39;&#39;,$qcode=false)
    {
$this->dirurl = $dir?:&#39;/Uploads/&#39;.date(&#39;Ymd&#39;,time());
        if(!$this->put_dir($this->dirurl)){
exit(json_encode(array(&#39;msg&#39;=>$this->direrr,&#39;code&#39;=>500)));
}
        $file = file_get_contents($url);
        if(!$file){
$this->put_error_log($this->dirurl,$this->fileerr);
            exit(json_encode(array(&#39;msg&#39;=>$this->fileerr,&#39;code&#39;=>500)));
        }
        // 内容主体
        preg_match(&#39;/[\s\S]*?/&#39;,$file,$content);
        // 标题
        preg_match(&#39;/(.*?)/&#39;,$file,$title);
        $title = $title?$title[1]:&#39;&#39;;
        // 时间
        preg_match(&#39;/(.*?)/&#39;,$file,$time);
        $time = $time?strtotime($time[1]):&#39;&#39;;
        // 公众号
        preg_match(&#39;/(.*?)/&#39;,$file,$wxgzh);
        $wxgzh = $wxgzh?$wxgzh[1]:&#39;&#39;;
        // 微信号
        preg_match(&#39;/([\s\S]*?)/&#39;,$file,$wxh);
        $wxh   = $wxh?$wxh[1]:&#39;&#39;;
        // 公众号二维码
        if($qcode){
            preg_match(&#39;/window.sg_qr_code="(.*?)";/&#39;,$file,$qcode);
            $qcodeurl = str_replace(&#39;\x26amp;&#39;,&#39;&&#39;,$this->mpwxurl.$qcode[1]);
            $qcode = $this->put_file_img($this->dirurl,$qcodeurl);
            if(!$qcode){
                $this->put_error_log($this->dirurl,$this->wxgzherr.$qcodeurl);
            }
        }
        // 获取标签
        preg_match(&#39;/(.*?)/&#39;,$file,$tag);
        $tag = $tag?$tag[1]:&#39;&#39;;
        // 图片
        preg_match_all(&#39;//&#39;,$content[0],$images);
        // 储存原地址和下载后地址
        $old = array();
        $new = array();
        // 去除重复图片地址
        $images = array_unique($images[1]);
        if($images){
            foreach($images as $v){
                $filename = $this->put_file_img($this->dirurl,$v);
                if($filename){
                    // 图片保存成功 替换地址
                    $old[] = $v;
                    $new[] = $filename;
                }else{
                    // 失败记录日志
                    $this->put_error_log($this->dirurl,$this->wximgerr.$v);
                }
            }
            $old[] = &#39;data-src&#39;;
            $new[] = &#39;src&#39;;
            $content = str_replace($old,$new,$content[0]);
        }
       // 替换音频
       $content = str_replace("preview.html","player.html",$content); 
       // 获取阅读点赞评论等信息
       $comment = $this->get_comment_article($url);
$data = array(&#39;content&#39;=>$content,&#39;title&#39;=>$title,&#39;time&#39;=>$time,&#39;wxgzh&#39;=>$wxgzh,&#39;wxh&#39;=>$wxh,&#39;qcode&#39;=>$qcode?:&#39;&#39;,&#39;tag&#39;=>$tag?:&#39;&#39;,&#39;comment&#39;=>$comment);
        return json_encode(array(&#39;data&#39;=>$data,&#39;code&#39;=>200,&#39;msg&#39;=>&#39;ok&#39;));
    }
    /* 抓取保存图片函数
     * return
     * $filename  string  图片地址
     */
    function put_file_img($dir=&#39;&#39;,$image=&#39;&#39;)
    {
        // 判断图片的保存类型 截取后四位地址
        $exts = array(&#39;jpeg&#39;,&#39;png&#39;,&#39;jpg&#39;);
        $filename = $dir.&#39;/&#39;.uniqid().time().rand(10000,99999);
        $ext = substr($image,-5);
        $ext = explode(&#39;=&#39;,$ext);
        if(in_array($ext[1],$exts) !== false){
            $filename .= &#39;.&#39;.$ext[1];
        }else{
            $filename .= &#39;.gif&#39;;
        }
        $souce = file_get_contents($image);
        if(file_put_contents($filename,$souce)){
            return $filename;
        }else{
            return false;
        }
    }
    /* 获取微信公众号文章的【点赞】【阅读】【评论】
     * 方法:将地址中的部分参数替换即可。
     *     1、s?     替换为 mp/getcomment?
     *     2、最后=  替换为 %3D
     * return
     * read_num  阅读数
     * like_num  点赞数
     * comment   评论详情
     */
    function get_comment_article($url=&#39;&#39;)
    {
        $url = substr($url,0,-1);
        $url = str_replace(&#39;/s&#39;,&#39;/mp/getcomment&#39;,$url).&#39;%3D&#39;;
        return file_get_contents($url);
    }
    /* 错误日志记录
     * $dir  string  文件路径
     * $data string  写入内容
     */
    function put_error_log($dir,$data)
    {
        file_put_contents($dir.&#39;/error.log&#39;,date(&#39;Y-m-d H:i:s&#39;,time()).$data.PHP_EOL,FILE_APPEND);
    }
    /* 创建文件夹
     * $dir string 文件夹路径
     */
    function put_dir($dir=&#39;&#39;){
$bool = true;
        if(!is_dir($dir)){
            if(!mkdir($dir,777,TRUE)){
$bool = false;
                $this->put_error_log($dir,$this->direrr.$dir);
            }
        }
return $bool;
    }
}
  使用方式:

官方客服QQ群

微信人工客服

QQ人工客服


线