您的位置:首页 > 编程语言 > Python开发

路飞学城Python-Day142

2018-11-07 20:37 302 查看
第2节:UA身份伪装 反爬机制 User-Agent:请求载体的身份标识 通过不同的手段的当前的请求载体是不一样的,请求信息也是不一样的,常见的请求信息都是以键和值的形式存在 浏览器的开发者工具 NetWork-抓包工具 ResponseHeaders-响应头信息 RequestHeaders-请求头信息 User-Agent(UA):请求载体标识 网站会检查请求的UA,如果发现请求的UA是爬虫程序,则拒绝提供网站数据 反反爬机制:伪装爬虫程序的请求的UA import urllib.request url = 'http://www.baidu.com/' # UA伪装 # 1.自制定一个请求对象 headers = { #     存储任意的请求头信息 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '                   'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36', } # 该请求对象进行了成功的伪装 req = urllib.request.Request(url=url, headers=headers) # 2.针对自制定的请求对象发起请求 res = urllib.request.urlopen(req) print(res.read())   第2节:post请求 爬取百度翻译的结果 network里的xhr就是全部是基于ajax的请求 import urllib.request import urllib.parse # 1.制定url url = 'https://fanyi.baidu.com/sug' # post请求所携带的参数处理流程 # 1.将请求参数封装到字典中 data = {     'kw': '西瓜', } # 2.使用parse中的url encode进行编码处理 data = urllib.parse.urlencode(data)   # 3.将步骤2的编码结果转换为byte类型 data = data.encode()   # 2.发起post请求 # urlopen中的data表示的就是经过处理之后的post的请求参数 req = urllib.request.urlopen(url=url, data=data) # print(req.read()) with open('./百度翻译.txt', 'wb') as fp:     fp.write(req.read()) urllib的高级操作简介 三.urllib模块的高级操作     1.代理       - 什么是代理:代理就是第三方代替本体处理相关事务。例如:生活中的代理:代购,中介,微商......   - 爬虫中为什么需要使用代理?      一些网站会有相应的反爬虫措施,例如很多网站会检测某一段时间某个IP的访问次数,如果访问频率太快以至于看起来不像正常访客,它可能就会会禁止这个IP的访问。所以我们需要设置一些代理IP,每隔一段时间换一个代理IP,就算IP被禁止,依然可以换个IP继续爬取。    - 代理的分类:     正向代理:代理客户端获取数据。正向代理是为了保护客户端防止被追究责任。     反向代理:代理服务器提供数据。反向代理是为了保护服务器或负责负载均衡。 import urllib.request import urllib.parse   #1.创建处理器对象,在其内部封装代理ip和端口 handler=urllib.request.ProxyHandler(proxies={'http':'95.172.58.224:52608'}) #2.创建opener对象,然后使用该对象发起一个请求 opener=urllib.request.build_opener(handler)   url='http://www.baidu.com/s?ie=UTF-8&wd=ip'   headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36', }   request = urllib.request.Request(url, headers=headers)   #使用opener对象发起请求,该请求对应的ip即为我们设置的代理ip response = opener.open(request)   with open('./daili.html','wb') as fp: fp.write(response.read())     2.cookie          引言:有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个人主页数据)时,如果使用之前requests模块常规操作时,往往达不到我们想要的目的,例如: import urllib.request import urllib.parse #指定url url = 'http://www.renren.com/289676607/profile' #自定义请求头信息 headers={ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } #自定义请求对象 request = urllib.request.Request(url=url,headers=headers) #发起请求 response = urllib.request.urlopen(request)   with open('./renren.html','w') as fp: fp.write(response.read().decode()) 【注意】上述代码中,我们爬取到的是登录首页面,而不是张三的个人主页也面。why?首先我们来回顾下cookie的相关概念及作用         - cookie概念:当用户通过浏览器首次访问一个域名时,访问的web服务器会给客户端发送数据,以保持web服务器与客户端之间的状态保持,这些数据就是cookie。         - cookie作用:我们在浏览器中,经常涉及到数据的交换,比如你登录邮箱,登录一个页面。我们经常会在此时设置30天内记住我,或者自动登录选项。那么它们是怎么记录信息的呢,答案就是今天的主角cookie了,Cookie是由HTTP服务器设置的,保存在浏览器中,但HTTP协议是一种无状态协议,在数据交换完毕后,服务器端和客户端的链接就会关闭,每次交换数据都需要建立新的链接。就像我们去超市买东西,没有积分卡的情况下,我们买完东西之后,超市没有我们的任何消费信息,但我们办了积分卡之后,超市就有了我们的消费信息。cookie就像是积分卡,可以保存积分,商品就是我们的信息,超市的系统就像服务器后台,http协议就是交易的过程。          - 经过cookie的相关介绍,其实你已经知道了为什么上述案例中爬取到的不是张三个人信息页,而是登录页面。那应该如何抓取到张三的个人信息页呢?   思路:     1.我们需要使用爬虫程序对人人网的登录时的请求进行一次抓取,获取请求中的cookie数据     2.在使用个人信息页的url进行请求时,该请求需要携带 1 中的cookie,只有携带了cookie后,服务器才可识别这次请求的用户信息,方可响应回指定的用户信息页数据 cookiejar对象: - 作用:自动保存请求中的cookie数据信息 - 注意:必须和handler和opener一起使用 cookiejar使用流程: - 创建一个cookiejar对象 import http.cookiejar cj = http.cookiejar.CookieJar() - 通过cookiejar创建一个handler handler = urllib.request.HTTPCookieProcessor(cj) - 根据handler创建一个opener opener = urllib.request.build_opener(handler) - 使用opener.open方法去发送请求,且将响应中的cookie存储到openner对象中,后续的请求如果使用openner发起,则请求中就会携带了cookie 使用cookiejar实现爬取人人网个人主页页面数据: #使用cookiejar实现人人网的登陆 import urllib.request import urllib.parse import http.cookiejar cj = http.cookiejar.CookieJar() #请求中的cookie会自动存储到cj对象中 #创建处理器对象(携带cookiejar对象的) handler=urllib.request.HTTPCookieProcessor(cj) #创建opener对象 (携带cookiejar对象) opener=urllib.request.build_opener(handler)   #要让cookiejar获取请求中的cookie数据值 url='http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=201873958471' #自定义一个请求对象,让该对象作为opener的open函数中的参数 data={ "email":"www.zhangbowudi@qq.com", "icode":"", "origURL":"http://www.renren.com/home", "domain":"renren.com", "key_id":"1", "captcha_type":"web_login", "password":"40dc65b82edd06d064b54a0fc6d202d8a58c4cb3d2942062f0f7dd128511fb9b", "rkey":"41b44b0d062d3ca23119bc8b58983104", 'f':"https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DpPKf2680yRLbbZMVdntJpyPGwrSk2BtpKlEaAuKFTsW%26wd%3D%26eqid%3Deee20f380002988c000000025b7cbb80" } data=urllib.parse.urlencode(data).encode() request=urllib.request.Request(url,data=data) opener.open(request)   #获取当前用户的二级子页面 s_url='http://www.renren.com/289676607/profile' #该次请求中就携带了cookie resonse=opener.open(s_url)   with open('./renren.html','wb') as fp: fp.write(resonse.read())   request简介 1.什么是request模块 request是python原生的一个基于网络请求的模块,模拟浏览器发起请求 request模块功能更强大,开发效率高,掌握了request模块就是掌握了网络爬虫的半壁江山! 2.为什么要用request模块 urllib中有一些不便于操作的地方,使用urllib必须手动处理url的编码方式,比如quate()手动编码,有的url有很多组参数的,每一组都需要进行编码会很不方便 urllib还需要手动处理post请求的参数,url.encode()对字典进行处理,之后还要进行doceode操作 urllib处理cookie和代理的时候比较繁琐     -创建一个cookie对象,
    -创建一个handler对象
    -创建一个opener对象,通过opener发起请求,这时才会携带cookie
