分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 教程案例

爬虫基础框架 之urllib(一) --- urllib post请求

发布时间:2023-11-01 15:52责任编辑:郭大石关键词:url爬虫

反爬问题

1. 反爬 [用户代理]

web开发中,同一个url往往可以对应若干套不同的数据(或者界面,如手机、电脑),后台可以根据发起请求的前端的用户代理的不同,而决定应该给前端做出什么样的响应

如果检测到没有用户代理可以拒绝访问

解决方案:伪装请求头

2. 解决

创建 Request 对象req = request.Request(url=url, headers={用户代理})

1 req = request.Request(url=url,headers={‘UserAgent‘:‘Mozilla/5.0 (Windows NT 10.0; Win64;x64)AppleWebKit/537.36 (KHTML, like Gecko)Chrome/71.0.3578.80Safari/537.36‘,‘cookie‘:‘_T_WM=e75d066bb30fae02106ed2a058e3ba08;SUB=_2A25xuVTDeRhGeBN7FIR9izJyTSIHXVTQmHbrDV6PUJbktANLVjZkW1NRFYvPzVjmAtKAY7Kppc7xOninRZqgesm;SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9W59rVpGeZ7yg7I7HR0hyYPg5JpX5KzhUgL.Foq0S057Sozfeon2dJLoI05LxKML1heLBBLxKqL1heL1hLxKML12L1hBLxKqLBoeLBKzLxKqLBoeLBKz41K.t;SUHB=04WeHU67Q84JrJ‘})2 用Request对象可以给请求加上请求头,使得请求伪装成浏览器等终端

用加入了请求头的请求对象发起请求

1 res = request.urlopen(req)2 print(res.status) 3 # 打印状态码

写入本地

1 with open("wei.html","wb") as fp:2  fp.write(res.read()) ???

post请求

  • post请求的请求体和get请求格式一样(参数1=值1&参数2=值2&...)
1 from urllib import request,parse2 url = ‘https://fanyi.baidu.com/sug‘

1. 请求头

1 headers = {‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36‘}

2. 请求体

1 data = {"kw":"a"}2 data = parse.urlencode(data).encode("utf-8")3 post提交的数据是二进制,需要用utf-8编码4 5 print(data)

3. 用前面的请求头、请求体和url来创建请求对象

req = request.Request(url=url,headers=headers,data=data)

4. 发起请求

1 res = request.urlopen(req)2 print(res.read())

 会话处理

  • 「注意」采用Request+urlopen的机制无法处理会话信息,如果爬虫中带会话处理,需要借助于handler+opener
  • 「采用handler+opener机制处理会话问题」导入cookie初始化工具,处理cookie的时候这个对象就可以存储cookie信息
1 from urllib import request,parse2 from http import cookiejar
1 cookie = cookiejar.CookieJar() ??          ?# 初始化一个cookie对象2 handler = request.HTTPCookieProcessor(cookie) ????# 创建一个handler对象,携带上cookie3 opener = request.build_opener(handler) ???     # 创建一个opener对象携带上handler 
  • 1. 请求头
1 headers = {‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36‘}
  • 2. 登录接口
1 login_url = ‘http://www.jokeji.cn/user/c.asp?‘
  • 3. 处理登录接口
1 dic = {‘u‘:‘bobo666‘,‘p‘:‘a12345678‘,‘sn‘:‘1‘,‘t‘:‘big‘}2 params = parse.urlencode(dic)3 login_url += params
  • 4. 创建一个登录请求对象
1 login_req = request.Request(url=login_url,headers=headers)
  • 5. 发起请求以登录
    res = request.urlopen(login_req)
1 res = opener.open(login_req) ???????# ?用opener来发起请求2 print(res.read().decode(‘utf-8‘)) ??# ?此时发起的请求结束以后,相关的cookie信息就会被opener的handler通过cookiejar对象保存
  • 个人主页url
1 page_url = "http://www.jokeji.cn/User/MemberCenter.asp"2 3 page_req = request.Request(url=page_url,headers=headers)

#res = request.urlopen(page_req) # 虽然前面已经登录成功,但是cookie信息没有被保存,仍然不成功

 实例

 1 import ssl 2 ssl._create_default_https_context = ssl._create_unverified_context 3 ?4 from urllib import request,parse 5 from time import sleep 6 import re 7 ?8 # 1、【数据的获取】 9 # 封装一个函数,用于将url转化成一个请求对象10 def request_by(url,page):11 ????headers = {12 ????????‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36‘}13 ????if page==1:14 ????????page_url = url + ".html"15 ????else:16 ????????page_url = url +"_"+ str(page) + ".html"17 ????print("正在访问:",page_url)18 ????req = request.Request(url=page_url,headers=headers)19 ????return ?req20 ????21 # 封装一个函数,用于对请求对象发起请求并且把响应体返回出去22 def get_html_from(req):23 ????res = request.urlopen(req)24 ????# 每请求一次要休眠一段时间25 ????sleep(1)26 ????return res.read().decode("utf-8")27 28 # 2、【数据的解析】29 def anylasis_data(html):30 ????pat = re.compile(r‘<div class="box picblock.*?<img src2="(.*?)"‘,re.S)31 ????imgs = pat.findall(html)32 ????return imgs33 34 # 3、数据的存储35 def download_imgs(imgs):36 ????for img in imgs:37 ????????# http://pic1.sc.chinaz.com/Files/pic/38 ????????# pic9/201904/zzpic17564_s.jpg39 ????????# 生成图片的名字40 ????????img_name = img.split("/")[-1]41 ????????print("正在下载图片:",img)42 ????????request.urlretrieve(url=img,filename="./meinv/"+img_name)43 ????????sleep(1)44 45 if __name__ == ‘__main__‘:46 ????page_url = "http://sc.chinaz.com/tupian/meinvxiezhen"47 48 ????for i in range(1,2):49 ????????req = request_by(url=page_url,page=i)50 ????????res = get_html_from(req)51 ????????imgs = anylasis_data(res)52 ????????download_imgs(imgs)

爬虫基础框架 之urllib(一) --- urllib post请求

原文地址:https://www.cnblogs.com/TMMM/p/10800047.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved