Python 网络爬虫 005 (编程) 如何编写一个可以 下载(或叫:爬取)一个网页 的网络爬虫

爬虫获取一个网站内所有子页面的内容 本文介绍了如何自动获取一个网站内所有子页面的所有所需内容的爬取,常用在训练大模型时所需的数据获取。 阅读详情

如何编写一个可以 下载(或叫:爬取)一个网页 的网络爬虫

使用的系统:Windows 10 64位
Python 语言版本:Python 2.7.10 V
使用的编程 Python 的集成开发环境:PyCharm 2016 04
我使用的 urllib 的版本:urllib2

注意: 我没这里使用的是 Python2 ,而不是Python3


一 . 简介

编写网络爬虫的第一步就是下载网页,这个过程叫做: 爬取 。

二 . 准备工作

要想爬取网站,首先要将网站下载下来。我们使用 Python 内置的:urllib2 模块 来下载网站的 URL。

注意: 无须下载任何第三方库哦。
参考网站:http://stackoverflow.com/questions/34475051/need-to-install-urllib2-for-python-3-5-1

三 . 最简单的下载网页的网络爬虫程序

新建一个文件:download_html.py。将下面的代码输入进去:

import urllib2
def download(url):
    return urllib2.urlopen(url).read()

执行:

> C:\Python27\python.exe -i download_html.py
>>> html = download('http://www.aobosir.com')
>>> print html
<!DOCTYPE html>
<html>
  <head>

  </head>
  <body>

  </body>

  <script>
    window.location.href="http://blog.youkuaiyun.com/github_35160620"
  </script>
</html>

>>>

这样的程序,不是每一次都很顺利的运行的。我们可能会在执行上面这个程序的时候,遇到一些无法控制的问题,这根据你爬取的网站的不同而定。
* 比如,有的网站使用的编码方式与你这个程序下载网站是读取网站的编码方式不同,就会导致乱码问题;
* 再比如说:如果你爬取的目标网站具有反爬虫机制,那么当你爬取它的时候,你会遇到503 Service Unavailable 问题;
* 再比如说:如果你爬虫的网站根本不存在,那么你会得到 404 Not Found 问题。

四 . 加入异常处理程序

所以,我们为了能让程序捕获到这些异常情况,需要加上异常处理的程序。最终程序会变成下面这个样子:

import urllib2

def download(url):
    print 'Downloading: ', url
    try:
        html = urllib2.urlopen(url).read()
    except urllib2.URLError as e:
        print 'Download error', e.reason
        html = None
    return html

运行:

D:\WorkSpace\python_ws\web-scraping-with-python-learning\ch1>C:\Python27\python.exe -i 1-4-1-download_html.py
>>> html = download('http://www.aobosir.com/')
Downloading:  http://www.aobosir.com/
>>> html = download('http://httpstat.us/500')
Downloading:  http://httpstat.us/500
Download error Internal Server Error
>>> html = download('http://www.meetup.com/')
Downloading:  http://www.meetup.com/
Download error Forbidden
>>>

现在,如果程序在下载目标网站时,遇到异常就能捕获到这个异常了,然后返回 None 。现在还没有处理这个异常。只是能过捕获到它。

当然,下载网页是,遇到的错误经常都是临时性的,比如对于我们上面说的 503 问题,我们只需要尝试重新下载就可以解决这个问题。当然了,我们不需要对所有问题都尝试去重新下载,比如 404 问题,目标网页根本不存在,所以,你没有必要再去尝试。

扩展:
互联网工程任务小组(英语:Internet Engineering Task Force,缩写为 IETF)定义了HTTP错误的完整列表,详细内容到这个网站查看:https://zh.wikipedia.org/wiki/HTTP%E7%8A%B6%E6%80%81%E7%A0%81
从这个列表中,我们可以了解到:4XX 问题是客户端出现的问题;5XX 问题是服务器出现了问题;而其他的,比如:1XX 是消息;2XX 是成功;3XX 是重定向。

五 . 只有出现 5xx 错误码的时候,才执行重新下载程序

