importrequests,pymysqlimportjson,jsonpath,random,re,time,datetime,os,imghdrfrom lxml importetreefrom selenium importwebdriverfrom urllib importrequestimportssl

ssl._create_default_https_context=ssl._create_unverified_context'''注意点:如果同一时间内刷新次数,或者获取分页太频繁,会被封'''

#--------------------

user_info = {'username':'####@163.com','password':'####'}

base_url= 'https://mp.weixin.qq.com/'base_headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}

query_list= [ #需要抓取的公众号列表

{'fakeid':'MzIzOTQ0MTUwMA==','nickname':'Sir电影'},

{'fakeid':'MzIxODc5MzM4NQ==','nickname':'鱼Sir电影'},

]

table= 'p_weixin' #数据库名称

key = 'title,author,js_name,publish_time,images,vedios'

#--------------------

def get_cookie(): #登陆并获取cookie值

driver = webdriver.Chrome(executable_path=r'/Applications/Google Chrome.app/chromedriver')

driver.get(base_url)

time.sleep(2) #页面缓冲

driver.find_element_by_name('account').clear()

driver.find_element_by_name('account').send_keys(user_info['username'])

driver.find_element_by_name('password').clear()

driver.find_element_by_name('password').send_keys(user_info['password'])

driver.find_element_by_class_name('icon_checkbox').click()

driver.find_element_by_class_name('btn_login').click()

time.sleep(25) #等待手机扫码

c_total=driver.get_cookies()

cookies= {} #cookies存储

for i inc_total:

cookies[i['name']] = i['value']returncookiesdef get_info(): #获取公众号名称、总页数、token、fakeid等信息,

cookies =get_cookie()

res_token= requests.get(base_url,cookies=cookies,headers=base_headers)

token= re.compile(r'token=(\d+)').findall(str(res_token.url))for query in query_list: #从列表里控制要爬取多少个公众号

url = 'https://mp.weixin.qq.com/cgi-bin/appmsg' #公众号里面的电影

fakeid= query['fakeid']

appmsg={'token': token,'lang': 'zh_CN','f': 'json','ajax': '1','random': random.random(),'action': 'list_ex','begin': '0','count': '5','fakeid': fakeid,'type': '9',

}

res_cnt= requests.get(url,params=appmsg,cookies=cookies) #看总共多少页 一页16篇,begin 0~4为一页

res_cnt =json.loads(res_cnt.text)for cnt in range(0,res_cnt['app_msg_cnt'],5): #循环所有分页

appmsg['begin'] = cnt #当前的分页值

response = requests.get(url,params=appmsg,cookies=cookies)

data_list=json.loads(response.text)for data in data_list['app_msg_list']: #对当前页里的信息进行提取

yield [data['title'],data['link']]

time.sleep(random.randrange(30,41)) #设置间隔

print('公众号:%s,共有文章%s' % (query['nickname'],res_cnt['app_msg_cnt'])) #返回页数,这里应该单独输入,不需要存储

defget_news():#def get_news(url): # 获取文章,这里可以用协程?也需要换agent

'''视频、音频、图片'''

print('-'*40)

url= 'https://mp.weixin.qq.com/s?src=3&timestamp=1533397256&ver=1&signature=RbnX4tUBODpql9qsvp4jJRDrtHc-LSXXm9gSM*BNY*PTRKHJ2bUyeKkGPlpKGGsnKl4IyaxubTPPWv6jQzhm52M7qFY5*BJ8dEugb4XPUcLRSs8U-4Bb9ab9mso2NWDq0*RwRzZ2*zZ6r1YyQtNjpg=='res= request.Request(url,headers=base_headers)

response=request.urlopen(res)

re_data=response.read().decode()

data=etree.HTML(re_data)

title= get_try(data, '//h2[@id="activity-name"]/text()') #标题

author = get_try(data, '//div[@id="meta_content"]//span[@class="rich_media_meta rich_media_meta_text"]//text()') #作者

js_name = get_try(data, '//div[@id="meta_content"]//span[@class="rich_media_meta rich_media_meta_text"]//text()') #公众号名称

publish_time = re.compile(r'var publish_time.*?\"(.*?)\"').findall(re_data)[0] #发布时间 昨天、前天、今天、1周前

images_list= [] #图片

vedio_list = [] #音视频

#还有图片、视频、音频地址

js_content = data.xpath('//div[@id="js_content"]//p//text()|//div[@id="js_content"]//p//img/@data-src|//div[@id="js_content"]//p//iframe/@data-src|//mpvoice')for i inrange(len(js_content)):if '。' == js_content[i] or ',' ==js_content[i]:

js_content[i]= ''

elif isinstance(js_content[i], etree._Element): #音频

res = js_content[i].xpath('//mpvoice/@voice_encode_fileid')[0]

js_content[i]= 'https://res.wx.qq.com/voice/getvoice?mediaid={}'.format(res)

vedio_list.append(js_content[i])elif 'pic' in js_content[i]: #图片

