阿布云

你所需要的,不仅仅是一个好用的代理。

网络爬虫相关知识点

阿布云 发表于

6.png

这篇文章是本人这两天学习了一些爬虫知识后整理出来的,还在不断地完善,有什么不懂的地方也可提出来!

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

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

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

若获取当前爬取的网址,可使用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))

 

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

 

有的时候,我们希望程序在运行的过程中,边运行边打印调试日志,此时需要打开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