urllib库
#网页读取以及读取内容保存的两种方法
import urllib.request
#将检索到的网页的保存的本地文件上
urllib.request.urlretrieve('http://www.zhihu.com',filename='c:/users/15432/localfile/newfile1.html')
urllib.request.urlcleanup()#清理网页请求, retrieve:检索
#打开某网页并读取内容
data=urllib.request.urlopen('http://www.zhihu.com').read()
data=data.decode('utf-8','ignore')
fh=open('c:/users/15432/localfile/newfile2.html','wb')
#将读取的网页内容写入本地文件
fh.write(data)
fh.close()
file=urllib.request.urlopen('http://www.zhihu.com')
print(file.info())
print(file.getcode())
print(file.geturl())
#循环爬取异常处理
for i in range(0,5):
try:
data=urllib.request.urlopen('http://www.bilibili.com/',timeout=0.1)
data=data.read()
print(len(data))
except Exception as err:
print('出现异常:'+str(err))
#http请求post,get
#get请求,一般问号?都代表是get请求
import urllib.request
kwd='python'
url='http://www.baidu.com/s?wd='+kwd
req=urllib.request.Request(url) #网址转成请求
data=urllib.request.urlopen(req).read()#读取目标网页内容
#将读取网页内容存在本地文件
fh=open('c:/users/15432/localfile/newfile4.html','wb')#以写入形式打开本地文件
fh.write(data)#写入内容
fh.close()#关闭文件
import urllib.request
kwd='蒋先稳'
kwd=urllib.request.quote(kwd)#中文字符需进行编码设置
url='http://www.baidu.com/s?wd='+kwd
req=urllib.request.Request(url) #网址封装成请求
data=urllib.request.urlopen(req).read()
fh=open('c:/users/15432/newfile4.html','wb')
fh.write(data)
fh.close()
#post请求 需要账号密码验证请求进入
import urllib.request
import urllib.parse#解析模块(用来封装账户、密码)
url='http://email.163.com'#网址
#账号密码的封装
pwd=urllib.parse.urlencode({'email':'jiangxianwen@163.com','password':'*********'}).encode('utf-8')
#网址、账号密码封装成请求
req=urllib.request.Request(url,pwd)
data=urllib.request.urlopen(req).read()#读取登陆网页
fh=open('c:/users/15432/newfile4.html','wb')#以写入方式打开本地文件
fh.write(data)#写入读取的网页内容
fh.close()#关闭本地文件
#尝试正常状况下访问博客(异常处理)
import urllib.request
import urllib.error #异常模块导入
try:
data=urllib.request.urlopen('http://www.shmtu.edu.cn/').read()
print( data.index)
print(len(data))
except urllib.error.URLError as err:
if hasattr(err,'code'):
print(err.code)
if hasattr(err,'reason'):
print(err.reason)
#伪装成浏览器爬虫
import urllib.request
url='http://blog.csdn.net/weiwei_pig/article/details/52123738'#网址
#用户浏览器请求头部,元组形式
headers=('User-Agent',' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36')
opener=urllib.request.build_opener()#建立能够以头部一起请求的方式
opener.addheaders=[headers]#加入头部
data=opener.open(url).read()#开始网页读取
fh=open('c:/users/15432/newfile5.html','wb')#打开本地新文件
fh.write(data)#在本地文件写入爬取的内容
fh.close()#关闭文件
#利用“正则表达式+异常处理”爬取新浪新闻的每条
import urllib.request
import urllib.error
import re #正则表达式
data=urllib.request.urlopen('http://news.sina.com.cn/').read()#打开网页并读取内容
data=data.decode('utf-8','ignore')#忽略编码错误
pat='href="(http://mil.news.sina.com.cn/.*?)"'#定义原子
allurl=re.compile(pat).findall(data)#获取符合要求(筛选后)的所有网页
#allurl=re.findall(pat,data)
print(len(allurl))
#将所有爬取的网页都分别存储在本地文件中
for i in range(0,len(allurl)):
try:
print('第'+str(i)+'爬取',end=';')
thisurl=allurl[i]#按顺序循环取网页
file='c:/users/15432/sina/'+str(i)+'.html'#动态设置本地文件
urllib.request.urlretrieve(thisurl,file)#将每次获取的网页存在本地文件夹中
print('---成功---')
except urllib.error.URLError as err:
if hasattr(err,'code'):
print(err.code)
if hasattr(err,'reason'):
print(err.reason)
#代理服务器爬虫
import urllib.request
import re
#构建使用代理服务器函数
def use_proxy(url,ip):
proxy=urllib.request.ProxyHandler({'http':ip})
opener=urllib.request.build_opener(proxy,urllib.request.HTTPHandler)
urllib.request.install_opener(opener)#申明全局变量
data=urllib.request.urlopen(url).read().decode('utf-8','ignore')
return data
#传入实参
url_1='http://www.csdn.net/'
ip_1='118.190.95.35:9001'
data_1=use_proxy(url_1,ip_1)
print(len(data_1))
#图片爬虫
import urllib.request
import re
def use_proxy(url,ip):
proxy=urllib.request.ProxyHandler({'http':ip})
opener=urllib.request.build_opener(proxy,urllib.request.HTTPHandler)
urllib.request.install_opener(opener)#全局变量
data=urllib.request.urlopen(url).read().decode('utf-8','ignore')
return data
keywd='短裤'
keywd=urllib.request.quote(keywd)
for i in range(100):
url='https://s.taobao.com/list?spm=a21bo.2017.201867-links-0.17.122311d9m6DSSI&q='+keywd+'&cat=16&seller_type=taobao&oetag=6745&source=qiangdiao&bcoffset=12&s='+str(60*i)
ip='118.190.95.35:9001'
data=use_proxy(url,ip)
#定义函数,使用代理服务器,并且伪装成浏览器,带有异常处理机制
def use_proxy(url,ip):
try:
req=urllib.request.Request(url)#使用Request请求
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36')
proxy=urllib.request.ProxyHandler({'http':ip})
opener=urllib.request.build_opener(proxy,urllib.request.HTTPHandler)
urllib.request.install_opener(opener)
data=urllib.request.urlopen(req).read().decode('utf-8','ignore')
return data
except urllib.error.URLError as err:
if hasattr(err,'code'):
print(err.code)
if hasattr(err,'reason'):
print(err.reason)
time.sleep(10)#urlerror异常延长10秒处理
except Exception as err:
print('Exception:'+str(err))
time.sleep(1)#若Exception异常延长1秒
url_1='http://www.csdn.net/'
ip_1='118.190.95.35:9001'
data_1=use_proxy(url_1,ip_1)
print(len(data_1))
#多线程爬虫
#建立线程A
import threading
class A(threading.Thread):
def __init__(self):#初始化多线程
threading.Thread.__init__(self)
def run(self):
for i in range(2):
print('我是线程A')
#建立线程B
import threading
class B(threading.Thread):
def __init__(self):#初始化多线程
threading.Thread.__init__(self)
def run(self):
for i in range(3):
print('我是线程B')
t1=A()
t1.start()
t2=B()
t2.start()