images_list.append(js_content[i])elif 'v.qq' in js_content[i]: #视频

vedio_json = 'https://h5vv.video.qq.com/getinfo?callback=txplayerJsonpCallBack_getinfo_24936&otype=json&vid={}' #包括视频播放地址的json文件

url = vedio_json.format(js_content[i].split('vid=')[-1].split('&')[0])

js_content[i]=url

vedio_list.append(js_content[i])else:

js_content[i]= '

%s

' %js_content[i]

get_video(vedio_list)#从视频、音频json文件地址分析出下载路径

print('-' * 30)

total_data={'title': title,'author': author,'js_name': js_name,'publish_time': publish_time,'js_content': js_content,'images': images_list,'vedios': vedio_list

}#Down(total_data) # 下载函数

def get_try(data, fangfa): #把try except封到一起

try:

res=data.xpath(fangfa)[0].strip()returnresexceptException as e:return '暂无'

def get_video(url_list): #获取视频 如果是音频,直接下载,否则转到视频界面处理

print('获取音、视频路径列表',url_list)for base_url inurl_list:if 'voice' inbase_url:pass

#voice_name = base_url.split('=')[-1][-10:]

#request.urlretrieve(base_url,'./'+voice_name+'.mp3') # 目前mp3可以下载没有加密,后续需要转到Down函数统一处理

else:print('视频的json文件地址',base_url)

res= request.Request(base_url,headers=base_headers)

response=request.urlopen(res)

video_json= re.compile(r'txplayerJsonpCallBack_getinfo_24936\((.*)\)',re.S).search(response.read().decode()).group(1)

video_data=json.loads(video_json)

title= jsonpath.jsonpath(video_data,'$..vl.vi..ti')[0]

vid= jsonpath.jsonpath(video_data,'$..vl.vi..lnk')[0]

vkey= jsonpath.jsonpath(video_data,'$..vl.vi..fvkey')[0]

fn= jsonpath.jsonpath(video_data,'$..vl.vi..fn')[0]

url_list= jsonpath.jsonpath(video_data,'$..vl.vi..ul.ui')[0]

full_url= 'http://ugcsjy.qq.com/'+vid+'.p712.1.mp4?vkey='+vkeyprint('下载路径',full_url)try:

base_headers['Host'] = 'ugcbsy.qq.com'v_response= requests.get(full_url,headers =base_headers)print(base_headers)print(v_response.status_code)exceptException as e:print('该下载路径下载失败',e)def Down(data): #先下载 下载之后还需要改路径名称 按时间建立文件夹

#检测是否存在、下载、改类型

#视频现在路径有问题,先搞定音频和图片名称和路径

for i in [data['images'],data['vedios']]:for img ini:

img_name= img.split('/')[-2][-10:] #下载后的图片名称

down_path= '../download/公众号_图片音视频/{}'.format(img_name) #下载路径

path= os.listdir('../download/公众号_图片音视频/')

path= ','.join(path) #把当前所需要下载的文章资源路径拼接在一起,便于使用re.search方法判断

if re.search(img_name + '.*', path): #正则匹配后缀名,避免判断时因为本地文件已经改了后缀找不到

print('文件已存在', '-', img_name)else:

request.urlretrieve(img, down_path)#下载

end_name = imghdr.what(down_path) #后缀名称

if end_name: #imghdr只能查看图片类,视频不能判断,所以判断是否为空

os.rename(down_path, down_path + '.' +end_name)print('已下载成功', '-', down_path)def Mydb(data): #下载后再存数据库

db = pymysql.connect('127.0.0.1','root','123456','PaChong',charset='utf8')

curosr=db.cursor()

value= ','.join(['%s']*len(data))

sql= 'insert into {}({}) VALUES({})'.format(table,key,value)

data=data.values()

curosr.execute(sql,data)def main(): #主体,从这里运行就好

start = datetime.datetime.now() #开始时间

for info in get_info(): #获取公众号taken fakeid等信息

get_news(info[-1]) #获取地址

end = datetime.datetime.now() #结束时间

print('-'*30)print('总用时',end-start)print('-'*30)if __name__ == '__main__':#main()

get_news()

