爬虫二(urllib模块)

1、在python2和python3中的差异

在python2中,urllib和urllib2各有各自的功能,虽然urllib2是urllib的升级版,但是urllib2还是不能完全替代urllib,但是在python3中,全部封装成一个类,即urllib

python2中urllib2和urllib的区别:

Urllib2可以接受一个Request对象,并以此可以来设置一个URL的headers,但是urllib只接受一个URL。这就意味着你不能通过urllib伪装自己的请求头。Urllib模板可以提供运行urlencode的方法,该方法用于GET查询字符串的生成,urllib2的不具备这样的功能,而且urllib.quote等一系列quote和unquote功能没有被加入urllib2中,因此有时也需要urllib的辅助。这就是urllib和urllib2一起使用的原因,quote用来url转码的

import urllib.request
urllib.request.Request(url, data=None, headers = {}, method= None)

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
'Referer': 'http://www.lagou.com/zhaopin/Python/?labelWords=label',
'Connection': 'keep-alive'
}

http的头信息可以直接使用字典的形式

Request如果要发送data,并无法直接传入字典类型的参数,需要进行数据转换,你可以直接使用类似于get传出参数的方法,也可以使用urllib给我们提供的类

from urllib import request, parse
data = {
'first': 'true',
'pn': 1,
'kd': 'Python'
}
data = parse.urlencode(data).encode('utf-8')
print(data)

#结果:
b'first=true&pn=1&kd=Python‘
urllib.parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None)
urlencode()主要作用就是将url附上要提交的数据。Post的数据必须是bytes或者iterable of bytes,不能是str,因此需要进行encode()编码

urllib.request.urlopen(url, data=None, timeout=None)

  • url    需要打开的网站
  • data    psot提交的数据
  • Timeout       网站访问的超时时间

但是没法伪装我们的头信息

from urllib import request
req = request.Request(url, headers=headers, data=data)
html = request.urlopen(req).read()

2、urllib的下载

from urllib import request

url = "http://inews.gtimg.com/newsapp_match/0/2711870562/0"
request.urlretrieve(url, "1.jpg")

或者通过

from urllib import request

url = "http://inews.gtimg.com/newsapp_match/0/2711870562/0"
req = request.Request(url)
res = request.urlopen(req)
text = res.read()
with open("2.jpg", "wb") as f:
f.write(text)

3、urllib的代理

from urllib import request, parse

data = {
'first': 'true',
'pn': 1,
'kd': 'Python'
}
url = 'http://2017.ip138.com/ic.asp'

proxy = request.ProxyHandler({'http': '112.95.61.146:8118'}) # 设置proxy
opener = request.build_opener(proxy) # 挂载opener
# opener = request.build_opener() # 挂载opener
request.install_opener(opener) # 安装opener
data = parse.urlencode(data).encode('utf-8')
page = opener.open(url, data).read()
print(type(page))
print(page.decode("gbk"))

结果:<body style="margin:0px"><center>您的IP是:[112.95.61.146] 来自:广东省深圳市 联通</center></body></html>

4、urllib的cookie使用

如果已经知道cookie,或者说你是通过抓包获取到的cookie,直接放在header的信息中直接登陆就可以,登陆京东网站的cookie信息和不登录京东的cookie信息是不一样的,你可以登录京东以后,抓取cookie的信息,然后访问任何网站就可以了

import urllib.request
url = "http://www.jd.com"
header = {"user-agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
"cookie": "xxxxx"}
req = urllib.request.Request(url=url, headers=header)
res = urllib.request.urlopen(req)
text = res.read()

5、urllib的cookie相关的类

  • 在python2中cookie的类叫做:import cookielib
  • 在python3中cookie的类叫做:import http.cookiejar

6、opener的概念

  • 当你获取一个URL你使用一个opener(一个urllib2 OpenerDirector的实例)。在前面,我们都是使用的默认的opener,也就是urlopen
  • urlopen是一个特殊的opener,可以理解成opener的一个特殊实例,传入的参数仅仅是url,data,timeout
  • 如果我们需要用到Cookie,只用这个opener是不能达到目的的,所以我们需要创建更一般的opener来实现对Cookie的设置

7、终端输出cookie对象

import urllib.request
import http.cookiejar

url = "http://www.hao123.com"
req = urllib.request.Request(url)
cookiejar = http.cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookiejar)
opener = urllib.request.build_opener(handler)
r = opener.open(req)
print(cookiejar)

