网络爬虫相关知识点

305次阅读
没有评论
网络爬虫相关知识点
  • 这篇文章是本人这两天学习了一些爬虫知识后整理出来的,还在不断地完善,有什么不懂的地方也可提出来!

    pwd #获取当前所在路径

    'C:UsersZL'

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.1rnAccept-Encoding: identityrnHost: edu.51cto.comrnConnection: closernUser-Agent: Python-urllib/3.5rnrn' reply: 'HTTP/1.1 200 OKrn' 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.1rnAccept-Encoding: identityrnHost: blog.csdn.netrnConnection: closernUser-Agent: Python-urllib/3.5rnrn' reply: 'HTTP/1.1 200 OKrn' header: Server header: Date header: Content-Type header: Content-Length header: Connection header: Vary header: Cache-Control

神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试

相关文章:

版权声明:Python教程2022-10-24发表,共计5076字。
新手QQ群:570568346,欢迎进群讨论 Python51学习