有时候我也会写正经的东西
本文略具有专业性,如果你没接触过编程或者web开发,可以关了
最早用python写爬虫,还是几年前,那会流量资费还很贵,我妈还喜欢看小说,又舍不得流量在线看,那会我就编出了一个爬小说的程序,爬下了2个G的小说。
今天就来尝试爬取一下《今日头条》的新闻,当然,本文写的程序实际上是没什么用的,但是我认为可以给你一个写爬虫的思路,无论你用什么语言,无非都是这么回事。
本人写python的环境:pycharm+anaconda+macOS+python3.6
可能会用到的库:
解释一下,re正则表达式模块,time故名思义操作时间的功能模块,urllib是操作url的功能模块,json一目了然是用来解析json数据的。
说明一下为什么爬取《今日头条》,我看了一下几个主流的新闻网站,《网易新闻》和《新浪新闻》都太普通了,一看html就能分析出来了,《今日头条》就比较有意思了,它的内容是用js动态加载进来的,更多的往下看便是。
先来尝试打开《今日头条》的热点新闻
运行一下看一下结果
确实响应回来的是首页的html代码,但是如果你仔细看一遍你会发现,首页的新闻标题都不在这里,这就比较有意思了,接下来我们就要去浏览器上找一下内容在哪里了,这里我用的是safari,各位自行对比:
这是我写文章的时间给我推荐的新闻
接下来我们要打开开发者工具,依次资源->XHR(XmlHttpResponse)
xhr下面是服务器返回的json数据,看一下右面的数据的title,是不是和上一张图片我所截下来的新闻一样,这说明没跑了,这个feed就是我所需要的所有新闻的标题链接等等。所以我们看一下feed的链接,并把代码里的target_url修改一下。
但是发现出现了个问题,执行一下代码发现
数据没有返回,这事为什么呢?其实头条的网站已经做了反爬取的措施,所以接下来我们要伪装一下,我们要写一下请求头,来伪装成浏览器,最简单的方式
把蓝色开头的(除了HOST)都拷贝下来,但是经过我测试,头条并没有反爬取反的那么厉害,我们只要把User-Agent这一段拷贝下来用就可以了。User Agent中文名为用户代理,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言。再来看一下结果。
注意代码修改的地方,一目了然返回的结果已经成功了,接下来就是分析数据了
其实已经很明显了,所有的新闻都放在这个data里,里面是每条新闻的信息,每条里面title就是新闻的标题,source_url(根url)就是这篇新闻点击之后的路径。好的,我们先把这两个关键信息提取出来。最后贴一遍完整代码
看一下结果:
已经成功获取到了信息,但实际上只有第一页的数据,头条的翻页方式也比较有意思,应该是当前主流网站都采用的瀑布流式分页,就是你一直往下划鼠标划不到底,置于如何获取翻页的数据,篇幅限制,我大概会在下一篇里详细来教大家解析,我们暂时就先获取第一页的新闻吧。
实际上光有这些url还不够,直接扔到浏览器上会提示你
这些链接实际是要拼在头条首页后的,比如“/group/6548634863220556301/”要拼写成“https://www.toutiao.com/group/6548634863220556301/”才能够正确的去访问新闻,所以继续写代码,重新组合一下代码,以下的代码都是继续写到上述代码下面的。还有一点,注意看一下上面打印结果,有一条的url是蓝色的,这个是广告,我们不需要的,所以要把它剔除,整理下代码
解释一下,正则表达式不多说,这里主要就是匹配是否有http开头的内容,其次在循环这里加了个时间间隔,因为计算机的运行速度大家都知道,这么频繁的去访问服务器无异于是对服务器攻击,爬取别人的东西本来就不道德了,所以建议大家加个限制,如果你非要速度访问,那也没招,不过我建议你使用代理ip,如果被检测到你攻击服务器,对方是有可能封锁你的ip的。
接下来就是访问新闻链接了,响应的结果一般有两种,一种是重定向到外网站,一般返回的都是html代码,只需要用正则表达式把“
”标签内的内容取出来就好,还有一种就是在《今日头条》上发布的新闻,所以还是一样的尿性,为此我的做法是又写了两个正则表达式,当然有更好的方法,在此不多叙述
返回的如果是html文档,那我只要把p标签的内容全部取出来就好了,对付头条的要使用另外的方法,具体自己去研究吧,这里我偷懒只匹配中文,意思的能懂就好了。接下来开始写文件
好的,去路径下面看一下结果吧
我们在看一下里面的内容
内容都爬取下来了,至于怎么让他有格式,怎么顺便把图片爬取下来,这就是后话了。
这里不是来教你敲代码,只是给你一个写爬虫的思路,你可以去爬取很多东西,比如电影、音乐、图片。不管什么,都是反复的去分析请求和响应以及数据结构。最后再贴一下代码,当然在公司你如果写成这样的代码,你就快离职了,而且维护起来也费劲。
纯手敲,记得点个赞啊。下次我会继续写分页的爬取的。欢迎关注。
领取专属 10元无门槛券
私享最新 技术干货