所以,我们需要让 download() 这个函数在遇到 5XX 错误的时候重新下载即可。
所以,我们再次完善我们的 download() 函数:

import urllib2

def download(url, num_retries=2):
    print 'Downloading: ', url
    try:
        html = urllib2.urlopen(url).read()
    except urllib2.URLError as e:
        print 'Download error', e.reason
        html = None
        if num_retries > 0:
            if hasattr(e, 'code') and 500 <= e.code < 600:
                # recursively retry 5xx HTTP errors
                return download(url, num_retries-1)
        return html

现在,在 download() 函数遇到 5xx 错误码的时候,就会自动递归 download() 函数本身进行重试。 download() 函数增加的第2个参数就是迎来指定递归的次数的,默认尝试2次。

测试这段程序,使用这个网站来测试:http://httpstat.us/500 ,这个网站会始终返回 500 错误码:

>>> html = download('http://httpstat.us/500')
Downloading:  http://httpstat.us/500
Download error Internal Server Error
Downloading:  http://httpstat.us/500
Download error Internal Server Error
Downloading:  http://httpstat.us/500
Download error Internal Server Error
>>> html = download('http://www.meetup.com/')
Downloading:  http://www.meetup.com/
Download error Forbidden
>>>

六 . 设置 用户代理(user_agent)

为了让我们的网络爬虫更加健壮,在网络中下载网页更加畅通无阻,我们需要:设置 用户代理(user_agent)

Q: 什么是 用户代理(user_agent)?

A: 你访问目标网站,就是访问目标服务器。那么让你访问服务器的时候,服务器会读取你是使用什么来访问它的。比如:如果你使用是是Chrome 浏览器访问它的,那么目标服务器就知道:你是使用浏览器访问它的。服务器就是通过用户代理这个参数来得到你是通过什么访问它的。
用户代理 指的是:简单的说就是一个参数,并且这个参数我们是可以修改的。在默认情况下,我们使用urllib2写的爬虫,它默认将 Python-urllib/2.7 这个字符串做为爬虫程序的用户代理。

Q: 为什么要设置 用户代理(user_agent)?
A: 如果我们使用这个默认的 Python-urllib/2.7 这个字符串做为我们的爬虫程序的用户代理,我们的爬虫会碰到很多的问题的。有些网站为了不希望网络爬虫将它们的服务器搞过载 或者 搞垮,会设有反爬虫机制。反爬虫机制就是:将一些用户代理 封禁,禁止一些 用户代理 访问他们的服务器。
比如这个例子:在我们使用urllib2 默认的用户代理 ( Python-urllib/2.7 ) 来 http://www.meetup.com/ 网站,你会看到下面的访问拒绝提示:

>>> html = download('http://blog.youkuaiyun.com/github_35160620/article/details/52487618')
Downloading:  http://blog.youkuaiyun.com/github_35160620/article/details/52487618
Download error Forbidden
>>> html = download('http://www.meetup.com/')
Downloading:  http://www.meetup.com/
Download error Forbidden
>>> 

所以,如果我们能过将网络爬虫 的 用户代理 设置为 浏览器的用户代理,该多好啊。这样我们的网络爬虫就可以让服务器误以为:是一个浏览器在访问它。

下面这个图,就是 Chrome 浏览器的 用户代理 (user_agent)。

这里写图片描述

这是完全可以实现的,下面我们将来介绍,如何设定。
现在修改 download() 函数,将用户代理 设定为:wswp 这个字符串。(即 Web Scraping with Python 的首字母缩写。)

import urllib2

def download(url, user_agent='wswp', num_retries=2):
    print 'Downloading: ', url
    headers = {'User-agent' : user_agent}
    request = urllib2.Request(url, headers=headers)
    try:
        html = urllib2.urlopen(request).read()
    except urllib2.URLError as e:
        print 'Download error', e.reason
        html = None
        if num_retries > 0:
            if hasattr(e, 'code') and 500 <= e.code < 600:
                # recursively retry 5xx HTTP errors
                return download(url, user_agent, num_retries-1)
        return html

运行:

>>> html = download('http://www.meetup.com/')
Downloading:  http://www.meetup.com/