python 公众号爬虫_python_爬虫_微信公众号抓取相关推荐

  1. php 公众号验证回调方法_微信公众号关键词自动回复设置方法!

    什么是公众号关键词自动回复? 在微信公众号平台设置关键词自动回复,可以通过添加规则,关注/订阅的用户发送的消息内容如果是你设置的关键字,即可以实现自动回复预先设置好的内容. 关键字自动回复设置方法: ...

  2. 公众号 接收规则 消息_微信公众号教程(11)公众账号接收非文字消息 上

    公众账号接收非文字消息 在微信公众平台上用户都是用使用文字在进行交互的,但是有时候使用图片.语音.视频以及地理位置等可以实现一些非常棒的功能,比如"语音提醒"公众号里的发送语音就可 ...

  3. 分享公众号抽奖的作用_微信公众号抽奖活动怎么弄

    公众号线上抽奖相比于现场抽奖有很多好处,除了成本更低,宣传范围更广,能够吸引更多的参与,还有一大好处就是,线上抽奖比线下更容易挖掘潜在客户.抽奖活动可以手机客户的手机号,年龄,消费信息等.对流量转化和 ...

  4. python 公众号 关注者位置_微信公众号获取用户地理位置

    很久没搞微信的js-sdk了, 搞了一下午, 刷新页面老是失败, 没想到结合经验给大家展示下获取用户地理位置 第一步:登录微信公众号https://mp.weixin.qq.com 首先先设置最基本的 ...

  5. python 微信公众号 语音推送_微信公众平台消息接口开发(40)语音识别

    微信公众平台开发模式 微信 语音识别 公众平台 消息接口 语音识别 微信公众平台开发 语音识别 作者:方倍工作室 地址:http://www.cnblogs.com/txw1958/archive/2 ...

  6. php 公众号验证回调方法_微信公众号PHP对接验证

    现在流行开发自己的微信公众号,制作定各种微信应用,什么微商城,微客服等,但在开发微信时要将接口和服务器做对接配置,也就是在做对接配置后,微信公众号所有的消息.事件都会发往该对接好的服务器上. 之前并未 ...

  7. 公众号 接收规则 消息_微信公众平台 发送模板消息(Java接口开发)

    前言:最近一直再弄微信扫码推送图文消息和模板消息发送,感觉学习到了不少东西.今天先总结一下微信公众平台模板消息的发送.因为这个自己弄了很久,开始很多地方不明白,所以今天好好总结一下. 微信公众平台技术 ...

  8. 公众号里面套页面_微信公众号页面模板有什么用?开通的方法是什么?

    微信公众号页面模板是微信公众号里面的功能哦,如果你开启了微信公众号文章原创功能,那么你是可以去开通页面模板功能的,很多的微信公众号管理员不知道微信公众号页面模板有什么用,接下来小编会为大家说明哦. 微 ...

  9. url 微信公众号开发 配置失效_微信公众号开发之授权登录

    一.UnionId和openId 微信登录最重要的两个返回信息,一个是UnionId,一个是OpenId.两者之间有着必然的联系. UnionID机制的作用说明:如果开发者拥有多个移动应用.网站应用和 ...

  10. java微信公众号支付开发平台_微信公众号支付demo,微信公众号支付Java DEMO

    1.5.4微信验证的控制方法: /** * 微信验证 * 请填写接口配置信息,此信息需要你有自己的服务器资源,填写的URL需要正确响应微信发送的Token验证 * 验证服务器地址的有效性 * 开发者提 ...

最新文章

  1. 3软件测试原理与软件缺陷
  2. k8s概念入门之kube-proxy-针对早期(0.4)版本阅读
  3. awk脚本打印终端各种颜色的字体
  4. source ubuntu 退出_ubuntu停source、sh、bash、/执行脚本的区别
  5. 同济大学计算机系陈永生,城市轨道交通应急预案演算平台的设计与研究.pdf
  6. STM32 IO口的八种模式使用小结
  7. try、catch、finally 和 throw-C#异常处理
  8. spring smtp_使用Spring使用Java发送电子邮件– GMail SMTP服务器示例
  9. 代码实现tan graph model for classification_自定义 Estimator 实现(以BERT为例)
  10. ADO.net中临时表DataTable的简单应用
  11. C# Winform 实现屏蔽键盘的win和alt+F4的实现代码
  12. 计算机维护系统Win8PE,U盘启动计算机维护系统(Win8PEx64内核仅160M)
  13. html小票表格制作,菜单小票模板word
  14. 浅显易懂描述傅立叶级数和傅立叶变换的关系
  15. 户外LED透明屏与室内透明屏区别,选型号建议
  16. Ubuntu Navicat 英文显示乱码解决方案
  17. python 日历节假日显示颜色_python判断2018/2019年的某天是否是节假日
  18. 在乌版图安装软件包时候报错:E:无法定位软件包
  19. Python文件和数据格式化学习笔记
  20. [华中科技计组实验]logisim完成单周期5级流水MIPS CPU

热门文章

  1. MySQL 备份和恢复
  2. java在己有的类创子类怎么创_使用Java创建自己的异常子类...
  3. java inputstream api_Java 读取/转换 InputStream 为字符串
  4. 电灯泡 (容斥原理)
  5. Deep GSP : 面向多目标优化的工业界广告智能拍卖机制
  6. python爬虫实践 —— 一、入门篇
  7. 处女座男生颜值测试软件,颜值在线又绅士的星座男(图)
  8. 微信小程序怎么新建php文件,微信小程序中创建小程序页面的步骤介绍(图文)...
  9. 『ACM-数据结构』信息竞赛进阶指南--线段树
  10. 『ACM-算法-离散化』信息竞赛进阶指南--离散化