1.声明:本次只做测试用,禁止一切商业或者违法活动。
2. 配置环境
本次采用python3.6+scrapy+splash+mysql 等工具进行腾讯新闻列表抓取。由于腾讯新闻全部采用js动态渲染,爬出来得数据全部是js未渲染得东西,没有任何得数据,所以得借助splash 进行动态js渲染后,再进行爬取。这也是爬虫得一种思路。(有兴趣得同学可以看看selenium)
3.项目运行
安装python3.6就算了,scrapy安装看官网scrapy教程。splash 我使用的是docker 启动脚本
sudo docker run --name splash -p 8083:8050 scrapinghub/splash
启动后 访问 本地端口 8083
如上图输入你要爬取的页面地址,然后点击Render me 后会出现js渲染过的页面。
该图中输出html则为渲染过的页面dom元素。
也就是说采用爬虫直接访问由splash渲染过的页面即可
4.页面分析:
本次只需要获取新闻的标题,发布时间,来源,详细地址等。由于腾讯采用懒加载技术,导致新闻图片无法获取。
通过打开新闻页面分析可以看到。
在id=List 的Div里面有一个 id=List的ul 元素 ,我们所需要的新闻列表就在ul的li里面。找到了目标位置那我们就需要进行解析了,本次采用的xpath进行解析,具体方法请参考 scrapy中选择器
5.编码实现
核心代码如下
通过这里基本上就能获取到想要的数据。当然这如果新闻列表结果变化的话 还得根据实际情况进行解析数据。
6.数据持久化。
爬到的数据肯定是要存到数据库再进行分析才能体现爬虫的价值对吧。好的,先来定义数据结构字典。
在data目录中定义数据结构字典,然后再数据分析时导入,赋值即可。如上上图返回数据处。itme是会返回一个字典类型数据,再每一次数据处理完后,采用yiled返回这个数据。至于yiled是什么意思,请参考我i的另一篇文章 python中的yield 。此时离成功就有只有一步之遥了。
scrapy提供了该方法。
在配置文件中的该处表示,yield item的时候会调用该方法。并且将本次itme传入这个方法。入库操作就在这里完成即可。
正如上图,process_itme()方法名是默认的,不可变。至此爬到的数据将保存在数据库
至此,爬取新闻实验,告一段落。
7.总结
一入爬虫深似海,爬虫与反爬虫,就像矛与盾的关系。各种反爬技术,需要学习的还很多。(图片懒加载的问题还没解决略有遗憾)。还是要多练习,积累经验。