python爬虫学习手册-服务器渲染(基础库urllib)熟悉

今天我们来说说python爬虫的第一步!爬,爬这一步分为网站爬取和APP爬取,而网站爬取里面按照渲染方式,有分为服务器端渲染和客户端渲染,这么说是不是有点蒙,没关系你只需要知道今天说的是爬虫的一个必会的基础库,后续关于关于分类我会上一张图,你一看就懂了

基础库

服务器端渲染的基础请求库,分为这么几个

  • urllib(原生底层库)
  • urllib3(urlib的改良版)
  • httplib2(基础请求库)
  • pycurl(libcurl的python实现)
  • httper(支持HTTP2新特性的库)

今天我们来说说第一个库,urllib
那么好,我们来提两个问题

1.urllib是什么?
2.urllib怎么用?

1.urllib是什么?

urllib是python内置的HTTP请求库
里面包括以下模块
urllib.request 请求模块
urllib.error 异常处理模块
urllib.parse url解析模块
urllib.robotparser robots.txt解析模块(用的太少了,本篇就不说的,附上urllib.robotparser官方文档,有需要的可以去看一下)

接下来来说一说这些模块的使用问题,也就是包含的模块怎么用!

一、urllib.request

  • 请求模块,通俗点说就是用于获取网页的响应内容,也是爬虫的第一步!
    urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,cadefault=False,context=None)
    这里面有三个常用的参数分别是

url:为请求网址
data:请求时需要发送的参数
timeout:超时设置,在该时间范围内返回请求内容就不会报错

eg:

from urllib import request

 # 请求获取网页返回内容
 response = request.urlopen('https://www.baidu.com/')
 # 获取网页返回内容
 print(response.read().decode('utf-8'))
 # 获取状态码
 print(response.status)
 # 获取请求头
print(response.getheaders())

请求状态码:如果请求状态码为200,则正常访问
请求头:某些网站具有反爬功能,这时候我们就需要设置请求头进行伪装(以后我们会详细说)
eg:

# 请求头
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'}
requests = request.Request('https://book.douban.com/', headers=headers) # 设置请求头
# 进行请求,把Request对象传入urlopen参数中
response = request.urlopen(requests)
  • 通常我们请求网站时候使用的是GET方法,但是还有一种网站,需要登录以后才能看到登录后的信息,这时候我们需要使用POST方法,把需要进行登录提交的信息提交给服务器,服务器会响应我们的请求,返回登录后的界面
 from urllib import request, parse
 # 使用post方法来进行模拟登陆豆瓣
 data = {'source': 'None',
  'redir': 'https://www.douban.com/',
  'form_email': 'user',
  'form_password': 'passwd',
  'remember': 'on',
  'login': '登录'}
 # 将data的字典类型转换为get请求方式
data = bytes(parse.urlencode(data), encoding='utf-8')
requests = request.Request('https://accounts.douban.com/login', headers=headers, data=data, method='POST')
response = request.urlopen(requests)
print(response.read().decode('utf-8'))
  • 登录需要提交的信息设置在data里
  • 类型是字典类型
  • 请求方法设置为POST
上面我们提到了两种方法,这两种是HTTP常用的方法,有相似的地方就有比较,那么我们来说说这两种方法的比较
  • GET -- 从指定的资源请求数据。
  • POST -- 向指定的资源提交要被处理的数据

比较:


捕获.JPG

在登陆了之后我们,就需要获取一个非常重要的东西----Coookie,如果获取了cookie就可以保存我们的登陆信息,但是urlib获取cookie比较繁琐

 from http import cookiejar
 # 获取cookie
 cookie = cookiejar.CookieJar()
 # 获取助手把cookie传进去
 handler = request.HTTPCookieProcessor(cookie)
 # 获取opener进行请求网站
 opener = request.build_opener(handler)
 # 请求网页
 response = opener.open('https://book.douban.com/')
# 将cookie保存在文件中
filename = 'cookie.txt'#cookie的文件名
cookie = cookiejar.MozillaCookieJar(filename) # 表示使用Mozilla的cookie方式存储和读取
handler = request.HTTPCookieProcessor(cookie)
opener = request.build_opener(handler)
opener.open('https://book.douban.com/')
# 保存文件
cookie.save(ignore_discard=True, ignore_expires=True)

