2. 如果同一个数据源有多种形式(比如电脑版、手机版、客户端等) , 优先选取较为“纯净的”展现 。比如新浪微博 , 有网页版 , 也有手机版 , 而且手机版可以用电脑浏览器访问 , 这时我优先选手机版新浪微博 。
3. 爬虫一般是将网页下载到本地 , 再通过某些方式提取出感兴趣的信息 。也就是说 , 爬取网页只完成了一半 , 你还要将你感兴趣的信息从下载下来的html文件中提取出来 。这时就需要一些xml的知识了 , 在这个项目中 , 博主用的是XPath提取信息 , 另外可以使用XQuery等等其他技术 , 详情请访问w3cschool 。
4. 爬虫应该尽量模仿人类 , 现在网站反爬机制已经比较发达 , 从验证码到禁IP , 爬虫技术和反爬技术可谓不断博弈 。
0x02. 开始
决定了爬虫的目标之后 , 首先应该访问目标网页 , 明确目标网页属于上述几种爬虫的哪种 , 另外 , 记录为了得到感兴趣的信息你需要进行的步骤 , 如是否需要登录 , 如果需要登录 , 是否需要验证码;你要进行哪些操作才能获得希望得到的信息 , 是否需要提交某些表单;你希望得到的信息所在页面的url有什么规律等等 。
以下博文以博主项目为例 , 该项目爬取特定新浪微博用户从注册至今的所有微博博文和根据关键词爬取100页微博博文(大约1000条) 。
0x03. 收集必要信息
首先访问目标网页 , 发现需要登录 , 进入登录页面如下新浪微博手机版登录页面
注意url后半段有很多形如”%xx”的转义字符 , 本文后面将会讲到 。
从这个页面可以看到 , 登录新浪微博手机版需要填写账号、密码和验证码 。
这个验证码是近期(本文创作于2016.3.11)才需要提供的 , 如果不需要提供验证码的话 , 将有两种 *** 进行登录 。
之一种是填写账号密码之后执行js模拟点击“登录”按钮 , 博主之前写过一个Java爬虫就是利用这个 *** , 但是现在找不到工程了 , 在此不再赘述 。
第二种需要一定HTTP基础 , 提交包含所需信息的HTTP POST请求 。我们需要Wireshark 工具来抓取登录微博时我们发出和接收的数据包 。如下图我抓取了在登录时发出和接收的数据包Wireshark抓取结果1
在搜索栏提供搜索条件”http”可得到所有http协议数据包 , 右侧info显示该数据包的缩略信息 。图中蓝色一行是POST请求 , 并且info中有”login” , 可以初步判断这个请求是登录时发出的之一个数据包 , 并且这个180.149.153.4应该是新浪微博手机版登录认证的服务器IP地址 , 此时我们并没有任何的cookie 。
在序号为30是数据包中有一个从该IP发出的HTTP数据包 , 里面有四个Set-Cookie字段 , 这些cookie将是我们爬虫的基础 。
Wireshark抓取结果2
早在新浪微博服务器反爬机制升级之前 , 登录是不需要验证码的 , 通过提交POST请求 , 可以拿到这些cookie , 在项目源码中的TestCookie.py中有示例代码 。
ps.如果没有wireshark或者不想这么麻烦的话 , 可以用浏览器的开发者工具 , 以chrome为例 , 在登录前打开开发者工具 , 转到Network , 登录 , 可以看到发出和接收的数据 , 登录完成后可以看到cookies , 如下图chrome开发者工具
接下来访问所需页面 , 查看页面url是否有某种规律 。由于本项目目标之一是获取某用户的全部微博 , 所以直接访问该用户的微博页面 , 以央视新闻 为例 。
央视新闻1
图为央视新闻微博之一页 , 观察该页面的url可以发现 , 新浪微博手机版的微博页面url组成是 “weibo.cn/(displayID)?page=(pagenum)”。这将成为我们爬虫拼接url的依据 。
接下来查看网页源码 , 找到我们希望得到的信息的位置 。打开浏览器开发者工具 , 直接定位某条微博 , 可以发现它的位置 , 如下所示 。
xpath
观察html代码发现 , 所有的微博都在div标签里 , 并且这个标签里有两个属性 , 其中class属性为”c” , 和一个唯一的id属性值 。得到这个信息有助于将所需信息提取出来 。
推荐阅读
- 汽车排行榜「汽车排行榜suv销量排行」
- 腹黑王爷傻相公「腹黑王爷傻相公讲的什么」
- 中国十大化妆品公司「中国十大化妆品公司排行榜」
- 尚美戒指编号查真伪「尚美戒指怎么看真假」
- 公积金有4000能贷款吗「公积金里面4000能贷款」
- 做一面旗大约多少钱「做一面旗大约多少钱一斤」
- 苏绣教程初学者视频「苏绣教程初学者视频教程百度云」
- 飞天茅台一升市场价「飞天茅台 市价」
- 赠汪伦古诗的意思「赠汪伦古诗的意思翻译视频」
- 沈阳师范算是好大学吗「沈阳大学师范学院和沈阳师范大学」