你所需要的,不仅仅是一个好用的代理。
这篇文章是本人这两天学习了一些爬虫知识后整理出来的,还在不断地完善,有什么不懂的地方也可提出来!
pwd #获取当前所在路径
'C:\Users\ZL'
cd D:\\python文件 ##更改当前路径为指定的路径D:\python文件
D:\python文件
pwd #查看更改后的当前路径
'D:\\python文件'
#获取百度首页内容
import urllib.request
url = 'http://www.baidu.com'
file = urllib.request.urlopen(url).read() #打开该网站,并读取网站内容存储在变量‘file’中
print(file) #打印出获取的网站的内容
##将该网址内容给存于本地文件
fhandle = open("D:/python文件/1.html",'wb') #以写入的方式打开一个本地文件,命名为*.html等网页格式
fhandle.write(file) #将爬取网页的内容赋值给了上述中的变量‘file’,在这里将变量的值写入到该文件中(可以看到写入的字节数是112159)
fhandle.close #关闭文件
##这样我们就将刚刚成功获取到的百度首页的内容保存到了本地(D:\python文件)文件夹下,可在该文件夹下查看
##也可以通过urllib.request.urlretrieve()将获取的内容保存到本地文件中
filename = urllib.request.urlretrieve('http://edu.51cto.com',filename = "D:/python文件/2.html")
urlretrieve执行的过程中,可能会产生一些缓存,若想清理这些缓存信息,可使用urlcleanup()进行清除,如以下的代码就可以清除:
urllib.request.urlcleanup()
urllib.request.urlopen(url).getcode()
urllib.request.urlopen(url).geturl()
'http://www.baidu.com'
若在URL中使用一些不合标准的字符就会出现问题,此时需要进行编码,可以使用urllib.request.quote()进行,如对网址“ https://www.sina.com.cn ” 进行编码,可使用以下代码进行
urllib.request.quote('https://www.sina.com.cn')
'https%3A//www.sina.com.cn'
urllib.request.unquote("https%3A//www.sina.com.cn")
'https://www.sina.com.cn'
(模拟浏览器)对于无法爬取的网页,可使用下面的代码(先任意打开一个网页,进入首页后按F12,随便百度一个链接
###两种方法,其区别之处就在于尾端的s和有没有下划线
import urllib.request
url = ("输入要爬取的网址")#定义了要爬取的网址赋给变量url
headers = ("User-Agent","从浏览器中获取的具体信息")#格式为(“User-Agent”,具体信息)
opener = urllib.request.build_opener()#修改报头
opener.addheaders = [headers]
data = opener.open(url).read
或
import urllib.request
url = ("输入要爬取的网址")
req = urllib.Request(url)#创建一个Request对象赋给req
req.add_header('User-Agent','从浏览器中获取的具体信息')
data = urllib.request.urlopen(req).read()#打开了对应的网址,并且读取了网页内容,赋给了变量data
##网页超时的时候,无法打开网页,我们即可根据自己的需要而安排超时的时间值
import urllib.request
for i in range(1,100):
try:
file = urllib.request.urlopen("此处是需要爬取的网址",timeout=1)##超时设置为1秒钟,也就是说1秒钟未响应的话就判定为超时,并读取该网站的内容,输出获取到的内容的长度
data = file.read()
print(len(data))
except Exception as e:
print("出现异常-->"+str(e))##如果超时,则会引发异常,输出“出现异常”等字样,并输出对应的异常原因 ##如果要在爬取的时候设置超时异常的值,可以在urlopen()打开网址的时候通过timeout字段设置,格式为urllib.request.urlopen(要打开的网址,timeout=时间值)
import urllib.request
for i in range(1,10):
try:
file = urllib.request.urlopen("http://yum.iqianyue.com",timeout=20)#响应时间为20,即在20秒之内向该网站发送了大量的请求,继而在短时间内无法响应
data = file.read()
print(len(data))
except Exception as e:
print("出现异常-->"+str(e))
代理服务器的设置(即在同一个IP去爬取同一个网站上的网页,有时候就可能被屏蔽,则使用代理服务器,继而显示的不是我们的IP 地址,而是代理服务器的IP地址)
def use_proxy(proxy_addr,url):#自定义函数,实现使用代理服务器爬取网页的功能(第一个形参为代理服务器的地址,第二个为爬取网页的地址)
import urllib.request
proxy = urllib.request.ProxyHandler({"http":proxy_addr})#设置代理服务器信息
opener = urllib.request.build_opener(proxy,urllib.request.HTTPHandler)#创建对象opener,第一个为代理信息,第二个为类
urllib.request.install_opener(opener)#创建全局默认的opener对象
data = urllib.request.urlopen(url).read().decode('utf-8')#将获取的网址内容进行编码
return data
proxy_addr="42.4.215.69:80"
data = use_proxy(proxy_addr,"http://www.baidu.com")
print(len(data))
##若某个IP地址打不开的话,估计就是失效了,多找几个IP地址试试
有的时候,我们希望程序在运行的过程中,边运行边打印调试日志,此时需要打开DebugLog,思路如下:
import urllib.request
httphd = urllib.request.HTTPHandler(debuglevel=1)
httpshd = urllib.request.HTTPSHandler(debuglevel=1)
opener = urllib.request.build_opener(httphd,httpshd)#创建自定义对象
urllib.request.install_opener(opener)#创建全局默认的opener对象
data = urllib.request.urlopen("http://edu.51cto.com")
send: b'GET / HTTP/1.1\r\nAccept-Encoding: identity\r\nHost: edu.51cto.com\r\nConnection: close\r\nUser-Agent: Python-urllib/3.5\r\n\r\n'
reply: 'HTTP/1.1 200 OK\r\n'
header: Date header: Content-Type header: Transfer-Encoding header: Connection header: Set-Cookie header: Server header: Vary header: Vary header: Vary header: Set-Cookie header: Expires header: Cache-Control header: Pragma header: Set-Cookie header: Set-Cookie header: Set-Cookie header: Load-Balancing header: Load-Balancing
爬虫中,处理异常,用URL异常处理器——URLErro类进行相应的处理,需要导入urllib.error模块(HTTPErro是URLErro的子类)
import urllib.request
import urllib.error
try:
urllib.request.urlopen("http://blog.csdn.net")#对该网页进行爬取
except urllib.error.HTTPError as e:##先用子类处理异常
print(e.code)
print(e.reason)
except urllib.error.URLError as e:#用父类处理异常
print(e.reason)
##先用子类处理异常,处理不了的话再用父类处理异常
send: b'GET / HTTP/1.1\r\nAccept-Encoding: identity\r\nHost: blog.csdn.net\r\nConnection: close\r\nUser-Agent: Python-urllib/3.5\r\n\r\n'
reply: 'HTTP/1.1 200 OK\r\n'
header: Server header: Date header: Content-Type header: Content-Length header: Connection header: Vary header: Cache-Control