通过运行结果,你也看到了:通过设置了自定义的用户代理(user_agent)后,一些反爬虫的网站有可以下载了。现在,这个 download() 就是一个灵活的下载程序,该函数能够捕获异常,并且可以自动尝试重新下载,并且我们设置了自定义的用户代理(user_agent)。

搞定



下一节,我们来解决乱码问题

如果我们下载一个带有中文的网站,或者日文的网站,终止就是不全是英文的网站。我们将这个网站下载下来后,将它输出,会有乱码。
举例:

>>> html = download('http://blog.youkuaiyun.com/github_35160620/article/details/52487618')
Downloading:  http://blog.youkuaiyun.com/github_35160620/article/details/52487618
>>> print html
...
...
...
        </div>

       <!-- 骞垮憡浣嶅紑濮?-->                                                                                 
        <ins data-revive-zoneid="72" data-revive-id="8c38e720de1c90a6f6ff52f3f89c4d57"></ins>
    <!-- 骞垮憡浣嶇粨鏉?-->                                                                                    

   <link rel="stylesheet" href="http://static.blog.youkuaiyun.com/css/blog_code.css" />
            <script type="text/javascript" src="http://static.blog.youkuaiyun.com/scripts/saveToCode.js"></script>
...
...
...

下一节,就来解决这个问题。



总结:
这一节,我们已经 网络爬虫程序的下载网页的部分搞定了。下一节,我们来解决乱码问题。

python入门012~使用requests爬取网络图片并保存到本地 六,运行代码,看下效果可以看下我们爬取到的图片最后把完整代码贴给大家往期文章python入门001~python开发工具 pycharm的安装与破解(mac和window都有讲)python入门002~创建属于自己的第一个python项目python入门003~python3的安装~以python3最新版为例(Mac window都有讲)python入门004~创建属于自己的第一个python3项目~python3基础知识的讲解python入门005~基本数据类型和变量的学习。 阅读详情

相关推荐

网络爬虫常用工具

本压缩包包含:chromedriver、mysql-font、phantomjs、redis、redis-desktop、robo3等网络爬虫时常用的文件,以上文件均来自官网下载,避免了其他人使用时下载缓慢的问题

Python 网络爬虫 005 (编程) 如何编写一个可以 下载(或叫:爬取)一个网页 的网络爬虫...

如何编写一个可以 下载(或叫:爬取)一个网页 的网络爬虫 使用的系统:Windows 10 64位 Python 语言版本:Python 2.7.10 V 使用的编程 Python 的集成开发环境:PyCharm 2016 04 我使用的 urllib 的版本:urllib2 注意: 我没这里使用的是 Python2 ,而不是Python3 一 . 简介 ...

weixin_30414305的博客 237

Python实现简单爬虫,可抓取文本及图片

Python实现简单爬虫,可抓取文本及图片 简单,有部分注释,有兴趣的可以与我交流,共同进步~ 目前只是抓取ousha网站上的,这个对于东西不同的网站还是差异性比较大的。

python爬虫:如何爬网页数据并将其放在文本文件中

不废话了,直接上代码:主函数文件main.pyimport OrphaNet if __name__ == '__main__': print('+++++starting') myCrawlOrphaNet = OrphaNet.CrawlOrphaNet() myCrawlOrphaNet.test()爬虫文件OrphaNet.py说明:初始化,和downloa...

执契的博客 1万+

网页爬虫 非常实用工具

Web Scraper 网页爬虫 非常实用工具,亲测并制作文档,请勿用于非法用途!〜〜

网页爬虫(附源码)凑字数凑字数

--实现使用爬虫对山大日记官网 近一个月的日记的全部内容的爬取 http://www.sdrj.sdu.edu.cn/mrtt.htm凑字数凑字数凑字数凑字数凑字数凑字数凑字数凑字数凑字数凑字数凑字数凑字数凑字数凑字数

Python爬虫入门教程!手把手教会你爬取网页数据

