02. 爬取get请求的页面数据

一.urllib库

  urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求。其常被用到的子模块在Python3中的为urllib.request和urllib.parse,在Python2中是urllib和urllib2。

二.由易到难的爬虫程序:

1.爬取百度首页面所有数据值

 1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 #导包
4 import urllib.request
5 import urllib.parse
6 if __name__ == "__main__":
7 #指定爬取的网页url
8 url = 'http://www.baidu.com/'
9 #通过urlopen函数向指定的url发起请求,返回响应对象
10 reponse = urllib.request.urlopen(url=url)
11 #通过调用响应对象中的read函数,返回响应回客户端的数据值(爬取到的数据)
12 data = reponse.read()#返回的数据为byte类型,并非字符串
13 print(data)#打印显示爬取到的数据值。

.

#补充说明
urlopen函数原型:urllib.request.urlopen(url, data=None, timeout=<object object at 0x10af327d0>, *, cafile=None, capath=None, cadefault=False, context=None) 在上述案例中我们只使用了该函数中的第一个参数url。在日常开发中,我们能用的只有url和data这两个参数。 url参数:指定向哪个url发起请求
data参数:可以将post请求中携带的参数封装成字典的形式传递给该参数(暂时不需要理解,后期会讲) urlopen函数返回的响应对象,相关函数调用介绍:
response.headers():获取响应头信息
response.getcode():获取响应状态码
response.geturl():获取请求的url
response.read():获取响应中的数据值(字节类型)

2.将爬取到百度新闻首页的数据值写入文件进行存储

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import urllib.request
import urllib.parse
if __name__ == "__main__":
url = 'http://news.baidu.com/'
reponse = urllib.request.urlopen(url=url)
#decode()作用是将响应中字节(byte)类型的数据值转成字符串类型
data = reponse.read().decode()
#使用IO操作将data表示的数据值以'w'权限的方式写入到news.html文件中
with open('./news.html','w') as fp:
fp.write(data)
print('写入文件完毕')

3.爬取网络上某张图片数据,且存储到本地

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import urllib.request
import urllib.parse
#如下两行代码表示忽略https证书,因为下面请求的url为https协议的请求,如果请求不是https则该两行代码可不用。
import ssl
ssl._create_default_https_context = ssl._create_unverified_context if __name__ == "__main__":
#url是https协议的
url = 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1536918978042&di=172c5a4583ca1d17a1a49dba2914cfb9&imgtype=0&src=http%3A%2F%2Fimgsrc.baidu.com%2Fimgad%2Fpic%2Fitem%2F0dd7912397dda144f04b5d9cb9b7d0a20cf48659.jpg'
reponse = urllib.request.urlopen(url=url)
data = reponse.read()#因为爬取的是图片数据值(二进制数据),则无需使用decode进行类型转换。
with open('./money.jpg','wb') as fp:
fp.write(data)
print('写入文件完毕')

4.url的特性:url必须为ASCII编码的数据值。所以我们在爬虫代码中编写url时,如果url中存在非ASCII编码的数据值,则必须对其进行ASCII编码后,该url方可被使用。

  案例:爬取使用百度根据指定词条搜索到的页面数据(例如爬取词条为‘周杰伦’的页面数据)

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import urllib.request
import urllib.parse if __name__ == "__main__":
#原始url中存在非ASCII编码的值,则该url无法被使用。
#url = 'http://www.baidu.com/s?ie=utf-8&kw=周杰伦'
#处理url中存在的非ASCII数据值
url = 'http://www.baidu.com/s?'
#将带有非ASCII的数据封装到字典中,url中非ASCII的数据往往都是'?'后面键值形式的请求参数
param = {
'ie':'utf-8',
'wd':'周杰伦'
}
#使用parse子模块中的urlencode函数将封装好的字典中存在的非ASCII的数值进行ASCII编码
param = urllib.parse.urlencode(param)
#将编码后的数据和url进行整合拼接成一个完整可用的url
url = url + param
print(url)
response = urllib.request.urlopen(url=url)
data = response.read()
with open('./周杰伦.html','wb') as fp:
fp.write(data)
print('写入文件完毕')

5.通过自定义请求对象,用于伪装爬虫程序请求的身份。

