python 公众号爬虫_python_爬虫_微信公众号抓取

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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/244564.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开发工评价程师自我_常见“自我评价”写作范例

“自我评价”在找工作的时候是一个非常重要的内容,优秀的“自我评价”不仅就可以让别人对你有一个全面的认识,更可以通过寥寥数语就让别人对你产生浓厚的兴趣,让你的求职之路事半功倍。但是怎么写“自我评价”,却是让很多人犯愁的…

android调用服务器端口,更改运行adb服务器的默认端口(即5037)

使用环境variablesANDROID_ADB_SERVER_PORT选择端口。以下在bash下工作:$ export ANDROID_ADB_SERVER_PORT12345 $ adb start-server * daemon not running. starting it now on port 12345 * * daemon started successfully * $ adb devices List of devices attac…

visual studio 调试python_Visual Studio Code Python 调试设置

很意外Visual Studio Code居然支持Python代码的断点调试。一起来配置一下。工具/原料 Visual Studio Code 1.1 Python 2.7.11 方法/步骤 1 首先,当然是要先安装插件,配置Python环境。这个大家看这个文章 2 环境配置完成后,我们点击调试按钮&a…

cad图纸比对lisp_CompareDWG|CAD图纸比较软件(CompareDWG)下载v2018 官方版 - 欧普软件下载...

CompareDWG是一款免费的CAD图纸比较软件,可以帮助用户快速找到两个dwg图像之间的差异,使用不同的颜色进行标注,生成详细的报表,相比人工查找效率更高,准确率也高,支持几乎所有的autocad版本,适用…

android 电话 快捷键,Android studio开发常用快捷键详解

最常用快捷键1.Ctrl+E可以显示最近编辑的文件列表2.Shift+Click(点击)可以关闭文件3.Ctrl+[或者ctrl]可以跳到大括号的开头结尾4.Ctrl+Shift+Backspace可以跳转到上次编辑的地方5.Ctrl+F12可以显示当前文件…

leetcode c程序总提示主函数_Matlab系列之函数嵌套

昨天的那一篇讲的几个函数,不知道你们理解的如何,是否懂得怎么去使用了,如果还没懂,一定要再多看几遍,并且去在软件上进行实操,今天的话,将要介绍一下函数的嵌套,不过在正式讲嵌套之…

alibab仓库 idea_01.微服务架构编码、构建

教学视频传送:springBoot和springCloud的版本选型https://start.spring.io/actuator/info查看json串返回结果这就是我们的选型依据本次开发选用版本如下:cloud : Hoxton.SR1boot : 2.2.2.RELEASEcloud alibaba : 2.1.0.RELEASEjava …

华为手机出现android啥意思,传华为正研发手机系统,如果脱离安卓系统,还有啥能阻止华为前进...

原标题:传华为正研发手机系统,如果脱离安卓系统,还有啥能阻止华为前进自从国产手机正式进入了智能手机时代之后,中华酷联的中兴、酷派、联想早已经被华为甩在了身后。虽然现在国产手机已经呈现出华为、小米、OPPO、vivo四足鼎立的…

sql 数据库前两列值乘_Sql语句常用关键字

最近接触sql比较多,发现自己已经遗忘的也差不多,要用到的时候迟迟拿不出来,今天开始会在知乎上纪录一些sql语句学习的内容,内容重在说明查询语句的用法。一、sql查询语句的初始介绍1、查询语句的一般写法:select .....…

kayui进行添加_关于layui 实现点击按钮添加一行(方法渲染创建的table)

目标:layui 实现点击按钮添加一行解决方案:方案1、table 是用转换静态表格的方式创建的,写一个button,每次点击按钮,就添加一个 标签;方案2、table 是用方法渲染的方式创建的,写一个button,每次…

android怎样添加图片锐化功能,如何在android处理图片(图像二值化锐化转换格式).doc...

如何在android处理图片(图像二值化锐化转换格式)链接:如何在android处理图片( 图像二值化、锐化、转换格式)/thread-36559-1-1.htmlpackage net.wealthgod.client.center.ocr;import java.awt.Graphics2D;import java.awt.color.ColorSpace;import java.awt.geom.Af…

python的open方法_Python os.open() 方法

Python os.open() 方法 概述 os.open() 方法用于打开一个文件,并且设置需要的打开选项,模式参数mode参数是可选的,默认为 0777。 语法 open()方法语法格式如下: os.open(file, flags[, mode]); 参数 file -- 要打开的文件 flags -…

postforobject 设置代理_OAuth2RestTemplate中的代理配置

我需要使用由OAuth2保护的API.为此我使用OAuth2RestTemplate.但我得到以下错误:java.net.ConnectException: Connection timed out: connect由于代理问题,这种情况正在发生.我知道如何在RestTemplate中设置代理:SimpleClientHttpRequestFactory clientHt…

谷歌fuchsiaos和华为鸿蒙,华为鸿蒙最大的对手现身!谷歌正式推送Fuchsia OS,或替代安卓...

原标题:华为鸿蒙最大的对手现身!谷歌正式推送Fuchsia OS,或替代安卓可能是看到了华为鸿蒙的进展神速,谷歌在近日也正是开始了Fuchsia OS的推送。5月25日,谷歌Fuchsia OS项目负责人在社交媒体上公开喊话:“今…

python编码规范utf8还是gbk还是ask_彻底搞懂 Python 编码

因为中文的特殊编码,导致 Python2 和 Python3 使用过程中的各种编码问题,如果不清楚其中的关联关系,那么这就一直是个大坑,不是懵逼就还是懵逼,所以就目前碰到的情况彻底梳理下 Python2 和 Python3 中编码的关系和区别…

k8s 命令 重启_k8s 常用命令

# 启动etcd存储服务service etcd start# 运行mastercd /opt/kubernetes/bin./apiserver.sh 192.168.220.135 http://192.168.220.135:2379./scheduler.sh 192.168.220.135./controller-manager.sh 192.168.220.135# 运行node(需要先禁用swap交换缓存,运行命令 swapo…

html js坐标图,javascript – HTML5 Canvas沿着带坐标的路径拖动图像

演示:http://jsfiddle.net/m1erickson/7vmML/示例代码:body{ background-color: ivory; }#canvas{border:1px solid red;}$(function(){var canvasdocument.getElementById("canvas");var ctxcanvas.getContext("2d");var $canvas$(…

python删除字符串_Python3 - 删除字符串中不需要的字符

问题 去掉文本字符串开头,结尾或者中间不想要的字符,比如空白。 解决方案 strip() 方法用于删除字符串开始或结尾的字符。 lstrip() 和 rstrip() 分别从左和从右执行删除操作。 默认情况下,这些方法会删除空白字符,但是你也可以指…

springboot控制接口返回的字段_SpringBoot实战:SpringBoot之Rest Full接口自定义返回数据类型(ResponseBodyAdvice)...

我们在日常开发的过程中,经常会要求统一返回数据格式。如要求统一访问格式为{"success": 请求是否成功,"message": 请求消息,"data": 请求数据}那我们要如何实现呢,接下来将演示接口自定义返回数据类型一般接口返回的数据…

c html转为datatable,C#中DataTable导出为HTML格式的方法

前言在C#中DataTable导出数据的时候,我们需要HTML格式的输出数据, 这时候就需要使用将DataTable导出为到HTML格式的方法了,以下代码就可以帮助我们达到目的。首先,我们要绑定DataTable和 DataGridView。一、通过DataTable绑定DataGridView1. 创建DataTab…