需求#

目标是写一个采集新闻标题的爬虫,然后统计标题中某些词汇的出现次数。

因为说希望统计 小米,华为 这类词汇的出现次数,所以我把信息锁定在手机类...

没用 Python 写过东西,也没自己写过爬虫...心想难度应该不大,而且原理大概差不多吧...

分析#

下面是我尝试历程的简单分析,获取腾讯新闻数据的详细步骤请看最下面的“其他”。 **

第一步分析网页。

先尝试今日头条,用的 ajax,不能从 url 分析了。然后找到了接口。

https://www.toutiao.com/api/pc/feed/?category=news_tech&utm_source=toutiao&widen=1&max_behot_time=1529885566&max_behot_time_tmp=1529885566&tadrequire=true&as=A115CBD390DBC19&cp=5B30BBCC1149DE1&_signature=SKf6EAAAE5jSs6RP3-hx0kin-g

这个接口可以直接用,不会出现 forbid 之类的防御,但是翻页的参数有点诡异(百度上有说明),我就放弃了。

然后腾讯新闻。

美滋滋。接口为:

http://pacaio.match.qq.com/irs/rcd?cid=52&token=8f6b50e1667f130c10f981309e1d8200&ext=4101,4104,604&page=1&expIds=20180624A0X69P|20180624A0WEN3|20180624A0UU3Y|20180624A0HH3V|20180624A0OUYY|20180624A0PX0G|20180624A0QDNG|20180623A0XRWW|20180624A0OXYP|20180624A0P9RG|20180624010887|20180624A0O3QI|20180624A0K2NP|20180624A0L1PR|20180624A0JPI9|20180624A0J8ME|20180624A0I8WL|20180624A0HAP6|20180624A0FFU6|20180624A0F4RS&callback=__jp9

直接传 page 就行了。

发现另外有几个参数不传也没啥影响。稍微精简了下。

http://pacaio.match.qq.com/irs/rcd?cid=52&token=8f6b50e1667f130c10f981309e1d8200&ext=4101,4104,604&page=page

这个接口需要设定一下请求头,把浏览器的复制过来就行了...

然后就是传参,获取数据,储存数据...balabala

接口获取的就是 json 格式的数据,处理起来很方便。

爬数据的时候用 sleep 降低了频率(为了避免被限制),实际上好像并不需要(万一呢)...

关于 Python#

有些关于 Python 语法的问题,都注释在代码了。

先用的 2.7 写的,在终端不能打印中文,就换了 3 。然后遇到了一些版本更替后的问题。

哎哟好麻烦哦...

3 和 2 变化挺大的,比如 3 可以直接使用中文词频统计...

源码#

tencent-news-spider-py

其他#

我在上面使用了“获取”,而没有用爬取,是因为突然发现利用接口得到数据,好像并不是那么“爬虫”...但是没办法,它数据就是这样来的嘛...

http://new.qq.com/ch2/phone

这是数据来源地址,浏览一下就会发现,加载数据(新闻)的时候网址没有变化。

所以不能使用通常老师在课堂上教的那种改动 url ,正则表达式解析网页的方式来获取数据了...

如果用的话,只能获取第一页的数据...不能请求到后面的数据。

思考:这应该是使用了 ajax,那么也就应该有一个返回 json 格式数据的接口。我们可以通过这个接口获得数据。(经验得出的结论)

审查,网络,找到了返回 json 数据的接口,就是上面那个。

直接访问,被拒绝了,501 。

尝试加上请求头,请求成功,返回的果然是新闻信息。

然后就是从 json 新闻信息里提取自己需要的信息了...

对于只想爬数据的人来说,这里难点应该就只在获取 ajax 动态页面的数据。然后接触到了新的东西,json 格式的数据 ...

这真是吃饱了撑的,整些这些莫名其妙的东西...

不过这样子获取数据的效率反而高了啊,,,

之前是把数据渲染到网页,我们再从网页拔下来...现在直接把数据发给了我们,多好...

当然,前提是不像今日头条那样搞些加密...

至于这些网站为什么要这样搞,大概涉及到开发上面的更高更快更强,以及为用户提供更好的体验这两方面。

总之这些网站不是吃饱了撑的,而是因为其他某些原因,使用了这样的方式来展示网页。

所以我们就得使用这样的方式去搞咯...

VS Code 写 Python#

VS Code 写 Python