输出:
<CookieJar[<Cookie BAIDUID=93B415355E0704B2BC94B5D514468898:FG=1 for .hao123.com/>, <Cookie hz=0 for .www.hao123.com/>, <Cookie ft=1 for www.hao123.com/>, <Cookie v_pg=normal for www.hao123.com/>]>

8、Cookie保存到文件中

import urllib.request
import http.cookiejar

url = "http://www.hao123.com"
req = urllib.request.Request(url)

cookieFileName = "cookie.txt"
cookiejar = http.cookiejar.MozillaCookieJar(cookieFileName)#文件cookie
handler = urllib.request.HTTPCookieProcessor(cookiejar)
opener = urllib.request.build_opener(handler)
r = opener.open(req)
print(cookiejar)
cookiejar.save()

保存在了文件cookie.txt中

MozillaCookieJar继承FileCookieJar()继承CookieJar

9、Cookie从文件中读取cookie信息并访问

import urllib.request
import http.cookiejar
cookie_filename = 'cookie.txt'
cookie = http.cookiejar.MozillaCookieJar(cookie_filename)
cookie.load(cookie_filename, ignore_discard=True, ignore_expires=True)
print(cookie)
url = "http://www.hao123.com"
req = urllib.request.Request(url)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler) # 利用urllib2的build_opener方法创建一个opener
response = opener.open(req)

print(response.read().decode(“utf-8”))#解决乱码的问题

 

转载于:https://www.cnblogs.com/Jweiqing/p/9189367.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452298.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

逆向工程

软件的逆向工程是分析程序以便在比源代码更高的抽象层次上创建出程序的某种表示的过程&#xff0c;也就是说&#xff0c;逆向工程是一个恢复设计结果的过程&#xff0c;逆向工程工具从现存的程序代码中抽取有关数据、体系结构和处理过程的设计信息。 简单的说根据已有的东西和…

protocol buffer使用小例

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 、使用EditPlus定义好一份proto文件&#xff08;用EditPlus是为了不出现乱码&#xff09;&#xff0c;如下 &#xff1a; package mypac…

2000服务器文件共享,Win2000 Server实现对共享文件的监控

病毒的出现&#xff0c;使我们在共享文件时变得异常小心。那么&#xff0c;有没有办法监控共享文件的使用情况并加以管理呢&#xff1f;有&#xff0c;用Windows 2000 Server的文件共享监控功能就可以实现。Windows 2000 Server的共享管理功能在“计算机管理”中&#xff0c;它…

学成在线--1.CMS接口开发

文章目录0.定义CMS1.CMS页面管理2.需求分析3.模型类介绍4.定义请求及响应类型5.定义接口6.创建CMS工程结构7.Dao1&#xff09;创建Dao&#xff0c;继承MongoRepository2&#xff09;编写测试类分页查询测试添加删除修改8.Service9.Controller10.接口开发规范0.定义CMS 1&#…

django 进阶

django进阶 django的分页器 基础语法&#xff1a; View Code简单练习&#xff1a; View Code实例应用&#xff1a; View Code自定义分页&#xff1a; View Codeform表单系统 原生form View CodeDjango表单系统中&#xff0c;所有的表单类都作为django.forms.Form的子类创建&…

BZOJ 2440: [中山市选2011]完全平方数

Time Limit: 10 Sec Memory Limit: 128 MB Submit: 5160 Solved: 2515 [Submit][Status][Discuss] Description 小 X 自幼就很喜欢数。但奇怪的是&#xff0c;他十分讨厌完全平方数。他觉得这些 数看起来很令人难受。由此&#xff0c;他也讨厌所有是完全平方数的正整数倍的…

如何减小与“大牛”的差距

为什么同样的时间有的人可以漂亮的完成工作&#xff0c;而有些人废了很大的力气也没有完成&#xff1f; 前者我们常常称之为“大牛”&#xff0c;后者我们常常叫他们“菜鸟”。当然“大牛”都是相对而言的&#xff0c;“大牛”也不可能方方面面都非常厉害&#xff0c;换句话说大…

软件再工程

软件再工程是指对既存对象系统进行调查&#xff0c;并将其重构为新形式代码的开发过程。最大限度地重用既存系统的各种资源是再工程的最重要特点之一。从软件重用方法学来说&#xff0c;如何开发可重用软件和如何构造采用可重用软件的系统体系结构是两个最关键问题。不过对再工…

