爬虫常用基本库的初级用法和高级用法示例

学习python不久,但是还是想分享一些自己的想法或者思路,一起成长,下面是我的今日分享,希望大家持续关注,嘻嘻

两个基本库:urllib和requests。一、urllib的使用。

import urllib.request


response = urllib.request.urlopen('https://www.python.org')#获得HTTP response类型对象#print(response.read().decode('utf-8')) #网页源代码print(response.getheader('Server'))#获取响应头信息的Server值

from urllib import parse


url = 'http://httpbin.org/post'

headers = {

'User-Agent': 'Mozilla/4.0(compatible;MSIE 5.5;Windows NT)',

'Host':'httpbin.org'}#请求头,修改user-agent,伪装为浏览器dict = {

'name': 'Germey'}

data = bytes(parse.urlencode(dict),encoding='utf8')#转字流采用bytes方法

req = urllib.request.Request(url=url,data=data,headers=headers,method='POST')#返回Request类型对象

response = urllib.request.urlopen(req)print(response.read().decode('utf-8'))

#需要验证身份的网页from urllib.request import HTTPPasswordMgrWithDefaultRealm,HTTPBasicAuthHandler,build_opener


username = 'username'

password = 'password'

url = 'http://localhost:5000/'


p = HTTPPasswordMgrWithDefaultRealm()

p.add_password(None,url,username,password) #利用add_password添加用户名及密码,建立处理验证的handler

auth_handler = HTTPBasicAuthHandler(p) #实例化HTTPBasicAuthHandler对象

opener = build_opener(auth_handler) #利用上述handler构建opener

try:

    result = opener.open(url) #利用opener发送请求,打开链接

    html = result.read().decode('utf-8')

    print(html)except urllib.error.URLError as a:

print('handler错误原因:'+str(a.reason))  #虚拟例子,肯定不能打开哈,我们在这里返回原因

#使用代理from urllib.request import ProxyHandler


proxy_handler = ProxyHandler({

'http':'http://127.0.0.1:9743',

'https':'https://127.0.0.1:9743'

})   #键名为协议类型,键值为代理链接,可添加多个连接,此代理运行在9743端口上

opener = build_opener(proxy_handler) #构造opener

try:    

    response = opener.open('https:baidu.com') #打开链接

    print(response.read().decode('utf-8'))except urllib.error.URLError as e:

print('代理错误原因:'+str(e.reason))

#cookies的处理import http.cookiejar


cookie = http.cookiejar.CookieJar()                  #声明Cookiejar对象

handler = urllib.request.HTTPCookieProcessor(cookie) #建立handler

opener = urllib.request.build_opener(handler)        #构建opener


response = opener.open('http://www.baidu.com')       #发送请求for item in cookie:

print(item.name+'='+item.value)

#输出为文件格式如下演示:

filename = 'cookie.txt'

cookie = http.cookiejar.MozillaCookieJar(filename)    #Cookiejar的子类,处理cookies和文件相关事务

handler = urllib.request.HTTPCookieProcessor(cookie) #建立handler

opener = urllib.request.build_opener(handler)        #构建opener

response = opener.open('http://www.baidu.com')       #发送请求

cookie.save(ignore_discard=True,ignore_expires=True)#第二种文件格式

filename = 'cookie_LWP.txt'

cookie = http.cookiejar.LWPCookieJar(filename)    #Cookiejar的子类,保存为libwww-perl(LWP)格式

handler = urllib.request.HTTPCookieProcessor(cookie) #建立handler

opener = urllib.request.build_opener(handler)        #构建opener

response = opener.open('http://www.baidu.com')       #发送请求

cookie.save(ignore_discard=True,ignore_expires=True)

#有效读取文件

filename = 'cookie_LWP.txt'

cookie = http.cookiejar.LWPCookieJar()    

cookie.load(filename,ignore_discard=True,ignore_expires=True)

handler = urllib.request.HTTPCookieProcessor(cookie) #建立handler

opener = urllib.request.build_opener(handler)        #构建opener

response = opener.open('http://www.baidu.com')       #发送请求#print(response.read().decode('utf-8'))        #获取百度网页的源代码

#解析链接,实现链接各部分的抽取,合并以及链接转换from urllib.parse import urlparse


result = urlparse('http://www.baidu.com/index.html;user?id=5#comment')print(str('result的类型为:'),end='')print(type(result))print(result)      #6个部分,scheme协议,netloc域名,path访问路径,params参数,query查询条件,fragment锚点,定位页面内部的下拉位置

#urlprase的另一种用法


result = urlparse('www.baidu.com/index.html;user?id=5#comment',scheme = 'https')#注意,scheme参数只有在url中不包含scheme时才生效print(str('result的类型为:'),end='')print(type(result))print(result)

#对立方法urlunparse,接受可迭代对象,但参数长度必须为6from urllib.parse import urlunparse


data = ['https','www.baidu.com','index.html','user','a=6','comment']print(urlunparse(data))

#urlsplit与urlparse类似,但并不解析params部分,将其返回到path部分from urllib.parse import urlsplit


result = urlsplit('https://www.baidu.com/index.html;user?a=6#comment')print(result)#同样,urlsplit也有对立方法urlunsplit方法#urljoin方法,实现链接的更新,补充,双参数from urllib.parse import urljoin

print(urljoin('http://www.baidu.com/about.html','https://pangzixi.com/FAQ.html?question=2'))print(urljoin('http://www.baidu.com/about.html','http://www.baidu.com/about.html?question=2'))

