1、post请求 举例,百度翻译
【注】表单的处理
form_data = urllib.parse.urlencode(form_data).encode()
import urllib.request
import urllib.parse
post_url = 'http://fanyi.baidu.com/sug/'
word = input('输入要查的词')
form_data = {'kw':word,}#构造表单数据
#构造请求头
headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11'}
request = urllib.request.Request(url=post_url,headers=headers)#构造请
求对象
form_data = urllib.parse.urlencode(form_data).encode()#处理请求对象
response = urllib.request.urlopen(request,data=form_data)#发送请求
print(response.read().decode())
报error1了
在线解析json的网页www.json.cn
案例 /vtransapi的实现 :若请求有问题,则把所有头信息除Accept-Encoding和Content-Length的都贴过来
百度翻译一个单词对应一个sign、token,是加密措施 签名、请求令牌 简书,破解百度翻译
2、ajax
整个页面不刷新局部刷新
get
豆瓣 通过fiddler抓包,看raw中get的借口地址,分析参数 start、limit data={'start':(page-1)*number , 'limit':number,}
KFC 餐厅查询 抓接口,看请求类型post,formdata={'cname':'北京','pid':'','pageIndex':'3','pageSize':'10',}同百度翻译案例
post
3、复杂get
百度贴吧 需求:输入吧名,输入起始页码,结束页码,在当前文件夹中创建一个以吧名为名字的文件夹,里面是每一页的html内容,文件名是吧名_page.html
4、URLError\HTTPError
NameError 变量名没定义
TypeError
FileNotFoundError
在urllib.error中 URLError:a.没有网 b.服务器连接失败 c.找不到指定服务器
HTTPError是URLError子类可能是URL拼写错误
5、Handler处理器、自定义Opener
urlopen()给一个url,发送请求,获取响应
Request()定制请求头,创建请求对象
基本用法 :
import urllib.request.parse
url = '...'
headers = '...'
#创建一个Handler
handler = urllib.request.HTTPHeadler()
#通过Handler创建一个Opener对象,用该对象的方法发送请求
opener = urllib.request.build_opener(handler)
#构建请求对象
request = urllib.request.Request(url,headers = headers)
#发送请求
response = opener.open(request)
print(response)
高级功能:使用代理、cookie
6、代理
代理包括正向代理、反向代理
正向代理:替客户端向服务器发请求,防封IP
反向代理:代理服务器向客户端发响应
透明代理:服务器知道你用了代理,知道你的真实IP
匿名代理: ,不知道
高匿名代理:不知道 ,不知道
浏览器配置代理:右上方三点-》设置-》高级-》打开代理设置-》局域网设置-》代理服务器,填入地址、端口
常用代理商:好代理(付费)、快代理、西刺代理
花刺代理软件 ProxyThorn检测从西刺上爬的免费代理可不可用:
导入-》选中txt文件-》验证全部-》清理-》选中单个-》设为IE代理
代码配置:(使用代理查自己ip段)
import urllib.request
import urllib.parse
handler = urllib.request.ProxyHandler({'http':'113.79.75.104:9797'})#创建handle
opener = urllib.request.build_opener(handler)#创建opener
url = 'https://www.baidu.com/s?ie=UTF-8&wd=ip'
headers = {'User-Agent':' Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
'X-Requested-With':' XMLHttpRequest',}
request = urllib.request.Request(url,headers = headers)
response = opener.open(request)#都使用open方法来代理请求
with open('ip.html','wb') as fp:
fp.write(response.read())
cookie(只能用来登录一些小网站)
http协议具有无状态特性,几次连接之间没有联系,网站登录时cookie用来记录用户身份,相当于服务器给客户端发了令牌。
案例:cookie模拟登录人人网用户主页面。fiilder抓包不要抓点击登录按钮时服务器给的响应(要素过多不好分析),抓登录成功后点击个人主页时给的响应。看<>请求中的raw中的cookie,放在headers中,headers={'User-Agent':'...','cookie':'...',}
import urllib.request
import urllib.parse
url = 'http://www.renren.com/*****/profile'
headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36','cookie':'anonymid=js2kxt52ghq6fg; depovince=ZGQT; _r01_=1; JSESSIONID=abcsmoIPIA3064jYMSKJw; ick_login=7bc46d28-0804-4c79-94ab-90213073fdfc; t=d106ee39f8d3f41215d2c94c44c52c543; societyguester=d106ee39f8d3f41215d2c94c44c52c543; id=969722393; xnsid=1b4d5807; jebecookies=660d83ed-5cd4-4a91-be9c-d6151497b462|||||; ver=7.0; loginfrom=null; springskin=set; jebe_key=5ae33b0f-ef4c-41a2-b692-255e81bda7c1%7C621eb58cb0e4ffeefd3604d973abf128%7C1550025141726%7C1%7C1550025141806; vip=1; wp_fold=0',}
request = urllib.request.Request(url , headers = headers)
response = urllib.request.urlopen(request)
with open('人人主页.html','wb') as fp:
fp.write(response.read())