2022 年最新 Python3 网络爬虫教程
大家好,我是崔庆才,由于爬虫技术不断迭代升级,一些旧的教程已经过时、案例已经过期,最前沿的爬虫技术比如异步、JavaScript 逆向、安卓逆向、智能解析、WebAssembly、大规模分布式、Kubernetes 等技术层出不穷,我最近新出了一套最新最全面的 Python3 网络爬虫系列教程。
博主自荐:截止 2022 年,可以将最前沿最全面的爬虫技术都涵盖的教程,如异步、JavaScript 逆向、安卓逆向、智能解析、WebAssembly、大规模分布式、Kubernetes 等,市面上目前就这一套了。
最新教程对旧的爬虫技术内容进行了全面更新,搭建了全新的案例平台进行全面讲解,保证案例稳定有效不过期。
教程请移步:
如下为原文。
大家好,本次为大家带来的是抓取爱问知识人的问题并将问题和答案保存到数据库的方法,涉及的内容包括:
- Urllib 的用法及异常处理
- Beautiful Soup 的简单应用
- MySQLdb 的基础用法
- 正则表达式的简单应用
环境配置
在这之前,我们需要先配置一下环境,我的 Python 的版本为 2.7,需要额外安装的库有两个,一个是 Beautiful Soup,一个是 MySQLdb,在这里附上两个库的下载地址, Beautiful Soup MySQLdb 大家可以下载之后通过如下命令安装
1 |
python setup.py install |
环境配置好之后,我们便可以开心地撸爬虫了
框架思路
首先我们随便找一个分类地址,外语学习 - 爱问知识人,打开之后可以看到一系列的问题列表。 我们在这个页面需要获取的东西有: 总的页码数,每一页的所有问题链接。 接下来我们需要遍历所有的问题,来抓取每一个详情页面,提取问题,问题内容,回答者,回答时间,回答内容。 最后,我们需要把这些内容存储到数据库中。
要点简析
其实大部分内容相信大家会了前面的内容,这里的爬虫思路已经融汇贯通了,这里就说一下一些扩展的功能
1.日志输出
日志输出,我们要输出时间和爬取的状态,比如像下面这样:
[2015-08-10 03:05:20] 113011 号问题存在其他答案 我个人认为应该是樱桃沟很美的 [2015-08-10 03:05:20] 保存到数据库,此问题的 ID 为 113011 [2015-08-10 03:05:20] 当前爬取第 2 的内容,发现一个问题 百度有一个地方,花儿带着芳香,水儿流淌奔腾是什么意思 多多帮忙哦 回答数量 1 [2015-08-10 03:05:19] 保存到数据库,此问题的 ID 为 113010
所以,我们需要引入时间函数,然后写一个获取当前时间的函数
1 |
import time |
以上分别是获取带具体时间和获取日期的函数,在输出时,我们可以在输出语句的前面调用这函数即可。 然后我们需要将缓冲区设置输出到 log 中,在程序的最前面加上这两句即可
1 |
f_handler=open('out.log', 'w') |
这样,所有的 print 语句输出的内容就会保存到 out.log 文件中了。
2.页码保存
爬虫爬取过程中可能出现各种各样的错误,这样会导致爬虫的中断,如果我们重新运行爬虫,那么就会导致爬虫从头开始运行了,这样显然是不合理的。所以,我们需要把当前爬取的页面保存下来,比如可以保存到文本中,假如爬虫中断了,重新运行爬虫,读取文本文件的内容,接着爬取即可。 大家可以稍微参考一下函数的实现:
1 |
#主函数 |
这样,不管我们爬虫中途遇到什么错误,妈妈也不会担心了
3.页面处理
页面处理过程中,我们可能遇到各种各样奇葩的 HTML 代码,和上一节一样,我们沿用一个页面处理类即可。
1 |
import re |
我们可以用一段含有 HTML 代码的文字,经过调用 replace 方法之后,各种冗余的 HTML 代码就会处理好了。 比如我们这么一段代码:
1 |
<article class="article-content"> |
经过处理后便会变成如下的样子:
1 |
前言 |
经过上面的处理,所有乱乱的代码都会被处理好了。
4.保存到数据库
在这里,我们想实现一个通用的方法,就是把存储的一个个内容变成字典的形式,然后执行插入语句的时候,自动构建对应的 sql 语句,插入数据。 比如我们构造如下的字典:
1 |
#构造最佳答案的字典 |
构造 sql 语句并插入到数据库的方法如下:
1 |
#插入数据 |
这里我们只需要传入那个字典,便会构建出对应字典键值和键名的 sql 语句,完成插入。
5.PHP 读取日志
我们将运行结果输出到了日志里,那么怎么查看日志呢?很简单,在这里提供两种方法 方法一: PHP 倒序输出所有日志内容
1 |
<html> |
此方法可以看到所有的输入日志,但是如果日志太大了,那么就会报耗费内存太大,无法输出。为此我们就有了第二种方法,利用 linux 命令,输出后十行内容。 方法二:
1 |
<html> |
上面两种方法都是 5 秒刷新一次网页来查看最新的日志。
源代码放送
好了,闲言碎语不多讲,直接上源码了
1 |
spider.py |
1 |
# -*- coding:utf-8 -*- |
1 |
page.py |
1 |
# -*- coding:utf-8 -*- |
1 |
tool.py |
1 |
|
1 |
mysql.py |
1 |
# -*- coding:utf-8 -*- |
数据库建表 SQL 如下:
1 |
CREATE TABLE IF NOT EXISTS `iask_answers` ( |
运行的时候执行如下命令即可
1 |
nohup python spider.py & |
代码写的不好,仅供大家学习参考使用,如有问题,欢迎留言交流。