一.urllib库

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

一般是用urllib 库 爬取图片比较方便, requests 库 封装的比 urllib库好多了 

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

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

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#导包
import urllib.request
import urllib.parse
if __name__ == "__main__":
#指定爬取的网页url
url = 'http://www.baidu.com/'
#通过urlopen函数向指定的url发起请求,返回响应对象
reponse = urllib.request.urlopen(url=url)
#通过调用响应对象中的read函数,返回响应回客户端的数据值(爬取到的数据)
data = reponse.read()#返回的数据为byte类型,并非字符串
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. RN8209校正软件开发心得(1)
  2. Winform程序Chrome内核 WebBrowser 控件
  3. 分布式缓存技术redis学习系列(二)——详细讲解redis数据结构(内存模型)以及常用命令
  4. 移动端设置字体px转换rem的脚本
  5. .NET领域驱动设计—看DDD是如何运用设计模式颠覆传统架构
  6. HTTPS科普扫盲帖
  7. Nginx系列5之让Nginx支持HTTP1.1
  8. git diff获取差异文件中文乱码的解决办法
  9. cookie sessionStorage localStorage 区别
  10. web api返回格式小结
  11. 12c Grid Infrastructure Management Repository (GIMR)
  12. WebGoat学习——SQL注入(SQL Injection)
  13. SVN备份教程(三)
  14. 03_SQL server数据类型
  15. Jira配置openLdap服务器进行用户认证
  16. rails 杂记 - render and layout
  17. SQL0668N 不允许对表&quot;xxx&quot;执行操作,原因码为 &quot;1&quot;
  18. docker swarn集群笔记
  19. IDEA创建Spring Boot项目
  20. thinkphp图像的裁剪、缩放、加水印

热门文章

  1. zookeeper 学习命令
  2. ECMAScript 6 基础入门
  3. 【剑指offer】找出数组中任意一个重复的数字,C++实现
  4. jQuery radio|checkbox的取值与赋值
  5. ios逆向工程-内部钩子(Method Swizzling)
  6. BZOJ5450: 轰炸(水题,Tarjan缩点求最长路)
  7. BZOJ5142: [Usaco2017 Dec]Haybale Feast(双指针&amp;set)(可线段树优化)
  8. hiho 1515 : 分数调查 简单bfs
  9. Java多线程小例子(三个窗口卖火车票)
  10. IntelliJ-IDEA中mybatis三剑客