前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >最容易上手的爬虫项目

最容易上手的爬虫项目

作者头像
stormwen
发布2019-08-05 11:52:50
5000
发布2019-08-05 11:52:50
举报
文章被收录于专栏:公众号:googpy

阅读文本大概需要 6 分钟。

今天和大家分享一个自己写的爬取「博客园」的爬虫项目。

1.确定爬取的目标

开始之前我们需要确定一个爬取的目标,从博客园上选一个博主的首页进入。在这个例子里面我们要写一个爬虫将博主的文章列表拉出来,保存在一个JSON的文件里面。

2. “种子”的分析,生成爬虫入口

在谷歌浏览器中,打开开发者选项(F12),如图所示,这次项目主要爬取的内容有:发表日期、原文链接、文章标题以及文章摘要。

将网页中的元素选择器写到表内:

名称

字段

选择器

标题

Title

.postTitle>a

摘要

Summary

.postCon

发表日期

Pub_date

.dayTitle

原文链接

Parmerlink

.postTitle>a

下面是对整个爬虫编程思路的整理:

3.编码

我用的是pycharm编辑器,按照上述思路进行编码。

导入必要的依赖包

代码语言:javascript
复制
from __future__ import unicode_literals
from urllib import request
from pyquery import PyQuery as pq
import json

生成种子页的HTTP请求

代码语言:javascript
复制
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函数完成这一转换。

根据上面的分析,代码如下:

代码语言:javascript
复制
from __future__ import unicode_literals
from urllib import request
from pyquery import PyQuery as pq
import json

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的文件,打开它后的样子是:

代码语言:javascript
复制
{"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. 设计代码流程与编写思路

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 googpy 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
人脸识别
腾讯云神图·人脸识别(Face Recognition)基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、比对、搜索、验证、五官定位、活体检测等多种功能,为开发者和企业提供高性能高可用的人脸识别服务。 可应用于在线娱乐、在线身份认证等多种应用场景,充分满足各行业客户的人脸属性识别及用户身份确认等需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档