python网络爬虫学习——编写一个网络爬虫

参考资料:用Python写网络爬虫(第2版)

1、编写一个函数

        (1)用于下载网页,且当下载网页发生错误时能及时报错。

# 导入库
import urllib.request
from urllib.error import URLError,HTTPError,ContentTooShortErrordef download(url):print("downloading: ",url)try:html=urllib.request.urlopen(url).read()except (URLError,HTTPError,ContentTooShortError) as e:print("Download error: ",e.reason)html=Nonereturn html# 函数测试
url="http://www.baidu.com"
download(url)

        (2)增加重试下载功能,当服务器端发生问题时,能自动重试下载。(4xx 错误发生在请求存在问题时,而 5xx 错误则发生在服务端存在问题时)

# 导入库
import urllib.request
from urllib.error import URLError,HTTPError,ContentTooShortErrordef download(url,num_retries=2):print("downloading: ",url)try:html=urllib.request.urlopen(url).read()except (URLError,HTTPError,ContentTooShortError) as e:print("download error: ",e.reason)html=Noneif num_retries>0:if hasattr(e,"code") and 500<=e.code<600:#当download函数遇到5xx错误码时,将会递归调用函数自身进行重试return download(url,num_retries-1)return html# 函数测试
download("http://httpstat.us/500")

        (3)设置用户代理。设定一个默认的用户代理“wswp”(即web scraping with python首字母缩写)。

# 导入库
import urllib.request
from urllib.error import URLError,HTTPError,ContentTooShortErrordef download(url,user_agent="wswp",num_retries=2):print("downloading: ",url)request=urllib.request.Request(url)request.add_header("User-agent",user_agent)try:html=urllib.request.urlopen(request).read()except (URLError,HTTPError,ContentTooShortError) as e:print("download error: ",e.reason)html=Noneif num_retries>0:if hasattr(e,"code") and 500<=e.code<600:return download(url,num_retries-1)return html
# 函数测试
url="http://www.baidu.com"
download(url)

2、利用id遍历爬虫

import itertools
def crawl_site(url):for page in itertools.count(1):pg_url="{}-{}".format(url,page)html=download(pg_url)    # download函数是上一案例中编写好的函数if html is None:break# 测试
url="http://example.python-scraping.com/view/"
crawl_site(url)

        上面的代码存在一个缺陷,就是必须确保网页地址中的id是连续的,假如某些记录已被删除,数据库id之间并不是连续的,其只要访问到某个间隔点,爬虫就会立即退出。下面对代码进行改进:当连续发生多次下载错误后才会退出程序。

def crawl_site(url,max_errors=5):for page in itertools.count(1):pg_url="{}{}".format(url,page)html=download(pg_url)if html is None:num_errors+=1if num_errors==max_errors:# 当连续html连续出现max_errors次None时,则停止循环breakelse:# 若成功抓取,则num_errors归零,用于下次重新技术num_errors=0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3017850.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

google地图js,添加标记,以及infowindow信息弹窗

&#xff08;谷歌地图版本V3&#xff09; var contentString "<div classdevinfo><P>设备ID: BJ-20240507</p> <P>设备状态: 正常</p> <P>通讯信号: 89% </p> <P>设备位置: 中国</p> <P>剂量率: 988</p&…

Go语言系统学习笔记(一):基础篇

1. 写在前面 公司的新业务开发需要用到go语言&#xff0c;虽然之前没接触过这门语言&#xff0c;但在大模型的帮助下&#xff0c;边看项目边写代码也能进行go的项目开发&#xff0c;不过&#xff0c;写了一段时间代码之后&#xff0c;总感觉对go语言本身&#xff0c;我的知识体…

项目经理【过程】概念

系列文章目录 【引论一】项目管理的意义 【引论二】项目管理的逻辑 【环境】概述 【环境】原则 【环境】任务 【环境】绩效 【人】概述 【人】原则 【人】任务 【人】绩效 【过程】概念 一、过程是什么 1.1 项目管理五大过程组 1.2 五大过程组之间的相互作用 1.3 项目阶段VS过…

损失函数详解

1.损失函数 是一种衡量模型与数据吻合程度的算法。损失函数测量实际测量值和预测值之间差距的一种方式。损失函数的值越高预测就越错误&#xff0c;损失函数值越低则预测越接近真实值。对每个单独的观测(数据点)计算损失函数。将所有损失函数&#xff08;loss function&#xf…

BFS Ekoparty 2022 -- Linux Kernel Exploitation Challenge

前言 昨天一个师傅给了我一道 linux kernel pwn 题目&#xff0c;然后我看了感觉非常有意思&#xff0c;题目也不算难&#xff08;在看了作者的提示下&#xff09;&#xff0c;所以就花时间做了做&#xff0c;在这里简单记录一下。这个题是 BFS Lab 2022 年的一道招聘题&#…

小说阅读网站的设计与实现(论文+源码)_kaic

小说阅读网站的设计与实现 摘 要 伴随着网络技术的不断创新及电子商务的飞速发展&#xff0c;网上阅读的方式日益发挥出其不可替代的优越性&#xff0c;不同的阅读网站也随之蓬勃发展&#xff0c;网上阅读形式以独特的优势&#xff0c;发展蓄势蓬勃。在线阅读作为一种全新的阅…

NVIDIA: RULER新测量方法让大模型现形

1 引言 最近在人工智能系统工程和语言模型设计方面的进展已经实现了语言模型上下文长度的高效扩展。以前的工作通常采用合成任务,如密钥检索和大海捞针来评估长上下文语言模型(LMs)。然而,这些评估在不同工作中使用不一致,仅揭示了检索能力,无法衡量其他形式的长上下文理解。 …