其实在当今社会,网络上充斥着大量有用的数据,我们只需要耐心的观察,再加上一些技术手段,就可以获取到大量的有价值数据。这里的“技术手段”就是网络爬虫。今天就给大家分享一篇爬虫基础知识和入门教程:

weixin_55154866的博客 4768

【RandLA-Net实战】从零构建隧道点云数据集并训练大场景语义分割模型

本文详细介绍了如何使用RandLA-Net构建隧道点云数据集并进行大场景语义分割模型训练。从数据采集、标注到模型训练与优化,提供了完整的实战指南,特别针对隧道场景的特殊挑战提出了解决方案。通过实际案例展示了RandLA-Net在处理大场景点云数据时的高效性和准确性,为隧道巡检等工程应用提供了可靠的技术支持。

weixin_30485379的博客 114

Python爬虫:实现爬取、下载网站数据的几种方法

使用脚本进行下载的需求很常见,可以是常规文件、web页面、Amazon S3和其他资源。Python 提供了很多模块从 web 下载文件。下面介绍。

Python热爱者的博客 7373

【Transformer 相关理论深入理解】注意力机制、自注意力机制、多头注意力机制、位置编码

transformer原理

qq_38253797的博客 2万+

论文阅读4——一种宽频带圆极化微带天线的设计

论文阅读——一种宽频带圆极化微带天线的设计(现在才觉得开始弄懂了一点,懂了一点之后又更糊涂了……)

weixin_64612422的博客 2317

Python爬虫实战:利用代理IP爬取百度翻译

Python爬虫实战:利用代理IP爬取百度翻译

努力让自己发光,对的人才能迎着光而来 25万+

Parrot OS最新安装教程

Parrot OS和Kali Linux一样是一个基于 Debian 的免费开源 Linux 发行版,适合安全专家、开发人员、以及关心隐私的人。相较于Kali,Parrot OS属于轻量级,对于硬件的要求无需很高,目前版本已更新到6.3。通过按照本教程的方法,能够成功安装Parrot OS。

🦸💻冰草花生酱提醒您“请记得检查所有电子设备的最后登录时间哦⏰🔍” 4419

爬虫技术python流程图_基于Python的网络爬虫技术研究

基于Python的网络爬虫技术研究王碧瑶【摘要】摘要:专用型的网络爬虫能够得到想要的返回结果,本文就以拉勾网作为例子,对基于Python的网络爬虫技术进行研究和分析。【期刊名称】数字技术与应用【年(卷),期】2017(000)005【总页数】1【关键词】Python;网络爬虫技术;搜索引擎【文献来源】https://www.zhangqiaokeyan.com/academic-journal-c...

weixin_39667626的博客 485

K-means算法代码实现(python)

K-means算法代码实现以及解决质心选择问题 计算距离 距离通常使用欧几里得距离来衡量 def euclDistance(vector1, vector2): return np.sqrt(sum((vector2 - vector1) ** 2)) 初始化质心 def initCentroids(data, k): numSamples, dim = data.shape ...

江南小帅瓜的博客 1万+

DeepSeek-OCR安装部署文档和避坑指南,包含大多数人遇到的安装报错问题

DeepSeek-OCR安装部署指南摘要:本文详细介绍高性能OCR工具DeepSeek-OCR的安装流程,支持多语言识别和复杂场景文字提取。系统要求包括Linux/Windows/macOS操作系统,推荐NVIDIA显卡(显存≥6GB)和≥16GB内存。安装步骤涵盖:1)创建conda虚拟环境;2)安装PyTorch等核心依赖;3)解决常见问题如CUDA版本冲突、模型下载慢等。提供GPU内存不足等问题的解决方案,帮助开发者快速部署OCR服务。(149字)

yolo模型训练找我,AI游戏合作找我 2946

knowledge-catalog 实战:Acme Retail OKF 知识包(Bundle)完整拆解——从 BigQuery 表到 Attested Computation 的端到端元数据治理

Acme Retail 是 Google Cloud knowledge-catalog 仓库中 `okf/` 目录下(Open Knowledge Format,OKF 格式)的一个**完整的示例知识包(bundle)**,它演示了如何用纯 Markdown + YAML frontmatter,把一个零售企业"财务指标怎么算、何时算、由谁验证"的全部知识组织成机器可读、人可读、可审计的目录。本

