python爬虫实战之最简单的网页爬虫教程


Posted in Python onAugust 13, 2017

前言

网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。最近对python爬虫有了强烈地兴趣,在此分享自己的学习路径,欢迎大家提出建议。我们相互交流,共同进步。话不多说了,来一起看看详细的介绍:

1.开发工具

笔者使用的工具是sublime text3,它的短小精悍(可能男人们都不喜欢这个词)使我十分着迷。推荐大家使用,当然如果你的电脑配置不错,pycharm可能更加适合你。

sublime text3搭建python开发环境推荐查看这篇文章:

[sublime搭建python开发环境][https://3water.com/article/51838.htm]

2.爬虫介绍

爬虫顾名思义,就是像虫子一样,爬在Internet这张大网上。如此,我们便可以获取自己想要的东西。

既然要爬在Internet上,那么我们就需要了解URL,法号“统一资源定位器”,小名“链接”。其结构主要由三部分组成:

(1)协议:如我们在网址中常见的HTTP协议。

(2)域名或者IP地址:域名,如:www.baidu.com,IP地址,即将域名解析后对应的IP。

(3)路径:即目录或者文件等。

3.urllib开发最简单的爬虫

(1)urllib简介

Module Introduce
urllib.error Exception classes raised by urllib.request.
urllib.parse Parse URLs into or assemble them from components.
urllib.request Extensible library for opening URLs.
urllib.response Response classes used by urllib.
urllib.robotparser Load a robots.txt file and answer questions about fetchability of other URLs.

(2)开发最简单的爬虫

百度首页简洁大方,很适合我们爬虫。

爬虫代码如下:

from urllib import request

def visit_baidu():
 URL = "http://www.baidu.com"
 # open the URL
 req = request.urlopen(URL)
 # read the URL 
 html = req.read()
 # decode the URL to utf-8
 html = html.decode("utf_8")
 print(html)

if __name__ == '__main__':
 visit_baidu()

结果如下图:

python爬虫实战之最简单的网页爬虫教程

我们可以通过在百度首页空白处右击,查看审查元素来和我们的运行结果对比。

当然,request也可以生成一个request对象,这个对象可以用urlopen方法打开。

代码如下:

from urllib import request

def vists_baidu():
 # create a request obkect
 req = request.Request('http://www.baidu.com')
 # open the request object
 response = request.urlopen(req)
 # read the response 
 html = response.read()
 html = html.decode('utf-8')
 print(html)

if __name__ == '__main__':
 vists_baidu()

运行结果和刚才相同。

(3)错误处理

错误处理通过urllib模块来处理,主要有URLError和HTTPError错误,其中HTTPError错误是URLError错误的子类,即HTTRPError也可以通过URLError捕获。

HTTPError可以通过其code属性来捕获。

处理HTTPError的代码如下:

from urllib import request
from urllib import error

def Err():
 url = "https://segmentfault.com/zzz"
 req = request.Request(url)

 try:
 response = request.urlopen(req)
 html = response.read().decode("utf-8")
 print(html)
 except error.HTTPError as e:
 print(e.code)
if __name__ == '__main__':
 Err()

运行结果如图:

python爬虫实战之最简单的网页爬虫教程

404为打印出的错误代码,关于此详细信息大家可以自行百度。

URLError可以通过其reason属性来捕获。

chuliHTTPError的代码如下:

from urllib import request
from urllib import error

def Err():
 url = "https://segmentf.com/"
 req = request.Request(url)

 try:
 response = request.urlopen(req)
 html = response.read().decode("utf-8")
 print(html)
 except error.URLError as e:
 print(e.reason)
if __name__ == '__main__':
 Err()

运行结果如图:

python爬虫实战之最简单的网页爬虫教程

既然为了处理错误,那么最好两个错误都写入代码中,毕竟越细致越清晰。须注意的是,HTTPError是URLError的子类,所以一定要将HTTPError放在URLError的前面,否则都会输出URLError的,如将404输出为Not Found。

代码如下:

from urllib import request
from urllib import error

# 第一种方法,URLErroe和HTTPError
def Err():
 url = "https://segmentfault.com/zzz"
 req = request.Request(url)

 try:
 response = request.urlopen(req)
 html = response.read().decode("utf-8")
 print(html)
 except error.HTTPError as e:
 print(e.code)
 except error.URLError as e:
 print(e.reason)

大家可以更改url来查看各种错误的输出形式。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
用实例详解Python中的Django框架中prefetch_related()函数对数据库查询的优化
Apr 01 Python
python编程开发之日期操作实例分析
Nov 13 Python
python递归查询菜单并转换成json实例
Mar 27 Python
python绘制铅球的运行轨迹代码分享
Nov 14 Python
Python机器学习之K-Means聚类实现详解
Feb 22 Python
运行django项目指定IP和端口的方法
May 14 Python
python英语单词测试小程序代码实例
Sep 09 Python
Python基于QQ邮箱实现SSL发送
Apr 26 Python
一篇文章带你搞定Ubuntu中打开Pycharm总是卡顿崩溃
Nov 02 Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
Jan 21 Python
Python入门基础之数字字符串与列表
Feb 01 Python
如何使用Python实现一个简易的ORM模型
May 12 Python
详解python中executemany和序列的使用方法
Aug 12 #Python
mysql 之通过配置文件链接数据库
Aug 12 #Python
python+selenium开发环境搭建图文教程
Aug 11 #Python
Python实现的递归神经网络简单示例
Aug 11 #Python
Python调用系统底层API播放wav文件的方法
Aug 11 #Python
Django 导出 Excel 代码的实例详解
Aug 11 #Python
python技能之数据导出excel的实例代码
Aug 11 #Python
You might like
PHP设计模式之单例模式定义与用法分析
2019/03/26 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
提高网站性能之 如何对待JavaScript
2009/10/31 Javascript
JQuery 解析多维的Json数据格式
2009/11/02 Javascript
javascript中substr,substring,slice.splice的区别说明
2010/11/25 Javascript
js加强的经典分页实例
2013/03/15 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
2013/09/02 Javascript
一个检测表单数据的JavaScript实例
2014/10/31 Javascript
JQuery右键菜单插件ContextMenu使用指南
2014/12/19 Javascript
浅谈JavaScript正则表达式分组匹配
2015/04/10 Javascript
JavaScript实现级联菜单的方法
2015/06/29 Javascript
js实现纯前端的图片预览
2016/04/27 Javascript
Highcharts入门之简介
2016/08/02 Javascript
jQuery插件ContextMenu自定义图标
2017/03/15 Javascript
Vue计算属性的学习笔记
2017/03/22 Javascript
JavaScript设计模式之策略模式详解
2017/06/09 Javascript
详解vue中点击空白处隐藏div的实现(用指令实现)
2018/04/19 Javascript
Angular使用Restful的增删改
2018/12/28 Javascript
详解微信小程序开发聊天室—实时聊天,支持图片预览
2019/05/20 Javascript
js函数和this用法实例分析
2020/03/13 Javascript
ES6 async、await的基本使用方法示例
2020/06/06 Javascript
design vue 表格开启列排序的操作
2020/10/28 Javascript
浅析VUE防抖与节流
2020/11/24 Vue.js
[01:19:46]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第一场 2月28日
2021/03/11 DOTA
Python实现Linux的find命令实例分享
2017/06/04 Python
python的pytest框架之命令行参数详解(上)
2019/06/27 Python
Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)
2020/02/17 Python
keras model.fit 解决validation_spilt=num 的问题
2020/06/19 Python
浅谈keras使用预训练模型vgg16分类,损失和准确度不变
2020/07/02 Python
css3 按钮样式简单可扩展创建
2013/03/18 HTML / CSS
捷克街头、运动和滑板一站式商店:BoardStar.cz
2019/10/06 全球购物
社区服务活动总结
2014/05/07 职场文书
道路交通事故人身损害赔偿协议书
2014/11/19 职场文书
2015年基层党支部工作总结
2015/05/21 职场文书
2016年10月份红领巾广播稿
2015/12/21 职场文书
MySQL七种JOIN类型小结
2021/10/24 MySQL