urllib基础、超时设置、Get与Post请求、异常处理、浏览器伪装、Python新闻爬虫实战

urllib基础

  1. urllib库:Python内置的Http请求库,不需要安装。
    2.包含4个模块:
  • request:最基本的HTTP请求模块,可以用来模拟发送请求。
  • error:异常处理模块,若出现请求错误,我们可捕获异常,进行重试或其他操作保证程序不会意外终止。
  • parse:一个工具模块,提供许多URL处理放法,比如拆分、解析、合并等。
  • robotparser:主要用来识别网站的robots.txt文件,然后判断哪些网站可以爬,那些不可以。

3.几个常用的方法:

import urllib.request

#urlretrieve(网址,本地文件存储地址) 直接下载网页到本地
urllib.request.urlretrieve("http://www.baidu.com","F://新建文件夹//did.html")
urllib.request.urlcleanup()

#看网页相应的简介信息info()
file = urllib.request.urlopen("https://read.douban.com/provider/all")
print(file.info())

#返回网页爬取的状态码getcode()
print(file.getcode())

#获取当前访问网页的url,geturl()
print(file.geturl())

超时设置

超时设置:有的网站能很快被访问,有的访问很慢,通过超时设置,合理分配时间能增加我们爬取网页信息的效率。
实战:

import urllib.request
for i in range(50):	
	try:
      		file = urllib.request.urlopen("https://blog.csdn.net/S_123789/article/details/100830233#_84",timeout=2)
        	print(len(file.read().decode("utf-8")))
    	except Exception as err:
        	print("出现异常")
    =========================== RESTART: F:/urllib.py ===========================
    108903
    114184
    110053
    109001
    108480
    107203

自动模拟HTTP请求与百度信息自动搜索爬虫实战

......构建用户代理池略......

#模拟Get请求,网页搜索Python,自动爬取1到3页的标题
for i in range(1,3):
	data = ua_ip('https://www.baidu.com/s?wd=Python&pn='+str((i-1)*10), ['127.0.0.1:8888']).decode('utf-8', 'ignore')

	pat = 'data-tools=(.*?)"title":"(.*?)"'
	rst = re.compile(pat).findall(data)

	r = []
	[r.append(x[1]) for x in rst]
	for j in range(0,len(r)):
		print(r[j])

#运行结果
    用户代理:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5558.400 QQBrowser/10.1.1695.400
        ip代理:127.0.0.1:8888
        Welcome to Python.org
        Python 基础教程 | 菜鸟教程
        Download Python | Python.org
        Python教程 - 廖雪峰的官方网站
        Python 简介 | 菜鸟教程
        Python - 开源软件 - OSCHINA_开源中国
        用户代理:Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)
        ip代理:127.0.0.1:8888
        十分钟让你看懂Python_图文_百度文库
        PythonTab:Python中文开发者社区门户
        Python | MOOC中国 - 慕课改变你,你改变世界
        Python - 开源软件 - OSCHINA
        Python - Python社区
        python知识库
        python是什么意思_python在线翻译_英语_读音_用法_例句_海词词典
        Python - Wikipedia
        Python培训机构|Python语言,前后端,爬虫技术,人工智能学习 - 创客...

自动模拟HTTP请求之自动POST实战

'''
post请求:有些网页必须在输入登录名和密码方可显示,
step1:得到登陆界面的url,即posturl;还要知道登录名与密码,即postdata
step2:利用urllib.request.Request(posturl,postdata)以此得到登陆后的url(即登陆后的界面)

'''

import re,urllib.request,urllib.parse
posturl = "http://www.iqianyue.com/mypost/"
postdata=urllib.parse.urlencode({
    "name":"123",
    "pass":"456",

}).encode("utf-8")
url = urllib.request.Request(posturl,postdata)
data = urllib.request.urlopen(url).read().decode("utf-8")
print(data)


============================ RESTART: F:/post.py ============================
<html>

<head>

<title>Post Test Page</title>