武侠乂怎么修改服务器,武侠乂怎么操作 按键功能详细介绍

武侠乂将在7月27日开启限量测试了&#xff0c;入手前的第一件事情当然要熟悉操作按键了&#xff0c;下面给大家带来的是武侠乂按键介绍&#xff0c;一起来看看吧。武侠乂将在7月27日开启限量测试了&#xff0c;玩家们马上就能体会到武侠吃鸡的快感&#xff0c;除了吃鸡模式外还…

RMI使用小例

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1、定义一个接口&#xff08;继承Remote&#xff09;&#xff1a; 方法要抛RemoteException。 package rmi; import java.rmi.RemoteEx…

产品经理和项目经理有哪些区别?

1.产品经理和项目经理的差异 首先&#xff0c;产品经理和项目经理的职责定义不太一样。 产品经理是 Product Manager &#xff0c;主要是负责市场调研、用户研究并根据用户的需求&#xff0c;定义和设计产品&#xff0c;然后考虑产品的商业模式、运营推广方式等。接下来去推动…

09-完整性约束

本节重点&#xff1a; not null 与 defaultuniqueprimaryauto_incrementforeign key一、介绍 约束条件与数据类型的宽度一样&#xff0c;都是可选参数 作用&#xff1a;用于保证数据的完整性和一致性 主要分为&#xff1a; PRIMARY KEY (PK) #标识该字段为该表的主键&#x…

fread rb与r,wb,w的区别

在fread时&#xff0c;"rb"与"r"对某些字符作用&#xff0c;是不同的&#xff1b; 文本模式和二进制模式读取不一样的 文本&#xff1a;读: 遇到回车-换行(0D 0A)&#xff0c;就会转换为换行符0A 写&#xff1a;遇到换行符0A&#xff0c;就会转换为回车-换…

软件正向工程

正向工程是通过实现语言的映射而把模型转换为代码的过程。正向工程也称为革新或改造&#xff0c;这项活动不仅从现有程序中恢复设计信息&#xff0c;而且使用该信息去改变或重构现有系统&#xff0c;以提高其整体质量。 换句话说&#xff1a;一般工业产品开发是从确定预期功能…

学成在线--2.CMS前端页面查询开发

文章目录0.思路总结1.创建CMS模块的目录架构2.创建页面并配置路由1&#xff09;在page目录新建page_list.vue&#xff0c;扩展名为.vue。2&#xff09;在cms的router下配置路由。3&#xff09;在base目录下的router导入cms模块的路由3.使用Table组件完善页面内容4.Api调用服务器…

java.util.IdentityHashMap.entrySet()方法实例

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 entrySet() 方法是用来获取此映射中包含的映射关系的set视图。 声明 以下是java.util.IdentityHashMap.entrySet()方法的声明。 publ…

URL转微信可识别的二维码

jquery.qrcode.js 是一个能够在客户端生成矩阵二维码QRCode 的jquery插件 &#xff0c;使用它可以很方便的在页面上生成二维条码。 用法&#xff1a; 1、引入jquery.qrcode.min.js <script src"jquery.min.js"></script> <script src"jquery.qrc…

javascript数组及操作方法

数组及操作方法 数组就是一组数据的集合&#xff0c;javascript中&#xff0c;数组里面的数据可以是不同类型的。 定义数组的方法 //对象的实例创建 var aList new Array(1,2,3);//直接量创建 var aList2 [1,2,3,asd];操作数组中数据的方法 1、获取数组的长度&#xff1a;aLi…

如何创建比C语言更快的编程语言?

【CSDN编译整理】近日&#xff0c;beza1e1上发表了一篇博客《Faster than C》&#xff0c;在Hacker News和Reddit Programming上引发了开发者们的激烈讨论。现将此文编译&#xff0c;我们一起来探讨下。 单从编程语言特性来判断&#xff0c;虽然Fortran语言也以快而著称&#…

面向对象方法学

面向对象技术强调在软件开发过程中面向客观世界或问题域中的事物&#xff0c;采用人类在认识客观世界的过程中普遍运用的思维方法&#xff0c;直观、自然地描述客观世界中的有关事物。 面向对象的分析方法是利用面向对象的信息建模概念&#xff0c;如实体、关系、属性等&#x…