urllib 库

urllib 库是 Python 中一个最基本的网络请求库。它可以模仿浏览器的行为向指定的服务器发送请求,同时可以保存服务器返回的数据。

urlopen()

在 Python3 的 urllib 库中,所有和网络请求的相关方法都被集中到 urllib.request 模块下了。以下是 urlopen() 方法最基本的使用方法:

from urllib import request
resp = request.urlopen('https://www.baidu.com')
print(resp.read())

上面的代码执行完毕后在终端会打印出百度首页的源代码。

urlopen() 方法可以写两个参数(常用的):

  • url:请求的 url
  • data:请求的 data,如果设置了这个值,那么将变成 post 请求

urlopen() 方法的返回值是一个 http.client.HPPTResponse 对象,这个对象是一个类文件句柄对象。有 read(size)、readline()、readlines() 以及 getcode() 等方法。

urlretrieve()

这个方法可以方便的将网页上的一个文件保存到本地。以下代码可以非常方便的将百度的首页下载到本地:

from urllib import request
request.urlretrieve('http://www.baidu.com/', 'baidu.html')

urlencode()

若 ulr 中包含了中文或其他特殊字符,则浏览器会自动给我们进行编码。要用爬虫模拟浏览器,就需要进行手动编码,此时就要用到 urlencode() 方法来实现。这个方法可以把字典数据转换为 url 编码的数据。例如:

from urllib import parse

url = 'https://www.baidu.com/s'

params = {"wd": "教学设计"}
qs = parse.urlencode(params)
url = url + "?ie=UTF-8&&" + qs
print(qs)
print(url)
resp = request.urlopen(url)
print(resp.read())

parse_qs()

此方法可以将经过编码后的 ulr 参数进行解码。例如:

from urllib import parse

params = {'name': '木易', 'age': '21', 'sex': 'male'}
qs = parse.urlencode(params)
result = parse.parse_qs(qs)
print(result)

urlparse() 和 urlsplit()

这两个方法用来对 url 的各个组成部分进行分割。最后可以一次性拿到全部的 url 组成部分,也可以单独拿出某个部分。例如:

from urllib import parse

url = 'https://baike.baidu.com/item/hello%20world/85501?fr=aladdin#2_13'

result = parse.urlparse(url)
print(result) //拿出全部
// 分别拿出各个部分
print('scheme:', result.scheme)
print('netloc:', result.netloc)
print('path:', result.path)
print('params:',result.params) // urlsplit() 方法没有此项结果
print('query:', result.query)
print('fragment:', result.fragment)

urlparse() 和 urlsplit() 基本上是一模一样的,有一个不一样的地方是,urlparse() 里多了一个 “params” 属性,而 urlsplit() 没有这个 params 属性。例如有一个 url 为:“https://www.baidu.com/s;hello?wd=python&username=abc#1”,那么 urlparse() 可以的 “params” 获取到 “hello”,而 urlsplit() 则不可以。

request.Request 类

如果想要伪装爬虫,就要在请求的时候增加一些请求头,那么就必须使用 request.Request 类来实现,比如下面请求拉勾网的这段代码:

from urllib import request, parse

url = 'https://www.lagou.com/jobs/positionAjax.json?px=default&gx=%E5%85%A8%E8%81%8C&needAddtionalResult=false&isSchoolJob=1'

// 这里的 User-Agent 和 Referer 参数是我先用 Chrome 访问再用F12检查得到的,下面的 data 也是
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
'Referer': 'https://www.lagou.com/jobs/list_Go?px=default&gx=%E5%85%A8%E8%81%8C&gj=&isSchoolJob=1&city=%E5%85%A8%E5%9B%BD'
} data = {
'first': 'true',
'pn': 1,
'kd': 'python'
} req = request.Request(url, headers=headers, data=parse.urlencode(data).encode('utf-8'), method='POST')
resp = request.urlopen(req)
print(resp.read().decode('utf-8'))

ProxyHandler 处理器(代理设置)

许多网站会检测某一时间段某个 IP 的访问次数(通过流量统计,系统日志等),如果访问次数多得不像正常人,它会禁止这个 IP 的访问。所以我们可以设置一些代理服务器,每隔一段时间换一个代理,就算 IP 被禁止,依然可以换个 IP 继续爬取数据。

urllib 中通过 ProxyHandler 来设置使用代理服务器,下面代码说明如何使用自定义 opener 来使用代理:

from urllib import request

# 未使用代理
url = 'http://httpbin.org/ip'
resp = request.urlopen(url)
print(resp.read()) # 使用代理
# 1.使用 ProxyHandler,传入代理构建一个handler
handler = request.ProxyHandler({"https": "183.163.40.223:31773"})
# 2.使用上面创建的handler构建一个opener
opener = request.build_opener(handler)
# 3.使用opener发送一个请求
resp = opener.open(url)
print(resp.read())

可以通过 http://httpbin.org/ip 查看自己电脑网络的外网 IP 地址

常用的代理有:

- 西刺免费代理IP:http://www.xicidaili.com/

- 快代理:https://www.kuaidaili.com/

- 代理云:http://www.dailiyun.com/

cookie

HTTP请求是无状态的,所以即使第一次和服务器连接并登录成功后,第二次请求服务器依然不知道当前请求是哪个用户。cookie 的出现就是为了解决这个问题,第一次登陆后服务器返回一些数据给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就自动将上次请求存储的 cookie 数据自动携带给服务器,这样服务器就可以通过浏览器携带的数据来判断当前用户身份了。cookie 存储的数据量有限,不同浏览器有不同的存储大小,但一般不超过4KB。