</head>

<body>

<form action="" method="post">

name:<input name="name" type="text" /><br>

passwd:<input name="pass" type="text" /><br>

<input name="" type="submit" value="submit" />

<br />

</body>

</html>

爬虫的异常处理实战

1.异常处理概述:爬虫在运行过程中,很多时候都会遇到这样或那样的异常,如果没有异常处理,爬虫遇到异常就会直接崩溃停止运行,再次运行时,爬虫不会接着运行,而是重新开始,所以要开发一个生命力顽强的爬虫,必须进行异常处理。
2.常见状态码及含义:

301:请求到的资源都会分配一个永久的URL,这样就可以在将来通过该URL来访问此资源 处理方式:重定向到分配的URL(永久重定向,重要)

302:请求到的资源在一个不同的URL处临时保存 处理方式:重定向到临时的URL(临时重定向,重要)

304:请求的资源未更新 处理方式:丢弃,使用本地缓存文件(没有发送请求,用的是本地缓存文件,重要)

400:非法请求 处理方式:丢弃

401:未授权 处理方式:丢弃

403:禁止访问 处理方式:丢弃(重要)

404:没有找到 处理方式:丢弃(重要)

3.URLError与HTTPError异常处理类
说明:两者都是异常处理的类,HTTPError是URLError的子类,HTTPError有异常状态码与异常原因,URLError没有异常状态码,所以,在处理的时候,不能直接使用URLError代替HTTPError,如果要代替,必须要判断是否有状态码这个属性。
实战:

#异常处理
URLError出现的原因:
1)连不上服务器
2)远程url不存在
3)无网络
4)触发HTTPError

from urllib import error,request
try:
    a = request.urlopen("https://cui.com/index.htm")#访问一个不存在的页面
except error.URLError as e:
    print(e.code,e.reason)
    
============================= RESTART: F:/err.py =============================
404 Not Found

爬虫的浏览器伪装技术实战

1.为什么要用浏览器伪装技术?
由于urlopen()对于一些高级功能不支持,很容易被网站发现是爬虫,而被禁止访问,导致爬取信息失败。这个时候,我们需要伪装成浏览器,再去爬取网页信息。
2.方法:我们可以通过用urllib.request.build_opener()或者urllib.request.Request()下的add_header()来添加报头,实现浏览器的伪装技术。

import urllib.request
进入要爬取的页面,点击F12,随机点击一个网址,从请求头里得到 具体用户代理值

url = "https://www.zhihu.com/"
#设置请求头,格式 headers = ("User-Agent","具体用户代理值")
headers = ("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0")
#创建一个opener
opener = urllib.request.build_opener()
#将headers添加到opener中
opener.addheaders=[headers]

#将opener安装为全局
urllib.request.install_opener(opener)

#用urlopen打开网页
data=urllib.request.urlopen(url).read().decode('utf-8')
print(len(data))

Python新闻爬虫实战


#爬取CSDN博客http://blog.csdn.net/首页显示的所有文章,
#每个文章内容单独生成一个本地网页存到本地
'''
1.浏览器伪装访问csdn首页
2.解析出首页各文章的链接
3.循环链接列表,进行访问,将内容保存至本地
'''
import re,urllib.request
url = "http://blog.csdn.net/"
#浏览器伪装
headers = ("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0")
#创建一个opener
opener = urllib.request.build_opener()
opener.addheaders = [headers]
#将opener安装为全局
urllib.request.install_opener(opener)

#用urlopen打开网页
data=urllib.request.urlopen(url).read().decode('utf-8')

pat = '<a href="(.*?)" target="_blank"'

link = re.compile(pat).findall(data)

for i in range(0,len(link)):
	#用urlopen打开网页
	urllib.request.urlretrieve(link[i],"F://CSDN//"+str(i)+".html")

发布了43 篇原创文章 · 获赞 46 · 访问量 4508

猜你喜欢

转载自blog.csdn.net/S_123789/article/details/100848353