PE文件(四)FileBuffer-ImageBuffer

文件执行的总过程 当文件从硬盘中读入虚拟内存&#xff08;FileBuffer&#xff09;中时&#xff0c;文件数据会被原封不动的复制一份到虚拟内存中&#xff0c;然后进行拉伸对齐。此时虚拟内存中文件数据叫做文件印象或者内存印象&#xff0c;即ImageBuffer。此时ImageBuffer中…

Android 系统启动流程源码分析

一、Init进程启动 是一个由内核启动的用户级进程。内核自行启动之后&#xff0c;就通过启动一个用户级程序init的方式&#xff0c;完成引导进程。 启动的代码init.c中的main函数执行过程&#xff1a;system\core\init.c中&#xff1a; 主要下面两个重要的过程&#xff1a; 1…

Verilog中4bit超前进位加法器

4bit超前进位加法器的逻辑表达式如下&#xff1a; 中间变量GiAiBi&#xff0c;PiAi⊕BiGi​Ai​Bi​&#xff0c;Pi​Ai​⊕Bi​ 和&#xff1a;SiPi⊕Ci−1Si​Pi​⊕Ci−1​&#xff0c;进位&#xff1a;CiGiPiCi−1Ci​Gi​Pi​Ci−1​ 用Verilog语言采用门级描述方式&am…

信息系统项目管理师0092:项目管理原则(6项目管理概论—6.4价值驱动的项目管理知识体系—6.4.1项目管理原则)

点击查看专栏目录 文章目录 6.4价值驱动的项目管理知识体系6.4.1项目管理原则1.原则一:勤勉、尊重和关心他人2.原则二:营造协作的项目管理团队环境3.原则三:促进干系人有效参与4.原则四:聚焦于价值5.原则五:识别、评估和响应系统交互6.原则六:展现领导力行为7.原则七:根…

TOUGH软件教程

原文链接&#xff1a;TOUGH软件教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247603355&idx3&sn121a3c3b4e2ab03e11d31f167cbb7639&chksmfa82157ccdf59c6ae8201ae5780c3b037cad06b19268c7e685d5d9dc86aa7458ee7d2c031f6c&token377353807&…

长方形盒子能容纳定宽的长方形物体最大长度

问题 已知长方形盒子长度a和宽度b&#xff0c;放入一宽度w的长方形物体&#xff0c;求长方形物体最大长度L。 答案 MS Excel公式如下&#xff08;其中B1a&#xff0c;B2b&#xff0c;B3w&#xff09;&#xff1a; L SQRT(B1^2B2^2)-B1*B2*B3*2/(B1^2B2^2)注意 当求得 L ≤…

向各位请教一个问题

这是菜鸟上的一道题目&#xff0c;单单拿出来问问大家&#xff0c;看看能不能解惑 &#xff0c;谢谢各位&#xff01; 题目25&#xff1a;求12!3!...20!的和 解题思路&#xff1a;这个题不知道为什么我用DEV C 5.11显示出来为0.000000&#xff0c;可能版本有问题&#xff1f;&a…

【代码分享】使用HTML5的Canvas绘制编码说明图片

最急在工作中遇到一个需求&#xff0c;根据给定的编码生成编码说明&#xff0c;像下面这样的效果。 不同含义的编码用横杠分割&#xff0c;然后每个编码下面用箭头指明具体的含义。下面是我使用canvas实现的代码。具体的编码宽度大家可以根据实际情况进行调整&#xff0c;目前…

大数据硬核技能进阶:Spark3实战智能物业运营系统

Spark Streaming 是 Spark 的一个子模块&#xff0c;用于快速构建可扩展&#xff0c;高吞吐量&#xff0c;高容错的流处理程序。具有以下特点&#xff1a; 大数据硬核技能进阶&#xff1a;Spark3实战智能物业运营系统(网盘超清) 通过高级 API 构建应用程序&#xff0c;简单易…

python 打包为exe可执行程序

近期因为需要做文字识别&#xff0c;应用ocr 所以每次都需要部署环境&#xff0c;然后打算做成exe&#xff0c;遇到问题做一总结。 pyinstaller -D --hidden-importpaddleocr testflask.py 生成exe paddleocr 和pyinstaller 安装不做说明。 No such file or directory: …

HCIP的学习(13)

第五章&#xff0c;重发布和路由策略 重发布 ​ 在路由协议的边界设备上&#xff0c;将某一种路由协议的路由信息引入到另一种路由协议中&#xff0c;这个操作被称为路由引入或者路由重分发。----技术本质为重发布。 条件 必须存在ASBR设备&#xff08;路由边界设备&#x…

数据结构-线性表-应用题-2.2-12

1&#xff09;算法的基本设计思想&#xff1a;依次扫描数组的每一个元素&#xff0c;将第一个遇到的整数num保存到c中&#xff0c;count记为1&#xff0c;若遇到的下一个整数还是等于num,count,否则count--,当计数减到0时&#xff0c;将遇到的下一个整数保存到c中&#xff0c;计…

Shell编程规范和变量

一.Shell脚本概述 Shell脚本的概念 将要执行的命令按顺序保存到一个文本文件给该文件可执行权限可结合各种Shell控制语句以完成更复杂的操作 Shell脚本应用场景 重复性操作交互性任务批量事务处理服务运行状态监控定时任务执行 Shell的作用 1&#xff09;介于系统内核与用…