不断完善

2023-11-17

1. 最简单的网页下载代码
	import urllib2                 #使用urllib2模块
	from sys import argv
	script,urlo = argv
	
	def download(url):
		html = urllib2.urlopen(url).read()   #将打开的url传给html变量
		print html 
		
	if __name__ =='__main__':
		 download(urlo)
>>> python    文件名     网址(http://……)
2. 当下载网页出现错误或异常时,代码应该可以处理异常情况
	import urllib2
	from sys import argv
	script,urlo = argv
	
	def download(url):
		print 'Downloading:',url 
		try:                                           #使用try … expect … 捕获异常
			html = urllib2.urlopen(url).read()
		except urllib2.URLError as e:
			print 'Downloading Error:',e.reason
			html = None                    # 如果出现异常,那就什么都不返回就行了
		print html 
		
	if __name__ =='__main__':
		 download(urlo)
3. 当下载出现错误时,html = None,无法下载打印网页,或许是服务器端发生错误而请求不存在问题,所以可以尝试重试下载。在download()函数中添加一个重试次数参数,以设置重试下载的次数,防止服务器错误可能暂时没有解决。
import urllib2
from sys import argv
script,urlo = argv

def download(url,num_retries=2):
	print 'Downloading:',url 
	try:
		html = urllib2.urlopen(url).read()
	except urllib2.URLError as e:
		print 'Downloading Error:',e.reason
		html = None 
		if num_retries>0:
			if hasattr(e,'code') and 500<=e.code<600:	#判断 e 中是否存在 code属性或code方法,若存在返回True,否则返回False			
				return download(url,num_retries-1)	   #递归调用函数以重试下载				
	print html 
	
if __name__ =='__main__':
	 download(urlo)
4. 为代码增加设置代理的功能以防止爬取时使用默认代理而被封禁导致访问拒绝
	import urllib2
	from sys import argv
	script,urlo = argv
	
	def download(url,user_agent = 'wswp',num_retries=2):
		print 'Downloading:',url 
		headers = {'User-agent':user_agent}
		request = urllib2.Request(url,headers=headers)      #使用urllib2.request创建一个request对象,该对象在HTTP请求时,允许你做额外的两件事。首先是你能够发送data表单数据,其次你能够传送额外的关于数据或发送本身的信息("metadata")到服务器,此数据作为HTTP的"headers"来发送。
		try:
			html = urllib2.urlopen(request).read()
		except urllib2.URLError as e:
			print 'Downloading Error:',e.reason
			html = None 
			if num_retries>0:
				if hasattr(e,'code') and 500<=e.code<600:				
					return download(url,user_agent,num_retries-1)					
		print html 
		
	if __name__ =='__main__':
		 download(urlo)
5. 以上代码是下载一个链接下的网页,但是要下载指定类型链接或下载大量网页,则要有一个爬取网站链接的函数
	import urlparse
	def link_crawler(seed_url, link_regex):
		crawl_queue = [seed_url]
		while crawl_queue:
			url = crawl_queue.pop()    
			html = download(url)
			for link in get_links(html):
				if re.match(link_regex, link):             #使用正则表达式确定含有指定字符的链接
					link = urlparse.urljoin(seed_url, link)            #将网页中的相对链接转换成绝对链接
					crawl_queue.append(link)                   #将符合条件的链接加入要爬取的链接列表中
	def get_links(html):
		webpage_regex = re.compile('<a[^>]+href=["\'](.*?)["\']', re.IGNORECASE)
		return webpage_regex.findall(html)
6. 当下载链接时,新下载的页面中可能包含已经下载过的网页链接,会重复下载。要避免重复下载,要记录已经下载过的链接,以防止重复下载。
	import urlparse
	def link_crawler(seed_url, link_regex):
		crawl_queue = [seed_url]
		seen = set(crawl_queue)                 #创建一个链接集合
		while crawl_queue:
			url = crawl_queue.pop()    
			html = download(url)
			for link in get_links(html):
				if re.match(link_regex, link):             #使用正则表达式确定含有指定字符的链接
					link = urlparse.urljoin(seed_url, link)            #将网页中的相对链接转换成绝对链接
					if link not in seen:                           #判断链接是否已经下载过
						seen.add(link)
						crawl_queue.append(link)                   #将符合条件的链接加入要爬取的链接列表中
	def get_links(html):
		webpage_regex = re.compile('<a[^>]+href=["\'](.*?)["\']', re.IGNORECASE)
		return webpage_regex.findall(html)
7. 为代码增加解析robots.txt文件的能力,以防止下载到禁止爬取得URL
	import urlparse
	import robotparser
	def link_crawler(seed_url, link_regex):
		crawl_queue = [seed_url]
		seen = set(crawl_queue)                 #创建一个链接集合
		rp = get_robots(seed_url)
		while crawl_queue:
			url = crawl_queue.pop()  
			if rp.can_fetch(user_agent, url):         #判断设置的代理是否被允许访问网页
				html = download(url)
				for link in get_links(html):
					if re.match(link_regex, link):             #使用正则表达式确定含有指定字符的链接
						link = urlparse.urljoin(seed_url, link)            #将网页中的相对链接转换成绝对链接
						if link not in seen:
							seen.add(link)
							crawl_queue.append(link)                   #将符合条件的链接加入要爬取的链接列表中
			else:
				print 'Blocked by robots.txt:', url
	def get_links(html):
		webpage_regex = re.compile('<a[^>]+href=["\'](.*?)["\']', re.IGNORECASE)
		return webpage_regex.findall(html)
		
	def get_robots(url):               #使用robotparser模块解析robots.txt文件,以避免下载到禁止爬取的URL
		rp = robotparser.RobotFileParser()
		rp.set_url(urlparse.urljoin(url, '/robots.txt'))      #
		rp.read()
		return rp
8. 综合爬取链接和下载网页的代码
import re 
import urllib2
import urlparse
import robotparser
#from sys import argv
 
#script,urlo = argv
def link_crawler(seed_url, link_regex,user_agent='wswp',proxy=None):
	crawl_queue = [seed_url]
	seen = set(crawl_queue)
	rp = get_robots(seed_url)
	while crawl_queue:
		url = crawl_queue.pop()
		if rp.can_fetch(user_agent, url):
			html = download(url,proxy=proxy)
			for link in get_links(html):
				if re.match(link_regex,link):
					link = urlparse.urljoin(seed_url,link)
					if link not in seen:
						seen.add(link)
						crawl_queue.append(link)
		else:
			print 'Blocked by robots.txt:', url
				
def get_links(html):
	webpage_regex = re.compile('<a[^>]+href=["\'](.*?)["\']', re.IGNORECASE)
	return webpage_regex.findall(html)
	
def get_robots(url):
	"""Initialize robots parser for this domain
	"""
	rp = robotparser.RobotFileParser()
	rp.set_url(urlparse.urljoin(url, '/robots.txt'))
	rp.read()
	return rp
	

def download(url, proxy,user_agent = 'wswp',num_retries = 2):
	print 'Downloading:',url 
	headers = {'User-agent':user_agent}
	request = urllib2.Request(url,headers=headers)
	opener = urllib2.build_opener()
	if proxy:
		proxy_params = {urlparse.urlparse(url).scheme: proxy}
		opener.add_handler(urllib2.ProxyHandler(proxy_params))
	try:
		response = opener.open(request)
		html = response.read()
	except urllib2.URLError as e:
		print 'Downloading error:',e.reason
		html = None 
		if num_retries>0:
			if hasattr(e,'code') and 500<=e.code<600:
				return download(url,proxy,user_agent,num_retries-1)
	return html 

if __name__=='__main__':
	link_crawler('http://example.webscraping.com', '/(index|view)',user_agent='GoodCrawler')
	link_crawler('http://example.webscraping.com', '/(index|view)',user_agent='BadCrawler')

转载于:https://my.oschina.net/spacewe/blog/834543

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不断完善 的相关文章

随机推荐

  • 华为OD机试真题-字符串比较-2023年OD统一考试(B卷)

    题目描述 给定字符串A B和正整数V A的长度与B的长度相等 请计算A中满足如下条件的最大连续子串的长度 1 该连续子串在A和B中的位置和长度均相同 2 该连续子串 A i B i 之和小于等于V 其中 A i B i 表示两个字母ASCI
  • 【转】密封类

    10 3 1 密封类概述及声明 10 3 密封类与密封方法 如果所有的类都可以被继承 那么很容易导致继承的滥用 进而使类的层次结构体系变得十分复杂 这样使得开发人员对类的理解和使用变得十分困难 为了避免滥用继承 C 中提出了密封类的概念 本
  • XStream 实现 javabean 与 xml 互转

    XStream 是什么 XStream 是一个 java类库 实际上是一个转换器 XStream 作用 实现 java bean 与 xml 互转 XStream 如何使用 主要通过 xStream 实现 转换 具体测试示例代码如下 源码
  • 运维工具

    环境部署 部署软件 如Apache Nginx tomcat JDK PHP MySQL等等 还需要测试吧 那就还需要部署一套测试环境 有些时候 开发环境也是需要运维来部署的 排错和调优 运维的事 尽快定位问题 解决问题才是王道 定位问题
  • 谁说毕业即失业?爬虫就业月入13000+第一个不服!

    不知道是Python太火爆 还是年轻人太卷 最近一段时间 老有刚毕业的年轻人向我请教Python问题 问题还相对比较专业 其中不乏有 财务小年轻请教Python数据统计 新媒体的朋友问Python爬虫 当然更多的还是来咨询Python爬虫就
  • Java监听器(重点)

    监听器 Listener 是一个实现特定接口的 Java 程序 这个程序专门用于监听另一个 Java 对象的方法调用或属性改变 当被监听对象发生上述事件后 监听器某个方法将立即自动执行 监听器的相关概念 事件 方法调用 属性改变 状态改变等
  • windows 安装linux子系统详细步骤

    1 dism exe online enable feature featurename Microsoft Windows Subsystem Linux all norestart 2 dism exe online enable fe
  • 对课程学习的期待

    我希望通过学习这门课程之后 自己可以设计出一些简单的程序 有利于之后的学习 例如 网络爬虫和一些有关于数据 图像处理的程序 我希望在理论课上老师可以通过一些有趣的示例来讲解课程内容 我认为这样可以更好的抓住学生的注意力而且可以使我们更容易理
  • 【无需显卡】AI绘画入门教程

    前言 Hello 各位端午节快乐呀 不好意思拖更两个月 最近实在是太忙了 也想不到有什么好玩的 之前介绍过了几个好玩的ai网站 非常适合新手尝鲜 但很多都有额度限制 而且还开始收费了 所以有了这期教程 还没看过上期可以看一下 除了ChatG
  • socks协议详解

    0x01 socks协议简介 Socks Socket Secure 协议是一种网络协议 处于会话层 用于管理网络连接并提供安全性和隐私保护 通过使用Socks代理服务器 客户端可以隐藏其真实IP地址和其他身份信息 从而匿名地访问互联网上的
  • php命令行传递参数,PHP命令行传递参数

    在以非命令行模式运行PHP的时候 我们可以通过 GET POST REQUEST来接受get或是post参数 但是以命令行方式运行的话 怎么传递参数以接受参数呢 关于命令行的特点 可以直接看官方文档 http php net manual
  • 【华为OD统一考试B卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • python 读写pcd

    1 读点云的3种方式 第一种 pip3 install python pcl import pcl pcd ndarray pcl load args pcd path to array 3 不要intensity pcd ndarray
  • 浏览器打开就是360导航(浏览器被360劫持)

    浏览器打开就是360导航 这个问题之前只是看别人帖子见到过 不知道出了什么问题我的edge和Chrome浏览器突然打开也成了360的导航页面 这才感觉出这个问题的恶心之处 而且顺道说一下 我电脑中也没有装任何360系的应用 但突然就被改了
  • 黑客基础知识——SYN泛洪攻击原理及防御

    拒绝服务攻击时 攻击者想非法占用被攻击者的一些资源 比如如 带宽 CPU 内存等等 使得被攻击者无法响应正常用户的请求 讲泛洪攻击之前 我们先了解一下DoS攻击和DDoS攻击 这两个攻击大体相同 前者的意思是 拒绝服务攻击 后者的意思是 分
  • docker下mysql镜像初始化

    目录 1 介绍 2 部署及验证 2 1 场景复现 2 2 创建dockerfile 2 3 初始化脚本 2 4 构建镜像并查看 2 5 创建容器并验证 2 6 完成 1 介绍 原理 当Mysql容器首次启动时 会在 docker entry
  • QT 多线程中使用QCanBusDevice进行PCAN通讯时,无法正常发出数据

    QT 多线程中使用QCanBusDevice进行PCAN通讯时 无法正常发出数据 前言 我一开始的代码逻辑是 PCAN开启 关闭 发送 接收这些功能整合在一个工具类中 这个工具类的对象是在主线程创建的 然后我有一个要循环定时发送的功能是独立
  • ASP.NET Core错误:Unable to cast object of type ‘System.Data.ProviderBase.DbConnectionClosedConnecting‘

    项目场景 在使用 net core开发时 经常使用数据库出现的问题 问题描述 开发ASP NET Core时遇到在经常使用数据库连接时报错误提示 Unable to cast object of type System Data Provi
  • QCefView源码优化

    QCefView项目源码的构建部分这里就不赘述了 有问题的朋友可以回到 QCefView 1 CMAKE项目 库文件生成和项目测试 查看相关介绍 本次优化主要包括以下几个部分 1 设置部分 关闭代理服务器 关闭同源策略 使用系统flash等
  • 不断完善

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 最简单的网页下载代码 import urllib2 使用urllib2模块 from sys import argv script urlo argv def down