网络爬虫相关知识点

  • 这篇文章是本人这两天学习了一些爬虫知识后整理出来的,还在不断地完善,有什么不懂的地方也可提出来!
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文件)文件夹下,可在该文件夹下查看
112159
##也可以通过urllib.request.urlretrieve()将获取的内容保存到本地文件中
filename = urllib.request.urlretrieve('http://edu.51cto.com',filename = "D:/python文件/2.html")

urlretrieve执行的过程中,可能会产生一些缓存,若想清理这些缓存信息,可使用urlcleanup()进行清除,如以下的代码就可以清除:

urllib.request.urlcleanup()

此外,若我们希望获取当前爬取网页的状态码,可使用getcode()返回,比如可执行:

urllib.request.urlopen(url).getcode()
200

若获取当前爬取的网址,可使用geturl()

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))
14165
14165
14165
14165
14165
14165
14165
14165
14165

HTTP协议请求(进行客户端与服务器之间的消息传递)

  • GET请求:GET请求会通过URL网址传递信息,可以直接在URL中写上要传递的信息,也可以由表单进行传递。若使用表单进行传递,表单中的信息会自动转为URL地址中的数据,通过URL传递数据
  • POST请求:可以向服务器提交数据,是一种比,较主流也比较安全的数据传递方式
  • PUT请求:请求服务器存储一个资源,通常要指定要存储的位置
  • DELETE请求:请求服务器删除一个资源
  • HEAD请求:请求获取对应的HTTP报头信息
  • OPTIONS请求:可以获得当前URL所支持的请求类型

代理服务器的设置

即在同一个IP去爬取同一个网站上的网页,有时候就可能被屏蔽,则使用代理服务器,继而显示的不是我们的IP 地址,而是代理服务器的IP地址
当然可以从整理好的网址http://yum.iqianyue.com/proxy中找到许多代理服务器地址

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地址试试
8993

有的时候,我们希望程序在运行的过程中,边运行边打印调试日志,此时需要打开DebugLog,思路如下:

  • (1)分别使用urllib.request.HTTPHandler()和urllib.request.HTTPSHandler()将debuglevel设置1
  • (2)使用urllib.request.build_opener()创建自定义的opener对象,并使用上式中设置的值为参数
  • (3)用urllib.request.install_opener()创建全局默认的opener对象,这样,在使用urlopen()时,也会使用安装的opener()对象
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的子类)

  • 进行异常处理,我们经常使用try...except语句,try中执行主要代码,在except中捕获异常信息,并进行相应的异常处理
  • 一般来说,产生URLErro的原因有如下可能:1,连接不上服务器;2远程URL不存在;3无网络;4触发了HTTPErro
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
posted @ 2017-08-19 19:44  LouieZhang  阅读(858)  评论(0编辑  收藏  举报