之前在讲解http常用请求头信息时,我们讲解过User-Agent参数,简称为UA,该参数的作用是用于表明本次请求载体的身份标识。如果我们通过浏览器发起的请求,则该请求的载体为当前浏览器,则UA参数的值表明的是当前浏览器的身份标识表示的一串数据。如果我们使用爬虫程序发起的一个请求,则该请求的载体为爬虫程序,那么该请求的UA为爬虫程序的身份标识表示的一串数据。有些网站会通过辨别请求的UA来判别该请求的载体是否为爬虫程序,如果为爬虫程序,则不会给该请求返回响应,那么我们的爬虫程序则也无法通过请求爬取到该网站中的数据值,这也是反爬虫的一种初级技术手段。那么为了防止该问题的出现,则我们可以给爬虫程序的UA进行伪装,伪装成某款浏览器的身份标识。

    上述案例中,我们是通过request模块中的urlopen发起的请求,该请求对象为urllib中内置的默认请求对象,我们无法对其进行UA进行更改操作。urllib还为我们提供了一种自定义请求对象的方式,我们可以通过自定义请求对象的方式,给该请求对象中的UA进行伪装(更改)操作。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import urllib.request
import urllib.parse import ssl
ssl._create_default_https_context = ssl._create_unverified_context if __name__ == "__main__":
#原始url中存在非ASCII编码的值,则该url无法被使用。
#url = 'http://www.baidu.com/s?ie=utf-8&kw=周杰伦'
#处理url中存在的非ASCII数据值
url = 'http://www.baidu.com/s?'
#将带有非ASCII的数据封装到字典中,url中非ASCII的数据往往都是'?'后面键值形式的请求参数
param = {
'ie':'utf-8',
'wd':'周杰伦'
}
#使用parse子模块中的urlencode函数将封装好的字典中存在的非ASCII的数值进行ASCII编码
param = urllib.parse.urlencode(param)
#将编码后的数据和url进行整合拼接成一个完整可用的url
url = url + param
#将浏览器的UA数据获取,封装到一个字典中。该UA值可以通过抓包工具或者浏览器自带的开发者工具中获取某请求,从中获取UA的值
headers={
'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
}
#自定义一个请求对象
#参数:url为请求的url。headers为UA的值。data为post请求的请求参数(后面讲)
request = urllib.request.Request(url=url,headers=headers) #发送我们自定义的请求(该请求的UA已经进行了伪装)
response = urllib.request.urlopen(request) data=response.read() with open('./周杰伦.html','wb') as fp:
fp.write(data)
print('写入数据完毕')

最新文章

  1. bzoj3388(神奇的解法)
  2. Linux下面安装MySQL
  3. C#-ASP.NET MVC-架构【1】-自定义错误页
  4. .NET 4.0 中超长路径超长文件名的问题
  5. 字符串和date之间的相互转换方法
  6. ASP.NET读取EXCEL文件的三种经典方法(转)
  7. angularjs $swipe调用方法
  8. C#基础精华08(反射,程序集)
  9. 【转】Unity3D NGUI事件 UIEvents
  10. css考核点整理(九)-有几种文字替换方式,之间的优缺点
  11. MyBatis Parameter not found
  12. iOS使用带字体图标的UIButton(支持各种方向)
  13. UVALive - 3027 Corporative Network (并查集)
  14. 初步了解.net
  15. 运维route语法
  16. TreeView的三种状态,全选,全不选,半选中
  17. Netty沾包和拆包
  18. lnmp thinkphp在linux上支持pathinfo
  19. 那些年用过的Redis集群架构
  20. ThinkPHP中的统计查询方法

热门文章

  1. BZOJ 2338 HNOI2011 数矩形 计算几何
  2. Timus 1146. Maximum Sum
  3. Kubernetes——自动扩展容器!假设你突然需要增加你的应用;你只需要告诉deployment一个新的 pod 副本总数即可
  4. Entity Framework 4.3 中使用存储过程
  5. HDU 1754 Java
  6. UNIX环境高级编程--2
  7. [转]Linux 正则表达式详解
  8. 微信接口本地调试(IIS服务器)
  9. C#语言最基础的数组和集合
  10. [Windows Server 2008] 安装PHP+MySQL方法