分享文章:智慧软文投稿发稿平台老平台
优采云 发布时间: 2022-11-30 12:38分享文章:智慧软文投稿发稿平台老平台
" />
很多宣传员对网络稿件的收录很感兴趣,因为收录基本上决定了宣传,但是媒体太多了,很难*每一个被选中的媒体*都可靠地收录和展示*,请问公司怎么样?选择智能软文,投稿平台-智能软文投稿发布平台老平台-大量媒体采集
,采集
简单*采集
,智能软文为了解决用户投稿后被收录的需求, * 联合长期收录稳定排名靠前的媒体 编辑已开通收录媒体,通过智慧软文收录媒体,您可以投稿发布。如未被百度收录,可补发或退单,让您再也不用担心被收录。智慧软文出版公司()简称,是一家媒体资源整合平台网络公司。在整合媒体资源网络公司上,发布与正常媒体发布一致。让公司稿的发布变得简洁**。智慧软文深耕网络媒体投稿,力求做到网络投稿的最高境界。智慧软文改变传统投稿模式,利用网络优势,聚集投稿企业和企业以量取胜,直接对接媒体作为大客户。编辑做稿件投稿批发,公司切断零售商链接,允许媒体编辑直接与发布手稿的客户进行交易。经过近期的努力,目前公司已整合国网、网信、中华网、中华网、凤凰网、新浪网、搜狐网、网易网、腾讯网、中国经济网、今世网、北国网、南方网、荆楚网等本土门户企业超过1.4*家,自媒体发布账号资源2.4*家,约占门户企业的2.6%。
" />
网络覆盖,公司式发布,只要注册广告商账号,即可向大门户投稿!增加公司和产品在网络搜索结果中的排名,提高公司和产品的知名度,树立网络品牌。帮助企业、公司完成宣传考核目标,开展网络宣传。智软文是一个直接发布网络,用户和媒体编辑直接连接。它不仅*提供*投稿**,还帮助客户稿件赚钱。收录媒体,均价在左右,通过收录媒体发表的稿件,不收录可以补发或退回,让您再也不用为发稿发愁。通过智能软文出版公司投稿其实很简单。您只需要会上网,登录智能软文发布公司网站(),注册智能软文广告主账号,然后登录智能软文后台,点击发布管理,稿件发布,在右侧的媒体列表中,您可以根据域名和公司名称搜索您要发布的媒体,在搜索结果中筛选出您要发布的媒体,然后点击右侧的*购物车,单击稿件输入,然后输入您要发布的媒体。投稿后点击确认发布,投稿成功。投稿后,相应媒体的编辑会安排发布,并且将在几分钟内返回指向成功发布的链接。您可以在发布管理、历史*发布链接地址中查看媒体编辑器的返回。
干货教程:今日头条文章采集软件 今日头条文章Collection_JS反向教程:Pytho
最近在抓取今日头条数据的过程中,发现视频地址的获取比较复杂。结合源码和浏览器找到对应的解决思路,记录一下。
单击此处获取大量 Python 学习资料!
内容Python模块实现思路代码及运行结果Text
1.需要Python模块
模块主要有requests(或者aiohttp),PyExecJS。
前者是请求文章的源码,后者是Python执行JS代码的依赖库,主要是生成视频地址
12
实现思路 1、主要需求是将原文中的视频和图片地址替换为本地存储地址。所以在视频分析过程中,需要下载资源,通过抓包找到对应的视频地址,但是要在源码和相关接口响应中找到。找不到对应的视频地址参数。
通过文章源码(HTML)浏览器渲染,发现video标签是后面生成的,视频地址也存在,那么这个标签肯定是JS生成的,通过搜索找到关键JS的标签脚本. 其次,分析该地址对应的JS,发现有生成的视频
标注的方法,推测有一种依次生成视频URL的方法,如下:
这里可以看到我们要的视频的URL是从哪里来的,方法如下:
分析方法,我们
发现有一个关键参数t,图2中我们找到了方法e,填入了参数v,这让我想起了var u = o.data., h = u对应返回的结果上一个采集数据包中的接口 .video_1, v = h., 123 3.接口为:/video/urls/1/今日头条/mp4/? =
接口返回结果:
同时在源码中可以找到该接口中的parameters(),可以进行正则匹配。
大家可以大胆尝试在生成视频URL的方法中加值,在JS的最底层添加参数,即:var c = new Array(-1, -1, -1, -1, -1, -1, - 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 , -1, -1,-1,-1 今日头条文章采集软件,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 , -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 , -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 , -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 1, -1, -1, -1, -1, -1, -1, -1, -1, -1 1, -1, -1, -1, -1, -1, -1, -1 , -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, - 1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7,8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1 , -1, 26, 27, 28, 29,30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);1
我用的是JS调试工具(方便调试,检查代码语法),其他方法都可以
结果是:/b //video/tos/
cn/tos-cn-ve-31//? a=2011&br=1368&bt=456&cr=0&cs=0&cv=1&dr=0&ds=1&er=&l=&lr=&=&qs=0&rc=%3D%3D&vl=&vr=
这个地址就是视频地址,所以
上面的猜想被证明是正确的,但是address参数是有时间限制的,所以需要动态改变。您可以自己测试重建。
代码和运行结果(我用了不同的方法)。
async def get_page_source(url):
browser = None
page = None
try:
browser = await launch(
headless=True,
ignoreHTTPSErrors=True,
handleSIGINT=False,
handleSIGTERM=False,
handleSIGHUP=False,
defaultViewport=None,
args=['--disable-setuid-sandbox',
'--no-sandbox',
'--ignore-certificate-errors',
'--disable-gpu',
'--disable-gpu-sandbox',
'--start-maximized'
]
)
pages = await browser.pages()
page = pages[0]
# 是否启用JS,enabled设为False,则无渲染效果
await page.setJavaScriptEnabled(enabled=True)
await page.setViewport(viewport={'width': 1200, 'height': 800})
await page.evaluateOnNewDocument(
'() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) }')
await page.evaluateOnNewDocument("() =>{ Object.defineProperty(navigator, 'plugins', { get: () => [] }) }")
await page.evaluateOnNewDocument(
<p>
" />
"() =>{ Object.defineProperty(navigator, 'languages', { get: () => ['zh-CN','zh] }) }")
await page.setUserAgent(
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36')
await page.goto(url, {'timeout': 5000, 'waitUntil': 'load'})
page_source = await page.content()
return page_source
except Exception as e:
# app_logger.error('账号:%s, 登录错误:%s' % (username, e))
print(e)
return -1
finally:
if page is not None:
# await page.waitFor(1000)
await page.close()
if browser is not None:
await browser.close()
async def get_data(url, continue_number=0):
"""解析文章源码,提取视频,文字,图片等信息"""
try:
page_source = await get_page_source(url)
# 视频处理,及视频封面
video_message_id_ = re.findall('tt-videoid="(.*?)"', page_source)
video_cover_ = re.findall('tt-poster="(.*?)"', page_source)
if len(video_message_id_) > 0 and len(video_cover_) > 0:
video_message_id = video_message_id_[0]
video_url = await get_video_url_id(video_message_id, url)
video_cover = await download_video_cover(video_cover_[0], url)
except Exception as e:
if continue_number
video_address = await get_data(url, continue_number)
return video_address
else:
# app_logger.error('function get_data : %s exceed maximum retry' % url)
return -1
async def get_video_url_id(video_id, article_url, continue_number=0):
"""解析视频main_url"""
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/83.0.4103.116 Safari/537.36'}
data_url = 'https://i.snssdk.com/video/urls/1/toutiao/mp4/{}'.format(video_id)
try:
async with aiohttp.ClientSession(connector=TCPConnector(verify_ssl=False), timeout=timeout) as session:
async with session.get(data_url, headers=header) as resp:
response = await resp.json()
if response['message'].strip() == "success":
data = response['data']['video_list']
keys = data.keys()
if 'video_3' in keys:
main_url = data['video_3']['main_url']
video_url = await get_video_url(main_url)
video_url_oss = await download_video(video_url, article_url)
" />
return video_url_oss
elif 'video_3' not in keys and 'video_2' in keys:
main_url = data['video_3']['main_url']
video_url = await get_video_url(main_url)
video_url_oss = await download_video(video_url, article_url)
return video_url_oss
else:
main_url = data['video_3']['main_url']
video_url = await get_video_url(main_url)
video_url_oss = await download_video(video_url, article_url)
return video_url_oss
except Exception as e:
if continue_number n;) {
do e = c[255 & t.charCodeAt(n++)];
while (a > n && -1 == e);
if ( - 1 == e) break;
do o = c[255 & t.charCodeAt(n++)];
while (a > n && -1 == o);
if ( - 1 == o) break;
s += String.fromCharCode(e 4);
do {
if (i = 255 & t.charCodeAt(n++), 61 == i) return s;
i = c[i]
} while ( a > n && - 1 == i );
if ( - 1 == i) break;
s += String.fromCharCode((15 & o) 2);
do {
if (r = 255 & t.charCodeAt(n++), 61 == r) return s;
r = c[r]
} while ( a > n && - 1 == r );
if ( - 1 == r) break;
s += String.fromCharCode((3 & i)