还有一种保存方法,不过也是同样的繁琐

cookie = cookiejar.LWPCookieJar(filename) # 表示 Set-Cookie3 文件格式存储和读取
handler = request.HTTPCookieProcessor(cookie)
opener = request.build_opener(handler)
opener.open('https://book.douban.com/')
# 保存文件
cookie.save(ignore_discard=True, ignore_expires=True)

虽然写法不一样,但是保存的内容是一样的
保存了当然就是需要时候使用,那么cookie文件的使用

from http import cookiejar
# 从cookie文件加载到网页上实现记住登陆
cookie = cookiejar.LWPCookieJar()
# 加载文件
cookie.load(filename, ignore_discard=True, ignore_expires=True)
handler = request.HTTPCookieProcessor(cookie)
opener = request.build_opener(handler)
opener.open('https://book.douban.com/')

处理使用登陆的方式,网站还有一种来检测爬虫的方法,就是封IP,那么服务器凭什么认定,你是爬虫呢?就是检测该IP单位时间内访问的次数,如果超过了一个阈值,那么就认为你是爬虫,就会对你封IP,所以我们有时候需要代理来防止IP被封(关于代理我们以后会详细说)
现在来说一下urlib库使用代理的方法:

import urllib.request

proxy_handler = urllib.request.ProxyHandler({
    'http': 'http://127.0.0.1:9743',
    'https': 'https://127.0.0.1:9743'
})
opener = urllib.request.build_opener(proxy_handler)
response = opener.open('http://book.douban.com/',timeout=1)
print(response.read())

二、urllib.error

该模块是异常处理模块,用于处理异常操作,是为了当程序出现异常时候我们希望的是程序出现提示,而不是程序停止
eg

from urllib import request, error
try:
    proxy_handler = urllib.request.ProxyHandler({
        'http': 'http://127.0.0.1:9743',
        'https': 'https://127.0.0.1:9743'
    })
    opener = urllib.request.build_opener(proxy_handler)
    response=opener.open('https://movie.douban.com/', timeout=1)
except error.HTTPError as e:
    print(e.reason(), e.code(), e.headers())
except error.URLError as e:
    print(e.reason)

捕获异常我们用try.....except,如果程序出现异常,会提示HTTPError /URLError ,从而给出提示,而不是程序停止

三、urllib.parse

urlib解析模块,用于解析URL
urllib.parse.urlparse(url, scheme=”, allow_fragments=True)
eg:

from urllib import request, parse
# 解析url
print(parse.urlparse('https://book.douban.com/'))
print(parse.urlparse('https://book.douban.com/', scheme='http'))
print(parse.urlparse('book.douban.com/', scheme='http'))
# 下面是结果
ParseResult(scheme='https', netloc='book.douban.com', path='/', params='', query='', fragment='')
ParseResult(scheme='https', netloc='book.douban.com', path='/', params='', query='', fragment='')
ParseResult(scheme='http', netloc='', path='book.douban.com/', params='', query='', fragment='')

scheme参数一般会忽略
URL的拼接

from urllib.parse import urlunparse
# 将列表元素拼接成url
data = ['http', 'www.baidu.com', 'index.html', 'user', 'a=6', 'comment']
print(urlunparse(data))
# 下面是结果
http://www.baidu.com/index.html;user?a=6#comment
  • urllib.parse.urljoin():这个是将第二个参数的url缺少的部分用第一个参数的url补齐
from urllib.parse import urljoin
print(urljoin('http://www.baidu.com', 'FAQ.html'))
print(urljoin('http://www.baidu.com', 'https://cuiqingcai.com/FAQ.html'))

结果

http://www.baidu.com/FAQ.html
https://cuiqingcai.com/FAQ.html

  • urllib.parse.urlencode():这个方法是将字典类型的参数转为请求为get方式的字符串(显示的提交数据)
from urllib.parse import urlencode

params = {
    'name': 'germey',
    'age': 22
}
base_url = 'http://www.baidu.com?'
url = base_url + urlencode(params)
print(url)

结果

http://www.baidu.com?name=germey&age=22

四、后记

个人感觉urlib系列的库,不如requests库用着舒服,有些东西写法很繁琐,但是毕竟是底层库,我们还是学习一下,最后惯例,附上url官方文档最新的,希望对你有所帮助!晚安~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容