处理代理操作的流程     -创建一个handler对象,见代理ip和端口封装到该对象中
    -基于handler对象再去创建opener对象,
request模块会自动处理编码问题,简化了更多的cookie和代理的操作 3.request如何被使用 -安装request模块 -1.指定url -2.使用request模块发起请求 -3.获取响应数据 -4.进行持久化存储 4.通过5个基于request模块的爬虫项目对该模块进行系统学习和巩固 -1.request发起get请求 -2.request发起post请求 -3.request发起ajax请求 -4.request发起ajax的post请求 -5.综合项目,所有基础知识点练习 requsts-get请求1     # 爬取搜狗首页的数据 import requests # 1.指定url url = 'https://www.sogou.com/' # 2.发起get请求 res = requests.get(url=url) # 3.获取响应中的数据值 # text获取相应页面中的字符串形式 page_data = res.text # print(page_data) # 4.持久化操作 with open('./sougou.html', 'w', encoding='utf-8') as fp:     fp.write(page_data) requests(response常用属性)   # 爬取搜狗首页的数据 import requests # 1.指定url url = 'https://www.sogou.com/' # 2.发起get请求 res = requests.get(url=url) # 3.获取响应中的数据值 # content获取的是response对象中的byte类型的页面数据 # print(res.content) # status_code表示网页的响应状态码,返回响应状态码,查属性的结果,响应成功或失败 # print(res.status_code) # 获取响应头信息(字典的形式) # print(res.headers) # 获取的是响应对象中的url,获取请求的url,返回的是请求中指定的url # print(res.url) requests模块带参get请求方式1 # 获取搜狗搜索结果对应页面数据 import requests url = 'https://www.sogou.com/web?query=周杰伦&ie=utf-8'   res = requests.get(url=url)   # print(res.text)   with open('./Jay.html', 'w', encoding='utf-8') as fp:     fp.write(res.text)       requests模块带参get请求方式2 # 获取搜狗搜索结果对应页面数据 import requests   url = 'https://www.sogou.com/web' # 将参数封装到字典中 params = {     'query': '周杰伦',     'ie': 'utf-8', } res = requests.get(url=url, params=params)   # print(res.text)   with open('./Jay2.html', 'w', encoding='utf-8') as fp:     fp.write(res.text) requests模块get请求自定义请求头信息             import requests # 自定义请求头信息 headers = {         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '                   'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36', }     url = 'https://www.sogou.com/web' # 将参数封装到字典中 params = {     'query': '周杰伦',     'ie': 'utf-8', } res = requests.get(url=url, params=params, headers=headers)   # print(res.text)   with open('./Jay3.html', 'w', encoding='utf-8') as fp:     fp.write(res.text)   request模块的post请求     # 登录豆瓣网,获取登陆成功后的页面数据 import requests # 指定url url = 'https://accounts.douban.com/login' # 封装post请求的参数 data = { 'source': 'movie', 'redir': 'https://movie.douban.com/', 'form_email': 'a873245193@sina.com', 'form_password': 'dota2009', 'login': '登录' } headers = { #     存储任意的请求头信息 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '                   'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36', } # 发起post请求 req = requests.post(url=url, data=data, headers=headers) # 3.获取响应对象中的页面数据 page_text = req.text # 4.持久化操作 with open('./douban.html', 'w', encoding='utf-8') as fp:     fp.write(page_text)     requests模块ajax的get请求     import requests   url = 'https://movie.douban.com/j/chart/top_list?' # 封装ajax中get请求携带的参数 params = {     'type': '13',     'interval_id': '100:90',     'action': '',     'start': '0',     'limit': '2000', } headers = {     #     存储任意的请求头信息     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '                   'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36', } req = requests.get(url=url, params=params, headers=headers) print(req.text)     requests模块处理ajax的post请求   # 爬取肯德基餐厅的位置数据 import requests   # 1.指定url post_url = r'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword' # 2.处理post请求的参数 data = {     'cname': '',     'pid': '',     'keyword': '江苏',     'pageIndex': '1',     'pageSize': '10', } headers = {     #     存储任意的请求头信息     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '                   'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36', } req = requests.post(url=post_url, data=data, headers=headers) print(req.text)   request模块综合练习     import requests # 爬取搜狗、知乎某一个词条对应的一定范围表示的页面数据 # 获取前3页页面数据 # 1.指定url url = 'https://zhihu.sogou.com/zhihu' params = {     'query': '人工智能',     'page':'6',     'ie':'utf8', } headers = {     #     存储任意的请求头信息     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '                   'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36', } req = requests.get(url=url, params=params, headers=headers) # print(req.text) with open('./人工智能.html', 'w', encoding='utf-8') as fp:     fp.write(req.text)   request模块的cookie操作   # cookie # 基于用户的数据 # 爬取豆瓣网的个人主页页面数据 # cookie作用,服务端使用cookie来记录客户端的状态信息 # 1.执行登录操作 # 2.发起个人请求主页请求时,需要将cookie携带到该请求中 # session也可以使用来发起请求,该cookie对象会自动存储在session中 import requests   session = requests.session() login_url = 'https://www.douban.com/accounts/login' data = {     'source': 'movie',     'redir': 'https://movie.douban.com/',     'form_email': 'a873245193@sina.com',     'form_password': 'dota2009',     'login': '登录', } headers = {     #     存储任意的请求头信息     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '                   'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36', } res = session.post(url=login_url, data=data, headers=headers) print(res.text) with open('./dou.html', 'w', encoding='utf-8') as fp:     fp.write(res.text)       requests模块的代理操作     # -代理操作,使用第三方代替本体去操作事务 # -为什么要使用代理? # 反爬操作有关联 # 设置代理ip防止门户网站封禁ip,使用代理是一种反反爬的手段 # 代理分类 # -正向代理 代替客户端获取数据 # -反向代理 代替服务器端提供数据 # 4.免费代理ip的网站提供商 # -www.goubanjia.com # -快代理 # -西祠代理  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: