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阅读全文"}
...

总结

设计一个完整爬虫的思路与过程是:

  1. 确定爬取目标,分析种子页结构
  2. 分析承载数据页面结构,建立数据结构与元素选择器间的映射关系
  3. 设计代码流程与编写思路

一个特别适合初学爬虫者的项目,感兴趣的小伙伴赶紧运行代码看看吧!


本文转载:CSDN博客