python爬虫(二)
python爬虫之urllib
在python2和python3中的差异
在python2中,urllib和urllib2各有各个的功能,虽然urllib2是urllib的升级版,但是urllib2还是不能完全替代urllib,但是在python3中,全部封装成一个类urllib。
Urllib2可以接受一个Request对象,并以此可以来设置一个URL的headers,但是urllib只接受一个URL。这就意味着你不能通过urllib伪装自己的请求头。
Urllib模板可以提供运行urlencode的方法,该方法用于GET查询字符串的生成,urllib2的不具备这样的功能,而且urllib.quote等一系列quote和unquote功能没有被加入urllib2中,因此有时也需要urllib的辅助。这就是urllib和urllib2一起使用的原因。。quote用来url转码的。
Request
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的头信息可以直接使用字典的形式。
urllib发送数据
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‘
urlencode()主要作用就是将url附上要提交的数据。
Post的数据必须是bytes或者iterable of bytes,不能是str,因此需要进行encode()编码。
urllib.parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None)
urlopen
没法伪装我们的头信息
urllib.request.urlopen(url, data=None, timeout=None) url 需要打开的网站
data psot提交的数据
Timeout 网站访问的超时时间
Request
可以伪装头信息
from urllib import request
req = request.Request(url, headers=headers, data=data)
html = request.urlopen(req).read()
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)
urllib的代理
from urllib import request, parse
data = {
'first': 'true',
'pn': 1,
'kd': 'Python'
}
url = 'http://2018.ip138.com/ic.asp'
proxy = request.ProxyHandler({'http': '113.95.51.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是:[113.95.51.146] 来自:湖北省武汉市 联通</center></body></html>
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()
urllib的cookie相关的类
在python2中cookie的类叫做:import cookielib
在python3中cookie的类叫做:import http.cookiejar
opener的概念
当你获取一个URL你使用一个opener(一个urllib2.OpenerDirector的实例)。在前面,我们都是使用的默认的opener,也就是urlopen。
urlopen是一个特殊的opener,可以理解成opener的一个特殊实例,传入的参数仅仅是url,data,timeout。
如果我们需要用到Cookie,只用这个opener是不能达到目的的,所以我们需要创建更一般的opener来实现对Cookie的设置。
终端输出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/>]>
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
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”))#解决乱码的问题
python爬虫(二)的更多相关文章
- Python爬虫二
常见的反爬手段和解决思路 1)明确反反爬的主要思路 反反爬的主要思路就是尽可能的去模拟浏览器,浏览器在如何操作,代码中就如何去实现;浏览器先请求了地址url1,保留了cookie在本地,之后请求地址u ...
- Python 爬虫二 requests模块
requests模块 Requests模块 get方法请求 整体演示一下: import requests response = requests.get("https://www.baid ...
- Python爬虫(二十一)_Selenium与PhantomJS
本章将介绍使用Selenium和PhantomJS两种工具用来加载动态数据,更多内容请参考:Python学习指南 Selenium Selenium是一个Web的自动化测试工具,最初是为网站自动化测试 ...
- python爬虫(二)--了解deque
队列-deque 有了上面一节的基础.当然你须要全然掌握上一节的全部方法,由于上一节的方法.在以下的教程中 会重复的用到. 假设你没有记住,请你返回上一节. http://blog.csdn.net/ ...
- python爬虫(二)_HTTP的请求和响应
HTTP和HTTPS HTTP(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收HTML页面的方法 HTTPS(HyperText Transfer Prot ...
- Python爬虫(二十四)_selenium案例:执行javascript脚本
本章叫介绍如何使用selenium在浏览器中使用js脚本,更多内容请参考:Python学习指南 隐藏百度图片 #-*- coding:utf-8 -*- #本篇将模拟执行javascript语句 fr ...
- Python爬虫(二十三)_selenium案例:动态模拟页面点击
本篇主要介绍使用selenium模拟点击下一页,更多内容请参考:Python学习指南 #-*- coding:utf-8 -*- import unittest from selenium impor ...
- Python爬虫(二十二)_selenium案例:模拟登陆豆瓣
本篇博客主要用于介绍如何使用selenium+phantomJS模拟登陆豆瓣,没有考虑验证码的问题,更多内容,请参考:Python学习指南 #-*- coding:utf-8 -*- from sel ...
- Python爬虫(二十)_动态爬取影评信息
本案例介绍从JavaScript中采集加载的数据.更多内容请参考:Python学习指南 #-*- coding:utf-8 -*- import requests import re import t ...
- Python 爬虫(二十五) Cookie的处理--cookielib库的使用
Python中cookielib库(python3中为http.cookiejar)为存储和管理cookie提供客户端支持. 该模块主要功能是提供可存储cookie的对象.使用此模块捕获cookie并 ...
随机推荐
- SQL SERVER中LIKE使用变量类型输出结果不同
前言:Sql Server中LIKE里面使用不同的变量类型导致查询结果不一致的问题,其实看似有点让人不解的现象背后实质跟数据类型的实现有关. 一.我们先来创建示例演示具体操作 CREATE TABLE ...
- 【ibatis】IBatis的SQL批量操作
1.Ibatis批量添加(传入class的list即可) <insert id="Add" resultMap="Select" parameterCla ...
- Android 7.0 以上保留数据去除锁屏密码的方法
在很多情况下,由于我们的疏忽,导致忘记了锁屏密码.也没有开启 USB 调试,内置存储中还有要保留的数据.我们需要在不清除数据的情况下删除锁屏密码.接下来我们就介绍该如何做. 注意事项 首先要注意,这个 ...
- Three.js开发指南---创建,加载高级网格和几何体(第八章)
本章的主要内容: 一, 通过Three.js自带的功能来组合和合并已有的几何体,创建出新的几何体 二, 从外部资源中加载网格和几何体 1 前面的章节中,我们学习到,一个几何体创建的网格,想使用多个材质 ...
- css3 flex弹性盒子布局梳理,打通任督二脉
挺早就接触了css的flex布局,深入使用也就是在近期移动端开发.老来多健忘,只能自己梳理一下知识点,当做温故知新吧. ,请原谅小白的才疏学浅,写的不到位的地方请指正. flex属性用于设置或检索弹性 ...
- cf97D. Robot in Basement(模拟 bitset)
题意 题目链接 Sol 接下来我的实现方式和论文里不太一样 然后用bitset优化,上下走分别对应着右移/左移m位,左右走对应着右移/左移1位 我们可以直接预处理出能走的格子和不能走的格子,每次走的时 ...
- HBase安装与应用
1. 参考说明 参考文档: https://hbase.apache.org/book.html 2. 安装环境说明 2.1. 环境说明 CentOS7.4+ Hadoop2.7.5的伪分布式环 ...
- Android--WebView 自适应代码
//WebView自适应代码 private String getHtmlData(String bodyHTML) { String head = "<head>" ...
- Android网络编程系列之Volley总结
前言 Volley的中文翻译为“齐射.并发”,是在2013年的Google大会上发布的一款Android平台网络通信库,具有网络请求的处理.小图片的异步加载和缓存等功能,能够帮助 Android AP ...
- cuda中用cublas库做矩阵乘法
这里矩阵C=A*B,原始文档给的公式是C=alpha*A*B+beta*C,所以这里alpha=1,beta=0. 主要使用cublasSgemm这个函数,这个函数的第二个参数有三种类型,这里CUBL ...