#urlencode构造GET请求参数(序列化),及其反序列化from urllib.parse import urlencode,parse_qs,parse_qsl


params = {

'name':'germey',

'age':22}#首先声明一个字典,将参数表示出来

base_url = 'http://www.baidu.com?'

url =  base_url + urlencode(params) #调用urlencode方法,将其转化为请求参数print(str('序列化:')+str(url))

query = 'name=germey&age=22'print(str('反序列化:')+str(parse_qs(query)))print(str('反序列化(转化为元组列表):')+str(parse_qsl(query))) 

#quote方法,防止中文出现在url中时发生乱码现象from urllib.parse import quote,unquote


keyword = '张三'

url = 'http://www.baidu.com/s?wd=' + quote(keyword) #quote方法对中文进行UTF编码print(url)


url = 'http://www.baidu.com/s?wd=%E5%A3%81%E7%BA%B8' print(unquote(url)) #unquote实现解码


#分析Robots协议,协议规定爬虫或搜索引擎那些页面允许抓取,哪些不可以

'''

一般格式:

User-agent: *  对所有爬虫有效

Disallow: /    不允许爬取所有网页

Allow: /public/可以爬取public目录

'''

from urllib.robotparser import RobotFileParser


rp = RobotFileParser()#创建对象

rp.set_url('http://www.jianshu.com/robots.txt')#设置robots.txt链接

rp.read()#返回可读对象,另一种格式为:rp.parse(urlopen('http://www.jianshu.com/robots.txt').read().decode('utf-8').splite('\n'))print(rp.can_fetch('*','http://www.jianshu,com/p/b67554025d7d'))#查看是否允许抓取True/False

二、requests的使用,相较于urllib库,明显可以感觉requests的功能更强大而且方便。

#requests库能够更加方便的实现cookies以及登录验证,代理设置等import requests


r = requests.get('https://www.baidu.com/') #get方法发送请求print(r.cookies)print(r.status_code) #返回状态码

#GET请求

r = requests.get('http://httpbin.org/get')#print(r.text)

#附加额外信息

data = {

'name':'germey',

'age':32}

r = requests.get('http://httpbin.org/get',params=data)#print(r.text)

#网页的返回类型是str类型,是JSON格式,可直接调用json()方法

#print(r.json())

#抓取二进制数据

r = requests.get('https://www.github.com/favicon.ico')with open('favicon.ico','wb') as fn:

fn.write(r.content)  #保存二进制文件

#添加headers

headers = {

'User-Agent':'Mozilla/5.0(Macintosh;Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'}

r = requests.get('https://www.zhihu.com/explore',headers=headers)#print(r.text)

#POST请求

r = requests.post('http://httpbin.org/post',data=data)#print(r.text)

#requests内置状态码查询对象if r.status_code!=requests.codes.ok:

exit()else:

print('Request Successfully')

#requests库的高级用法:文件上传,Cookies设置,代理设置#文件上传,以上传图片为例

files = {'file':open('favicon.ico','rb')}#保证py文件和ico文件在同一目录下,否则请填写绝对路径

r = requests.post('http://httpbin.org/post',files=files) #print(r.text)

#Cookies设置

r = requests.get('https://www.baidu.com')for key,value in r.cookies.items():

print(key + '=' + value)

#会话维持Session

s = requests.Session()

s.get('http://httpbin.org/cookies/set/number/123456')  #设置cookie的名称number,内容123456

r = s.get('http://httpbin.org/cookies') #获取该网页的cookiesprint(r.text)

#SSL证书验证from requests.packages import urllib3


urllib3.disable_warnings()#屏蔽指定证书的警告信息

response = requests.get('https://www.12306.cn',verify=False)#verify=False避免SSLError错误信息print(response.status_code)

#代理设置,针对大规模爬取可能出现的封IP现象#用到proxies参数


proxies = {

'http':'http://10.10.1.10:3128',

'https':'https://10.10.1.10:1080'}#一个例子,这是一个无效的代理


requests.get('https://www.taobao.com',proxies=proxies)

#超时设置timeout

r = requests('https://www.taobao.com',timeout=1)#1秒内无响应,就抛出异常#永久等待,可将timeout设置为None,或者不加timeout参数

#身份认证,遇到认证页面的操作

r = requests.get('http://lpcalhost:5000',auth=('username','password'))#username和password为举例说明,请输入你的真实信息以登录#或者采取OAuth1认证的方法,比较难受from requests_oauthlib import OAuth1


url = 'https://api.twitter.com/...'

auth = OAuth1('yourappkey','yourappsecret','useroauthtoken','useroauthtokensecret')

requests.get(url,auth)

#Prepared Request数据结构from requests import Request,Session


url = 'http://httpbin.org/post'

data = {'name':'germey'}

headers = {

'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36'}#此处复制百度页面的代理即可

s = Session()

request = Request('POST',url,data=data,headers=headers)

prepped = s.prepare_request(request)#封装Prepared Request对象

r = s.send(prepped) 

pint(r.text) 

版本为3.9.0。初入爬虫领域,欢迎交流评论。本人都是通过代码课堂学习的,大家可以一起来哦

http://www.daimaketang.com/course/explore/01A?subCategory=001A&orderBy=recommendedSeq,也希望大家多多提提意见呀。

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

推荐阅读更多精彩内容