1.确定爬取的目标
开始之前我们需要确定一个爬取的目标,从博客园上选一个博主的首页进入。在这个例子里面我们要写一个爬虫将博主的文章列表拉出来,保存在一个JSON的文件里面。
2. “种子”的分析,生成爬虫入口
在谷歌浏览器中,打开开发者选项(F12),如图所示,这次项目主要爬取的内容有:发表日期、原文链接、文章标题以及文章摘要。
将网页中的元素选择器写到表内:
下面是对整个爬虫编程思路的整理:
3.编码
我用的是pycharm编辑器,按照上述思路进行编码。
导入必要的依赖包
from __future__ import unicode_literals
from urllib import request
from pyquery import PyQuery as pq
import json
'''
更多Python学习资料以及源码教程资料,可以在群1136201545免费获取
'''
生成种子页的HTTP请求
url = 'https://www.cnblogs.com/Ray-liang/'
with request.urlopen(url) as response:
body = response.read()
item = [] #1. 先定义一个空数组,用于储存提取结果
with open('output.json', 'wt') as f: # 2 将结果写入JSON文件
f.write(json.dumps(items))
上面代码中用到了Python文件处理的知识,with语句是用于指定f的作用域,当f.write调用完成跳出with子句时就会被关闭,这样可以防止打开文件后忘记调用close而锁住文件导致其它的进程不能访问。
还用到了json.dumps方法,将items直接序列化成一个标准的JSON字符串,最后将这个JSON字符串通过调用file对象的write方法写入到文件内。
现在需要解决的是如何生成这个items中的对象数据?
首先,需要将body中的内容读到pyQuery中,然后选出所有的文章元素,最后通过循环每个元素来处理,将元素的值生成一个数据项填充到items中。
文章列表的选择器为.forFlow>.day,而这个选择器一旦执行会返回多个元素的集合,而且我们需要将这个元素集合转化成一个item类型的集合,所以用pyQuery.map函数完成这一转换。
根据上面的分析,代码如下:
from __future__ import unicode_literals
from urllib import request
from pyquery import PyQuery as pq
import json
'''
更多Python学习资料以及源码教程资料,可以在群1136201545免费获取
'''
url = 'https://www.cnblogs.com/baozitraining/'
def parse_item(i, e):
doc = pq(e)
title = doc('.postTitle>a').text()
parmerlink = doc('.postTitle>a').attr('href')
pub_date = doc('.dayTitle').text()
summary = doc('.postCon').text()
result = {
'title': title,
'parmerlink': parmerlink,
'pub_date': pub_date,
'summary': summary
}
print(json.dumps(result))
return result
with request.urlopen(url) as response:
body = response.read()
doc = pq(body)
items = doc('.forFlow>.day').map(parse_item)
with open('output.json', 'wt') as f:
f.write(json.dumps(items, ensure_ascii=False))
需要说明的是,代码中map函数是一个高阶函数,它的参数是另一个处理函数的指针,所以这里引用一个parse_item,这个函数的内部实际上是一个循环,它会将doc(.’forFlow>.day’)一个个传入到parse_item函数中,当循环执行结束后再将多次从parse_item获取的结果合成为一个数组返回。
此外,在代码第一行加入 __future__模块,目的是解决json.dumps对字符内容进行unicode编码的问题,完成后就会发现在当前爬虫工作目录中会多一个名为output.json的文件,打开它后的样子是:
{"title": "HAAR与DLib的实时人脸检测之实现与对比", "parmerlink": "https://www.cnblogs.com/Ray-liang/p/9900473.html", "pub_date": "2018年11月3日", "summary": "摘要: 人脸检测方法有许多,比如opencv自带的人脸Haar特征分类器和dlib人脸检测方法等。 对于opencv的人脸检测方法,优点是简单,快速;存在的问题是人脸检测效果不好。正面/垂直/光线较好的人脸,该方法可以检测出来,而侧面/歪斜/光线不好的人脸,无法检测。因此,该方法不适合现场应用。而对于dli阅读全文"}
...
总结
设计一个完整爬虫的思路与过程是:
- 确定爬取目标,分析种子页结构
- 分析承载数据页面结构,建立数据结构与元素选择器间的映射关系
- 设计代码流程与编写思路
一个特别适合初学爬虫者的项目,感兴趣的小伙伴赶紧运行代码看看吧!