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

反爬问题

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,parse
2 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,parse
2 from http import cookiejar
1 cookie = cookiejar.CookieJar()              # 初始化一个cookie对象
2 handler = request.HTTPCookieProcessor(cookie)     # 创建一个handler对象,携带上cookie
3 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  req
20
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 imgs
33
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.jpg
39         # 生成图片的名字
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)

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

时间: 2024-10-11 19:34:29

爬虫基础框架 之urllib(一) --- urllib post请求的相关文章

Python 开发简单爬虫 - 基础框架

1. 目标:开发轻量级爬虫(不包括需登陆的 和 Javascript异步加载的) 不需要登陆的静态网页抓取 2. 内容: 2.1 爬虫简介 2.2 简单爬虫架构 2.3 URL管理器 2.4 网页下载器(urllib2) 2.5 网页解析器(BeautifulSoup) 2.6 完整实例:爬取百度百科Python词条相关的1000个页面数据 3. 爬虫简介:一段自动抓取互联网信息的程序 爬虫价值:互联网数据,为我所用. 4. 简单爬虫架构: 运行流程: 5. URL管理器:管理待抓取URL集合

python爬虫---scrapy框架爬取图片,scrapy手动发送请求,发送post请求,提升爬取效率,请求传参(meta),五大核心组件,中间件

# settings 配置 UA USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36' 一丶scrapy的图片数据爬取(流数据的爬取) ? scrapy中封装好了一个管道类(ImagesPipeline),基于该管道类可以实现图片资源的请求和持久化存储 编码流程: 爬虫文件中解析出图片的地址 将

爬虫基础1 怎么使用浏览器查看网络请求

推荐使用火狐和谷歌浏览器,一般两个对照着看. 下面是两个浏览器对同一个网址的页面进行检查的,对比,火狐直接是中文显示,谷歌则是英文显示. 如下页面是火狐的 如下是谷歌浏览器的 下面是这些字段的介绍: 1.Name:请求的名称,一般是会将URL的最后一部分内容当做名称 2.Satus:响应的状态码,200代表响应成功. 3.Type:请求的文档类型,这里是document,代表请求的是一个html文档,内容就是一些HTML代码. 4.Initiator:请求源,用来标记请求是由那个对象或进程发起的

爬虫基础之urllib库

categories: 爬虫 tags: urlopen urlretrieve urlencode parse_qs urlparse urlsplit urllib库 urllib库是Python中一个最基本的网络请求库.可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据 urlopen函数 在Python3的urllib库中,所有和网络请求相关的方法,都被集到 urllib.request 模块下面了,先来看下urlopen的基本使用 from urllib im

爬虫基础(1):urllib库

urllib库 urllib库是python中的一个基本网络请求库.用于模拟浏览器的行为,向指定服务器发送请求,并接收返回的数据. 在python3中所有的网络请求相关函数都集中在urllib.request模块下面 urlopen函数 向服务器发起请求 urlopen函数的参数 url 目标地址 data 如果有这个参数,将变为post请求 返回值 http.client.HTTPResponse对象,其中含有下面几个方法: read(size) size为空则读取所有 readline()

python基础爬虫的框架和运行流程

网络爬虫是什么? 网络爬虫就是:请求网站并提取数据的自动化程序 网络爬虫能做什么? 网络爬虫被广泛用于互联网搜索引擎或其他类似网站,可以自动采集所有其能够访问到的页面内容,以获取或更新这些网站的内容和检索方式. 网络爬虫还被用于爬取各个网站的数据,进行分析.预测近几年来,大量的企业和个人开始使用网络爬虫采集互联网的公开数据,进行数据分析,进一步达到商业目的. 利用网络爬虫能从网上爬取什么数据? 可以好不吹嘘的说,平时从浏览器浏览的所有数据都能被爬取下来. 网络爬虫是否合法? 上面说到了爬虫可以爬

Python网络爬虫基础知识学习

对Python有一些简单了解的朋友都知识Python编程语言有个很强大的功能,那就是Python网络爬虫(http://www.maiziedu.com/course/python/645-9570/),一提到Python,就会想到相关的Python爬虫和scrapy等等,今天就来简单认识学习Python爬虫的基础知识,有了一定的相关爬虫知识,以后学习scrapy.urllib等等知识时,会相对轻松些. 爬虫: 网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组

python爬虫-基础入门-爬取整个网站《3》

python爬虫-基础入门-爬取整个网站<3> 描述: 前两章粗略的讲述了python2.python3爬取整个网站,这章节简单的记录一下python2.python3的区别 python2.x 使用类库: >> urllib 库 >> urllib2 库 python3.x 使用的类库: >> urllib 库 变化: -> 在python2.x中使用import urllib2 ----- 对应的,在python3.x 中会使用import url

爬虫基础以及一个简单的实例

最近在看爬虫方面的知识,看到崔庆才所著的<Python3网络爬虫开发实战>一书讲的比较系统,果断入手学习.下面根据书中的内容,简单总结一下爬虫的基础知识,并且实际练习一下.详细内容请见:https://cuiqingcai.com/5465.html(作者已把书的前几章内容对外公开). 在写爬虫程序之前需要了解的一些知识: 爬虫基础:我们平时访问网页就是对服务器发送请求(Request),然后得到响应(Response)的一个过程.爬虫通过模仿浏览器,对网页进行自动访问.需要知道请求包含哪些内