gitblog_00548的博客 394

【局部规划模块曲线算法】曲线平滑介绍

本文先对轨迹平滑问题做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容(1)适合给移动机器人运动的路径【满足运动学,高阶平滑】(2)高阶的运动学不能够突变的【至少三阶的加速度不能突变,最好四阶的jerk和五阶的snap也不能突变】(3)在转弯的地方不会停下来(4)加减速均衡,节省能量(5)节省时间的。

qq_35635374的博客 5715

爬虫之小说爬取

以笔趣阁网站为例,爬取一念永恒这本小说 链接如下:http://www.biqukan.com/1_1094  具体代码如下: 1 from bs4 import BeautifulSoup 2 from urllib import request 3 import requests 4 import re 5 import sys 6 def Down_this_chapter(

Y先森0.0 1305

《低功耗方法学》翻译——第一章:介绍

第一章:介绍

记录所学,分享知识,结识挚友 2069

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

python外国网站爬虫_Python爬取某境外网站漫画,心血来潮,爬之

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。转载地址https://blog.youkuaiyun.com/fei347795790?t=1某年某月某日,重温某本漫画,心血来潮,爬之!!!分析思路:1. 通过静态爬取漫画所有章节的url链接信息以及集数信息。2. 通过动态爬取每集漫画的所有篇幅。3. 每集漫画保存至相应本地文件夹中。一、...

weixin_39928233的博客 1144

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

python爬虫的一次尝试——华北电力大学图书馆读者荐购系统:基于python爬虫的web数据爬取

因为疫情原因,本学期到目前第九周仍未回校,也感谢有这么好的一段空窗期,给了我们足够的时间和精力提升自己。本学期数据仓库与数据挖掘课程大作业是编程实现一种数据挖掘方法,鉴于假期学了一点python编程和爬虫基础,之前也注意过学校图书馆的荐购系统,数据十分有趣,于是想借这次机会尝试一下。

JAVA_wangyi的博客 4834

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Python爬虫实战 | 爬取网易云音乐评论

【想要学习爬虫的朋友们 我这里整理了很多Python学习资料上传到优快云官方了,有需要的朋友可以扫描下方二维码进行获取】

大模型教程的博客 1716

爬虫7_《隐秘的角落》豆瓣影评爬取及可视化分析

爬取链接:隐藏的角落豆瓣影评 本文源码:百度云 提取码 影评爬取 豆瓣网有限制,各种类型的评论只可以爬取220条,所以我爬取了好评、一般、差评各220条,过滤解析错误的影评后,累计爬取630条。爬取维度为评论类型、点赞数、评分、发布日期、评论。 分析url start:从第几条开始展示,豆瓣影评每一页都是20条评论,所以start应该是20的倍数。 limit:这个限制了每页显示多少评论,但修改数值也没用。 sort:根据热门/最新/好友进行排序, 这里我选择了热门。 status:P/F代表看过和想看,

Lin_Xiao_Dai的博客 2431

网络爬虫相关操作--selenium库(超详细版)

本文介绍了使用Selenium进行网页自动化操作的方法。主要内容包括:1)在B站搜索框输入文字并搜索;2)识别网页图片内容;3)网页前进/后退/刷新操作;4)爬取百度图片并保存到本地;5)自动点击网页元素;6)爬取苏宁商品评论(好评/差评);7)获取医用口罩商品信息;8)实现按人名爬取指定数量图片的功能。文中详细展示了各类操作的代码实现,包括元素定位、输入操作、页面跳转、数据抓取等Selenium核心功能的使用方法。

2301_77717128的博客 1932

网络爬虫前奏之实例百度搜索005

import requests keyword = "Python" try: kv = {'wd':keyword} headers={ 'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987...

郭川川 716
上一篇: 设置 PyCharm 软件中 Terminal 窗口 中启动的 python 交互命令的版本
下一篇: STM32 C++编程 005 I2c(Soft)类
AoboSir
博客等级 码龄10年 996粉丝 285原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值