爬虫(爬取36kr新闻)(未完成)

爬取36kr网站的经历

虽然之前老是听同学提起网络爬虫,但是自己一直没有尝试过。这次因为项目需要,我也开始了爬虫之旅。跌跌撞撞,特此记录,希望能够帮助到一些人,也是对自己的一个总结提高。


设计到的知识

  1. 前端相关的知识:HTML,JavaScript。要能看得懂HTML代码,会分析网页是如何生成的。
  2. 使用的语言:Python
  3. 使用的框架:scrapy
  4. 会写正则表达式,能从HTML文本中提取出自己需要的文本内容。

任务及解决思路

1.任务:
抓取36kr官网上的新闻:http://36kr.com/news
2.解决思路:
两级爬取:
(1)从http://36kr.com/news上,把新闻列表中的每个新闻的title,link,date,desc(简单描述)爬取出来。
(2)对于上面的每个新闻,按照url,爬取保存新闻的内容。

爬虫过程

刚开始我自己搜到了一个简单的爬虫程序,代码如下所示。它爬取了hao123的门户网站,并且能够寻找超链接,一直爬下去,通过它,我对爬虫有了初步的了解。代码黏贴!!!!!
在此基础上,我决定使用scrapy框架实现我的爬虫。在框架之上,比较容易维护,开发。所以,我安装了scrapy(见资料共享1),并且运行了几个实例(见资料共享2),把scrapy的原理差不多搞通啦。
接下来,我修改了一下实例代码,试图爬取36kr网站新闻。但是始终都爬取不到数据。输出response.body,是有内容的,但是后面提取标题等具体信息是都是空的list。请教同学才知道,因为36kr官网的网页是动态生成的,它前端采用了react 渲染技术,模板与数据相分离,并不像传统的静态网页一样。需要特别分析它,才能想办法爬取到。
因为我只懂一点HTML,不懂JavaScript,ajax这些动态网页前端技术,抓取动态生成的网页花费了我几天的时间。后来解决的思路是:先使用chrome的开发者工具(网页上右键:审查代码),然后点击Network,点击XHR,通过它可以查看,当你进入某个网页(或者网页中的某个子标题)时,是否有ajax请求,如果有的话,它会列出具体的请求网址。找到这个网址,就可以进行抓取。
通过分析,36kr的新闻列表,是ajax动态生成的,它其实是通过(完善)*这个url得到的,打开后,发现,它本身是一个json数据格式的文件。这样,直接拿到这个url进行爬取,并处理这个json数据,提取需要的信息即可。分析这个url发现,??????(完善)代表各个栏目的标号,而“最新文章”里的文章是包含了“明星公司”,“早期项目”,“深度报道”,“技能GET”,“行业研究”。所以,我们只需从最新文章中即可拿到所有的新闻。

对于具体的每个新闻的content页,发现,每个新闻的url,例如http://36kr.com/p/5053953.html ,前面的都一样,后面的是*id,而且,最新的新闻的id号最大,若依次递减,进行访问,那么就可以把所有的新闻内容页爬取到啦。

资料共享

1.安装scapy:
http://www.cnblogs.com/QuDump/p/3750447.html
2.scrapy简单使用(能跑通):
http://blog.csdn.net/u012150179/article/details/32343635
http://blog.csdn.net/zq602316498/article/details/37967503
3.爬取36kr官网之新闻页爬取第一层代码:爬取保存文章的title,date,link,desc(简单描述)
4.爬取36kr官网之新闻页爬取第二层代码:爬取保存文章的具体content。

反思与提高

1.Python中各种类型,特别容易出现错误。可以print type(),查看类型,然后解决问题。
2.中文编码(乱码)的问题:
http://www.68idc.cn/help/jiabenmake/python/20150227234550.html
3.正则表达式有一个在线测试(useful):
http://tool.oschina.net/regex
4.使用chrome开发者工具(Ctrl+shift+i)查看网页的进行代码审查,分析网页是动态网页,还是动态生成的;对于静态网页,比较简单。直接将地址栏中的网址抓取,提取相应标签即可。对于动态网页,直接按照网址栏里的网址抓取是抓不到内容的。需要查看ajax请求,找到,动态请求的地址,用这个地址来进行抓取,才能拿到数据。
5.chrome的xpath helper插件,帮助你正确书写xpath,提取相应的标签。(安装后,ctrl+shift+x启动,在相应的内容上,按住shift,helper框里就会显示它的xpath)

代码块

代码块语法遵循标准markdown代码,例如:

我的代码:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值