cookie 的格式:

Set-Cookie: NAME=VALUE; Expires/Max-age=DATE; Path=PATH; Domain=DOMAIN_NAME; SECURE

爬虫常用的 urllib 库知识点的更多相关文章

  1. 第三百二十七节,web爬虫讲解2—urllib库爬虫—基础使用—超时设置—自动模拟http请求

    第三百二十七节,web爬虫讲解2—urllib库爬虫 利用python系统自带的urllib库写简单爬虫 urlopen()获取一个URL的html源码read()读出html源码内容decode(& ...

  2. 爬虫入门之urllib库详解(二)

    爬虫入门之urllib库详解(二) 1 urllib模块 urllib模块是一个运用于URL的包 urllib.request用于访问和读取URLS urllib.error包括了所有urllib.r ...

  3. 第三百三十六节,web爬虫讲解2—urllib库中使用xpath表达式—BeautifulSoup基础

    第三百三十六节,web爬虫讲解2—urllib库中使用xpath表达式—BeautifulSoup基础 在urllib中,我们一样可以使用xpath表达式进行信息提取,此时,你需要首先安装lxml模块 ...

  4. 第三百三十节,web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解

    第三百三十节,web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解 封装模块 #!/usr/bin/env python # -*- coding: utf- ...

  5. 第三百二十九节,web爬虫讲解2—urllib库爬虫—ip代理—用户代理和ip代理结合应用

    第三百二十九节,web爬虫讲解2—urllib库爬虫—ip代理 使用IP代理 ProxyHandler()格式化IP,第一个参数,请求目标可能是http或者https,对应设置build_opener ...

  6. 第三百二十八节,web爬虫讲解2—urllib库爬虫—状态吗—异常处理—浏览器伪装技术、设置用户代理

    第三百二十八节,web爬虫讲解2—urllib库爬虫—状态吗—异常处理—浏览器伪装技术.设置用户代理 如果爬虫没有异常处理,那么爬行中一旦出现错误,程序将崩溃停止工作,有异常处理即使出现错误也能继续执 ...

  7. Python爬虫入门之Urllib库的高级用法

    1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...

  8. 六 web爬虫讲解2—urllib库爬虫—基础使用—超时设置—自动模拟http请求

    利用python系统自带的urllib库写简单爬虫 urlopen()获取一个URL的html源码read()读出html源码内容decode("utf-8")将字节转化成字符串 ...

  9. Python爬虫入门之Urllib库的基本使用

    那么接下来,小伙伴们就一起和我真正迈向我们的爬虫之路吧. 1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器解 ...

随机推荐

  1. [翻译] ABCIntroView

    ABCIntroView ABCIntroView is an easy to use onboarding which allows you to introduce your users to t ...

  2. 【MyBatis】 MyBatis入门

    1.MyBatis简介 MyBatis是这个框架现在的名字,而此框架最早的名字是IBatis,其名字的含义是“internet”.“abatis”两个单词的组合,是在2002年的时候开始的一个开源项目 ...

  3. 推送代码到GitHub上的两种方式

       要想将本地Git上代码提交到GitHub可以使用两种协议进行提交,分别使用HTTPS和SSH两种协议,如下所示. 当使用HTTPS协议时,每次推送的时候都需要输入GitHub平台的用户名密码. ...

  4. CopyrightHelper—开源VS插件辅助插入版权注释

    前言 有很多时候,我们在写代码的时候需要在代码文件头加上描述和版权信息等,如果使用代码项目模板又得为每种文件定模板,而已不方便,如果从某个地方复制过来,又嫌麻烦... 为了能解决这种懒人的需求,我开始 ...

  5. 设计模式之Proxy(代理)

    设计模式之Proxy(代理) 板桥里人banq http://www.jdon.com 2002/04/21/ 理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水, ...

  6. 【OpenCV】透视变换矫正

    演示结果参考: 功能实现:运行程序,会显示图片的尺寸,按回车键后,依次点击需矫正的图片的左上.右上.左下.右下角,并能显示其坐标,结果弹出矫正后的图片,如图上的PIC2对话框.可以继续选择图片四个点进 ...

  7. codeforces A. Supercentral Point 题解

    版权声明:本文作者靖心,靖空间地址:http://blog.csdn.net/kenden23/,未经本作者同意不得转载. https://blog.csdn.net/kenden23/article ...

  8. mysql 数据增删改查基本语句

    增: insert insert into 表名(字段1,字段2,字段3......字段N) values(值1,值2,值3): 如果不申明插入那些字段,则默认所有字段. 如果一次可以插入多条数据 可 ...

  9. VIM之模式

    1.模式介绍: 在真正开始使用VIM之前,你必须先了解VIM的模式,否则在 VIM 面前你可能会手足无措.VIM是有模式 编辑器,这意味着 VIM 有多种不同的工作模式,在不同的工作模式下用户相同的操 ...

  10. Jmeter--常见问题及解决办法

    此文转自微信公众号:自动化性能测试 JMeter常见问题及解决方法 一.录制不到以html结尾的请求 在使用代理服务器录制脚本的时候,可能会出现html结尾的请求录制不到的问题.这是因为浏览器为了提升 ...