文章说明:本文是在学习一个网络爬虫课程时所做笔记,文章如有不对的地方,欢迎指出,积极讨论
针对动态页面抓取的两个思路
1.营造一个浏览器的环境,让它去运行js文件(PhantomJS+Selenium)
2.直接分析接口,通过接口拿到数据 (API)
一、使用Selenium + PhantomJS抓取
(一)PhantomJS:headless的类似于chrome的浏览器
(1)基于webkit的javasscript API。
开源的浏览器引擎
浏览器内核:浏览器最核心的部分‘RederingEngine’,可大概翻译为‘喧嚷引擎’。负责网页语法的解释并渲染网页,决定了浏览器如何显示网页的内容以及页面的信息。不同的浏览器内核对网页编写的语法的解释有所不同。
API:是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。 类似于函数,编写一个DLL的时候,里面输出的函数就是这个DLL的例程。
DLL(DynamicLink Library)文件:动态链接库文件。
(2)它使用Qtwebkit作为它的核心浏览器功能,使用webkit来编译解释执行JavaScript代码。任何你可以在基于webkit做的事情,它都能做到。它不仅是一个隐形的浏览器,提供了诸如CSS选择器、支持Web标准、DOM操作、JSON、HTML5、Canvas、SVG等,同时也提供了处理I/O的操作,从而使你可以向操作系统读写文件等。
JSON:(JavaScript Object Notation)JS对象标记,是一种轻量级的数据交换格式。
:是一个可以使用脚本(通常为JavaScript)在其中绘制图形的HTML元素。它可用制作照片集或者制作简单的动画。
SVG:(Scalable Vector Graphics)可缩放矢量图形,是基于XML,用于描述二位矢量图形的一种图形格式。由万维网指定,是一个开放标准。
I/O:(Input/Output)输入/输出端口,也称计算机接口。每个设备都会有一个专用的I/O地址,用来处理自己的输入输出信息。
GUI:(Graphical User Agent)图形用户界面
IDE:(Integrated Development Environment)集成开发环境,是用于提供程序开发环境的应用程序
(3)用处广泛:网络监测、网页截屏、无需浏览器的web测试、页面访问自动化等。
(二)selenium
python中的一个webdriver
二、微博分析
抓取思路,使用两个spider
spider1:获取用户列表(作为漫游weibo的外链)
spider2:获取feed流(微博信息)
(一)登录
1.最重要的是设置 user-agent,否则无法跳转
2.输入用户名和密码
Class:是一系列值;返回数组
Id:是唯一值;返回唯一值
1.相关的JavaScript代码
2.通过selenium提供的send_keys来传递value
(二)微博用户提取
微博外链使用ta的关注列表,而不是粉丝,主要基于两点:
1.关注的微博一般都是有质量的,而粉丝的微博是劣质(low quantity)的,其中不乏很多僵尸粉
2.粉丝的数量一般都是比较庞大的,对于反爬来说,不可能让我们进行深翻页(翻页对于DB有很大的负担,有深翻页行为的基本都是机器人,这样就会被屏蔽掉)
微博外链:driver.find_element_by_xpath(‘//a[@class=”t_linkS_txt1”]’)
打开关注列表页:driver.find_element_by_xpath(‘//a[@class=”t_linkS_txt1”]’).get_attribute(‘href’)
获取所有关注的微博号的地址:
driver.find_element_by_xpath(‘//*[contains(@class,”follow_item”)]//a[@class=”S_txt1”]’)
过滤掉劣质(lowquantity)用户,
1.不活跃的用户(僵尸)。微博数小于一个阈值
2.营销号 。微博数大于一个阈值
提取步骤:
1.滚屏; 2.提取; 3.翻页。
(三)微博信息提取
微博名:driver.find_element_by_tag_name(‘h1’)
所有的Feed:driver.find_elements_by_class_name(‘WB_detail’)
微博的图片,只需要保存图片名
http://wx2.sinaimg.cn/thumb150/4b7ljfaod43.jpg
http://存储域名/分辨率/文件名
滚频与翻页:每次滚动后,检查是否已经出现了
1.微博的下一页:
driver..find_element_by_xpath(‘//a[@class=”pagenext S_txt1 S_line1”]’).click()
每次滚动后,检查是否已经出现了“下一页”的按钮,如果是则可以停止滚屏,否则检查是否出现了“网络超时”的链接,是的话,点击这个链接来重新加载。
2.翻页命令:
driver.excute_script9(‘window.scrollTo(0,document.body.scrollHeight)’)
关注列表的下一页和微博的下一页是一样的(class:page next S_txt1)
三、微博接口分析
逆向分析一个动态网页:找接口,找规律
post-man:Google的chrome下的一个JSON插件
微博手机端(m.weibo.cn):它的接口更简单,更容易分析(都是简单的feed流)
对于任意的GET方法:
protocol://domain/path?parameters
很有可能对我们是没用的
(一)个人首页(例如姚晨的微博)
可以直接尝试:https://m.weibo.cn/u/1266321801
(二)个人feed流
https://m.weibo.cn/api/container/getIndex?type=uid&value=1266321801&containerid=1076031266321801&page=2
type:通过uid方式查询
value:user id
containerid:容器的id号 = 107603 +uid
page:当前请求的页码