python_爬虫_腾讯新闻app 单页新闻数据分析爬取
p.p2 { margin: 0; font: 11px “Helvetica Neue”; color: rgba(0, 0, 0, 1); -webkit-text-stroke: #000000; min-height: 12px }
p.p3 { margin: 0; font: 11px “PingFang SC”; color: rgba(0, 0, 0, 1); -webkit-text-stroke: #000000 }
span.s1 { font: 11px “PingFang SC”; font-kerning: none }
span.s2 { font-kerning: none }
span.s3 { font: 11px “Helvetica Neue”; font-kerning: none }
span.Apple-tab-span { white-space: pre }
软件:charles、pycharm
平台:mac
网址:https://view.inews.qq.com/a/20180718A1WSEB00?uid=
第一步:获取api接口
1、电脑中安装charles抓包软件,与手机处于同一wifi网络下,将charles作为手机端的代理服务器。
主机名:IP地址为电脑端的IP,
端口号:根据电脑端的charles软件设置为8888
2、打开手机端腾讯新闻app,charles软件抓取具体api接口(这里不详细介绍)得到接口:https://view.inews.qq.com/a/20180718A1WSEB00?uid=
第二步:分析
1、查看 通过Chrome浏览器检查看到代码无问题
但打开源代码,是这样的,说明网页数据提取之后还需要进行转码
这样肯定没有办法提取,所以主要的问题,集中在了解析网页的数据构成,以及解析。
2、分析 这次单页面主要爬取的信息就两种,新闻文本、以及图片。
先说文字,源代码里js代码与unicode混在一起,看的眼晕头发麻,所以最主要是要将内容分离。再转码。这个页面提取时,我是分两步,第一步,先提取文字,再提取图片
先从文章作者那里开始,通过re匹配提取整篇文件,提取后的数据进行转码后是这个样子的,图片的url还需要进行提取,所以还需要再使用一次re匹配,单独提出图片的地址,并将图片中的图片地址进行替换(替换成本地或者网上的url)
第三步:代码
import json,re import requests def getImg(): response = requests.get(\'http://view.inews.qq.com/a/20180718A1WSEB00?uid=\') html = response.text # ------------------------------ news_pat = re.compile(r\'\"cnt_html":\"(.*)\",\"content":\[{"type\":\"cnt_article\",\"desc\":\',re.S) news = news_pat.search(html).group(1).encode(\'utf-8\').decode(\'unicode_escape\').replace(\'\/\',\'/\') # 源新闻 img_list = [] info_pat = re.compile(r\'("content":\[{"type\":\"cnt_article\".*?)</script>\',re.S) # 获取图片地址的正则 result = info_pat.search(html).group(1) img_pat = re.compile(r\'{"type":"img_url".*?"desc":null}\') img_resu = img_pat.findall(result) for rese in img_resu: res = json.loads(rese) img_list.append(res[\'img_url\']) # 图片地址,存储成一个列表 imgurl_pat = re.compile(r\'(<!--IMG_.*?-->)\') # 获取文件中图片url并替换的正则 img_url = imgurl_pat.findall(news) for i in range(len(img_list)): if img_url[i] in news: news = news.replace(img_url[i], \'<img src="\'+img_list[i]+\'" alt="">\') else: print(\'不成功\') print(news) if __name__ == \'__main__\': getImg()
最终将内容简单保存在html文件里,效果如下
这条新闻的提取难度主要就在解析上,几个正则干下来有些蒙。 上面的代码就是最终,但暂时没有下载图片,并且也没有把信息存数据库,也没有title\time\author等条目,仅做爬虫练习。
另外,求份爬虫工作~~~