首页
旅行足迹
友链
留言
关于
壁纸
Search
1
小米12Pro为例,新版小米手机安装magisk获取root教程
2,738 阅读
2
在html中通过vue3-sfc-loader引用.vue文件
1,906 阅读
3
vscode+docker开启Xdebug3功能调试PHP
1,841 阅读
4
目前贼拉好用的ChatGPT应用
1,500 阅读
5
Windows系统删除资源管理器侧边的3D对象等
1,455 阅读
玩机教程
软件设计师
前端
Vue
JavaScript
后端
Python
java
Search
标签搜索
python
flask
Django
爬虫
软件设计师
数据结构
Scrapy
玩机教程
PHP
LNMP
Ubuntu
Hexo
算法
ROOT
刷机
前端
JavaScript
webhook
自动化部署
binscor
累计撰写
43
篇文章
累计收到
4
条评论
首页
栏目
玩机教程
软件设计师
前端
Vue
JavaScript
后端
Python
java
页面
旅行足迹
友链
留言
关于
壁纸
搜索到
26
篇与
的结果
2019-07-31
6.request请求的简单使用
概述:requests框架基于urllib封装的一个请求框架,、几乎包含urllib所有的请求功能,在其基础上进行了深度的拓展安装requestspip install requestsrequests的响应类res = requests.get(url) #res即为resquests的响应类属性说明encodingrequests从响应的header自动猜测出响应页面编码方式,该值默认为ISO-8859-1apparent_encodingrequests从响应页面猜测响应页面编码方式url响应的urlstatus_code响应的http状态码cookies响应的cookieselapsed发送请求到收到响应消耗的时间headers响应的headershistory请求历史headers响应的headerscontent页面源码,二进制的页面源码text也是页面源码,unicode,requests自动解码,返回str源码请求方法:requests.get(url, params=None, **kwargs) params={'':''}requests.post(url, data=None, json=None, **kwargs) data = {'':''}requests.head(url, **kwargs)requests.put(url, data=None, **kwargs)requests.patch(url, data=None, **kwargs)requests.delete(url, **kwargs)requests.request(method, url, **kwargs)以上就是requests全部的访问方法,并且全部都返回Request对象请求参数**kwargs参数说明params自动构建url,get请求时使用data提交表单,post请求时使用headers请求headerscookies请求cookiestimeout超时时间proxiesip代理json发送jsonfile发送文件(Multipart-Encoded)allow_redirectsauthverifystreamcert实例1:import requests # requests本身就是一个请求对象 res = requests.get("http://www.baidu.com/") print(res) #<Response [200]> url = "https://www.baidu.com/s?" # 加请求头 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'} # 创建参数 data = { "wd":"日本美女" } # 用requests对象发起请求 res = requests.get(url=url,headers=headers,params=data) # res是响应对象,包含响应头和响应体 # print(res.text) # 用字符串的格式提取出响应体 print(res.content) print(res.headers) # requests也不能解析js实例2:古诗文登录import requests from lxml import etree # 登录 # post请求 账户密码 两个token值 验证码 # 用登录页把验证码和token值获取出来 login_url = "https://so.gushiwen.org/user/login.aspx?from=http://so.gushiwen.org/user/collect.aspx?type=m" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36', 'Referer': 'https://so.gushiwen.org/user/login.aspx?from=http://so.gushiwen.org/user/collect.aspx?type=m' } # 访问登录页 # login_html = requests.get(url=login_url,headers=headers) # requests无法保存cookie s = requests.Session() # requests框架中会话信息用Session对象来保存 login_html = s.get(url=login_url,headers=headers) # 解析出来验证码和token html_tree = etree.HTML(login_html.text) # 提取两个token值 a = html_tree.xpath("//input[@id='__VIEWSTATE']/@value")[0] b = html_tree.xpath("//input[@id='__VIEWSTATEGENERATOR']/@value")[0] print(a,b) # 提取验证码 img_url = "https://so.gushiwen.org" + html_tree.xpath("//img[@id='imgCode']/@src")[0] img = s.get(img_url) with open("./yanzhengma.png","wb") as fp: fp.write(img.content) # 验证码处理、人工智能识别、人工手动输入 code = input("请输入验证码:") print(code) # 登录 post_url = "https://so.gushiwen.org/user/login.aspx?from=http%3a%2f%2fso.gushiwen.org%2fuser%2fcollect.aspx%3ftype%3dm " data = { '__VIEWSTATE': a, '__VIEWSTATEGENERATOR':b, 'from':'http://so.gushiwen.org/user/collect.aspx?type=m', 'email':'fanjianbo666@163.com', 'pwd':'123456', 'code': code, 'denglu':'登录' } res = s.post(url=post_url,headers=headers,data=data) print(res.text)实例3:ChinaUnix登录import requests from bs4 import BeautifulSoup # 设置代理服务器列表 proxies = {"https":"122.4.29.15:27074"} s = requests.Session() login_page = "http://bbs.chinaunix.net/member.php?mod=logging&action=login&logsubmit=yes" # 加请求头 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'} # 反爬:用户名和密码 设置隐藏域 post接口中某些参数是动态生成 # 请求登录页 # r = s.get(url=login_page,headers=headers,proxies=proxies) r = s.get(url=login_page,headers=headers) soup = BeautifulSoup(r.text,'lxml') # 动态post接口 login_params = soup.select("form.cl")[0].attrs.get("action") print(login_params) # 解决formhash的动态生成 formhash = soup.select("[name=formhash]")[0].attrs.get("value") print(formhash) # 构造请求体 data = { 'formhash': formhash, 'referer':'http://bbs.chinaunix.net/', 'username':'MrFan666', 'password':'f12345678', 'loginsubmit':'true', 'return_type':'' } # 登录接口 login_url = "http://bbs.chinaunix.net/" + login_params # 发起post请求登录 res = s.post(url=login_url,headers=headers,data=data) print(res.text)
2019年07月31日
654 阅读
0 评论
0 点赞
2019-07-26
5.懒加载及自动化测试框架
懒加载技术:用的时候再加载懒加载的要点如下:图片进入可视区域之后请求图片资源;对于电商等图片较多,页面很长的业务场景很适用;可以减少无效资源的加载;并发加载的资源过多会阻塞js的加载,影响网站的正常使用;常见的图片懒加载形式:src == src2案例:http://sc.chinaz.com/tupian/xingganmeinvtupian.html 获取图片,保存本地import urllib.request import urllib.parse from lxml import etree import os 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', } def get_request(url,page): #1.处理url:url中需要携带页码值(第一页和非第一页的url是不同的) if page==1: url=format(url%'') else: pn='_'+str(page) url=format(url%pn) return urllib.request.Request(url,headers=headers) def download_images(image_url_list): dir_name='性感美女集' #在当前目录创建一个文件夹 if not os.path.exists(dir_name): os.mkdir(dir_name) for image_url in image_url_list: #通过url获取了图片的二进制数据值 request=urllib.request.Request(image_url,headers=headers) image_data=urllib.request.urlopen(request).read() image_name=os.path.basename(image_url) path=os.path.join(dir_name,image_name) with open(path,'wb') as fp: fp.write(image_data) start_page=int(input('enter start page num:')) end_page=int(input('enter end page num:')) url='http://sc.chinaz.com/tupian/xingganmeinvtupian%s.html' for page in range(start_page,end_page+1): request=get_request(url,page)#获取一个自定义的请求对象 response=urllib.request.urlopen(request) content=response.read().decode()#获取响应回来的网页源码数据 tree=etree.HTML(content) image_url_list=tree.xpath('//div[@id="container"]//img/@src2') download_images(image_url_list)#下载图片selenium(浏览器自动化测试框架)selenium是什么? 是一个Python的一个第三方库,对外提供的接口可以操作你的浏览器,然后让浏览器完成自动化的操作使用selenium安装:pip install selenium操作谷歌浏览器,首先必须有谷歌浏览器的一个驱动除了谷歌,该模块也支持其他的一些主流浏览器,比如IE,Firefox等,但是需要对应的驱动谷歌驱动chromedriver下载地址1谷歌驱动chromedriver下载地址2谷歌驱动和谷歌浏览器版本关系映射表chromedriver版本支持的Chrome版本v2.41v67-69v2.40v66-68v2.39v66-68v2.38v65-67v2.37v64-66v2.36v63-65v2.35v62-64v2.34v61-63v2.33v60-62v2.32v59-61v2.31v58-60v2.30v58-60v2.29v56-58v2.28v55-57v2.27v54-56v2.26v53-55v2.25v53-55v2.24v52-54v2.23v51-53v2.22v49-52v2.21v46-50v2.20v43-48v2.19v43-47v2.18v43-46v2.17v42-43v2.13v42-45v2.15v40-43v2.14v39-42v2.13v38-41v2.12v36-40v2.11v36-40v2.10v33-36v2.9v31-34v2.8v30-33v2.7v30-33v2.6v29-32v2.5v29-32v2.4v29-32代码操作from selenium import webdriver browser = webdriver.Chrome(path) #path为驱动文件所在路径 browser.get(url)使用下面的方法,查找指定的元素进行操作即可find_element_by_id 根据id找节点find_elements_by_name 根据name找find_elements_by_xpath 根据xpath查找find_elements_by_tag_name 根据标签名找find_elements_by_class_name 根据class名字查找find_elements_by_css_selector 根据选择器查找find_elements_by_link_text 根据链接内容查找案例:打开百度,搜索美女,点击某一张图片,关闭浏览器from selenium import webdriver import time # 模拟创建一个浏览器对象,然后通过对象去操作浏览器 path = 'chromedriver.exe' browser = webdriver.Chrome(executable_path=path) url = 'http://www.baidu.com/' #使用浏览器发起指定请求 browser.get(url) time.sleep(3) # 查找input输入框 my_input = browser.find_element_by_id('kw') # 往框里面写文字 my_input.send_keys('美女') time.sleep(3) # 查找搜索按钮 button = browser.find_elements_by_class_name('s_btn')[0] button.click()#点击指定按钮 time.sleep(3) # 找到指定图片点击 #image = browser.find_elements_by_class_name('op-img-address-link-imgs')[2] #image.click() a=browser.find_elements_by_link_text('http://www.baidu.com/link?url=Zx3hGmvjjtOKPqT4FPQhDx-wPTWdM1BMh3tCEYrYKUGMKM67M7vV9LxRU74lo9KJ')[0] a.click() time.sleep(3) # 关闭浏览器,退出浏览器 browser.quit()PhantomJS(无界面浏览器)自动化框架用法参照seleniumPhantomJS官方下载地址案例1:from selenium import webdriver import time path = r'C:\Users\Administrator\Desktop\爬虫授课\day05\ziliao\phantomjs-2.1.1-windows\bin\phantomjs.exe' browser = webdriver.PhantomJS(executable_path=path) url='https://www.baidu.com' browser.get(url) time.sleep(3) #browser.page_source #返回当前网址的页面源代码 browser.save_screenshot('./baidu1.png') my_input = browser.find_element_by_id('kw') # 往框里面写文字 my_input.send_keys('美女') time.sleep(3) browser.save_screenshot('./baidu2.png') # 查找搜索按钮 button = browser.find_elements_by_class_name('s_btn')[0] button.click()#点击指定按钮 time.sleep(3) browser.save_screenshot('./baidu3.png') # 找到指定图片点击 image = browser.find_elements_by_class_name('op-img-address-link-imgs')[2] image.click() time.sleep(3) browser.save_screenshot('./baidu4.png') # 关闭浏览器,退出浏览器 browser.quit()selenium+phantomjs 就是爬虫终极解决方案:有些网站上的内容信息是通过动态加载js形成的,所以使用普通爬虫程序无法回去动态加载的js内容。案例2:下拉滚动条到底部(豆瓣电影下拉)from selenium import webdriver import time url='https://movie.douban.com/typerank?type_name=%E6%81%90%E6%80%96&type=20&interval_id=100:90&action=' #发起请求前,可以让url表示的页面动态加载出更多的数据 path = r'C:\Users\Administrator\Desktop\爬虫授课\day05\ziliao\phantomjs-2.1.1-windows\bin\phantomjs.exe' #创建无界面的浏览器对象 bro=webdriver.PhantomJS(path) #发起url请求 bro.get(url) time.sleep(3) #截图 bro.save_screenshot('1.png') #执行js代码(让滚动条向下偏移n个像素(作用:动态加载了更多的电影信息)) js='document.body.scrollTop=2000' bro.execute_script(js)#该函数可以执行一组字符串形式的js代码 time.sleep(4) bro.save_screenshot('2.png') time.sleep(2) #使用爬虫程序爬去当前url中的内容 bro.quit()
2019年07月26日
688 阅读
0 评论
0 点赞
2019-07-26
4.常用的数据解析方式
正则表达式解析单字符: . : 除换行以外所有字符 [] :[aoe][a-w] 匹配集合中任意一个字符 \d :数字 [0-9] \D : 非数字 \w :数字、字母、下划线、中文 \W : 非\w \s :所有的空白字符包,括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 \S : 非空白 数量修饰: * : 任意多次 >=0 + : 至少1次 >=1 ? : 可有可无 0次或者1次 {m} :固定m次 hello{3,} {m,} :至少m次 {m,n} :m-n次 边界: $ : 以某某结尾 ^ : 以某某开头 分组:(ab) 贪婪模式:.* 非贪婪(惰性)模式:.*? re.I : 忽略大小写 re.M :多行匹配 re.S :单行匹配 re.sub(正则表达式, 替换内容, 字符串) 综合练习1 -- 图片下载糗事百科 需求:将指定页的图片下载后保存到指定文件夹中import urllib.request import urllib.parse import os import re s_pageNum=int(input('enter start page num:')) e_pageNum=int(input('enter end page num:')) #创建文件夹 if not os.path.exists('qiutu'): os.mkdir('qiutu') def get_request(url): headers={ 'User-Agent': 'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36' } return urllib.request.Request(url,headers=headers) def analysis_contente(content): url_list=[] #该列表是用来存储被拼接好的完整的图片的url pl='<div class="thumb">.*?<img src="(.*?)" .*?>.*?</div>' pa=re.compile(pl,re.S) #该列表中存储就是当前页中所有的图片的url imageUrl_list=pa.findall(content) for n_url in imageUrl_list: url='https:'+n_url url_list.append(url) return url_list for page in range(s_pageNum,e_pageNum+1): url='https://www.qiushibaike.com/pic/page/%s/?s=5116392' url=format(url%str(page)) request=get_request(url) response=urllib.request.urlopen(request) content=response.read().decode() #对请求到的网页源码进行指定内容的解析 image_url_list=analysis_contente(content) for url in image_url_list: request_image=get_request(url) response_image=urllib.request.urlopen(request_image) #获取图片原有的名称 image_name=url.split('/')[-1] image_path='qiutu/'+image_name #将图片写入本地进行存储 with open(image_path,'wb') as fp: fp.write(response_image.read()) 综合练习2 -- 抓取文章#http://www.yikexun.cn/rensheng/ganwu/list_52_1.html import re, urllib.request, urllib.parse, os start = int(input('enter a start page:')) end = int(input('enter a end page:')) #新建文件夹 if not os.path.exists('一点点语录'): os.mkdir('一点点语录') #返回一个响应 def get_request(url): headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5792.400 QQBrowser/10.2.2101.400'} resquest = urllib.request.Request(url,headers=headers) response = urllib.request.urlopen(resquest) return response path = '一点点语录/人生感悟(升级版).txt' with open(path,'w',encoding='utf-8') as f: for page in range(start,end+1): # url_list = [] url = 'http://www.yikexun.cn/rensheng/ganwu/list_52_'+str(page)+'.html' webpage = get_request(url).read().decode() url_list = re.findall(r'<div class="art-t">\s+<h3><a href="(.*?)">.*?</a></h3>',webpage) print('开始第{}页'.format(page)) count = 1 for url in url_list: pageInfo = get_request('http://www.yikexun.cn'+url).read().decode() title = re.findall(r'<div class="arc-title">\s+<h1>(.*?)</h1>', pageInfo) content = re.findall(r'<p>(.*?)</p>',pageInfo) print('写入第{}篇文章标题'.format(count)) f.write(title[0]+'\n') print('开始写入第{}篇文章'.format(count)) for paragraph in range(len(content) - 2): if not 'img' in content[paragraph]: if '<br/>' in content[paragraph] or ' ' in content[paragraph]: if len(re.split('<br/>| ', content[paragraph])[0]) == 0: f.write(re.split('<br/>| ', content[paragraph])[1]+'\n') else: f.write(re.split('<br/>| ', content[paragraph])[0]+'\n') else: f.write(content[paragraph]+'\n') f.write('\n\n') print('第{}篇文章写入完成'.format(count)) count += 1 print('第{}页结束'.format(page))bs4:BeautifulSoup解析在pycharm中,可以通过设置直接进行搜索安装 ,无需配置源需要将pip源设置为国内源,阿里源、豆瓣源、网易源等windows (1)打开文件资源管理器(文件夹地址栏中) (2)地址栏上面输入 %appdata% (3)在这里面新建一个文件夹 pip (4)在pip文件夹里面新建一个文件叫做pip.ini ,内容写如下即可[global]timeout = 6000index-url = https://mirrors.aliyun.com/pypi/simple/trusted-host = mirrors.aliyun.comlinux(1)cd ~(2)mkdir ~/.pip (3)vi ~/.pip/pip.conf (4)编辑内容,和windows一模一样需要安装:pip install bs4bs4在使用时候需要一个第三方库,把这个库也安装一下pip install lxml用法:导入:from bs4 import BeautifulSoup使用方式:可以将一个html文档,转化为指定的对象,然后通过对象的方法或者属性去查找指定的内容转化本地文件:soup = BeautifulSoup(open('本地文件'), 'lxml')转化网络文件:soup = BeautifulSoup('字符串类型或者字节类型', 'lxml')打印soup对象显示内容为html文件中的内容根据标签名查找:soup.a 只能找到第一个符合要求的标签获取属性:soup.a.attrs 获取a所有的属性和属性值,返回一个字典soup.a.attrs['href'] 获取href属性soup.a['href'] 也可简写为这种形式获取内容:soup.a.stringsoup.a.textsoup.a.get_text()如果标签内还包含有子标签,那么string获取到的结果为None,而其它两个,可以获取文本内容find:查找soup.find('a') 找到第一个符合要求的asoup.find('a', title="xxx")soup.find('a', alt="xxx")soup.find('a', class_="xxx")soup.find('a', id="xxx")find方法不仅soup可以调用,普通的div对象也能调用,会去指定的div里面去查找符合要求的节点 div = soup.find('div', class_="tang") print(div.find('a', class_="du"))find找到的都是第一个符合要求的标签find_allsoup.find_all('a')soup.find_all(['a', 'b']) 找到所有的a和b标签soup.find_all('a', limit=2) 限制前两个select:soup.select('#feng')根据选择器选择指定的内容常见的选择器:标签选择器(a)、类选择器(.)、id选择器(#)、层级选择器a, .dudu, #lala, .memediv .dudu #lala .meme .xixi 下面好多级div > p > a > .lala 只能是下面一级select选择器返回永远是列表,需要通过下标提取指定的对象,然后获取属性和节点该方法也可以通过普通对象调用,找到都是这个对象下面符合要求的所有节点from bs4 import BeautifulSoup #bs对象返回的是一组文件源码 soup = BeautifulSoup(open('soup_text.html',encoding='utf-8'), 'lxml') soup #soup.div #soup.a.attrs['href'] #soup.a['href'] #soup.a.string #soup.a.text #soup.a.get_text() #oup.find('a') #soup.find('a',{'class':'du'}) #soup.find('a',class_="du") #div_soup=soup.find('div',class_="song") #len(soup.find_all('a',limit=2)) #soup.find_all(['a','div']) #soup.select('#feng') #soup.select('a') #soup.select('.song > img')[0]['src']XPath解析XPath简介概念:xpath是一种路径表达式,用来在xml中查找指定的元素。xml:xml是用来存储和传输数据的一种格式。xml和html的不同有两点:html用来显示数据,xml是用来传输数据html标签是固定的,xml标签是自定义的xpath常用表达式:常用的路径表达式// : 不考虑位置的查找/ : 从跟节点开始往下查找@ : 选取属性实例:/bookstore/book 选取根节点bookstore下面所有直接子节点book//book 选取所有book/bookstore//book 查找bookstore下面所有的book/bookstore/book[1] bookstore里面的第一个book/bookstore/book[last()] bookstore里面的最后一个book/bookstore/book[position()<3] 前两个book//title[@lang] 所有的带有lang属性的title节点//title[@lang='eng'] 所有的lang属性值为eng的title节点属性定位://li[@id="hua"]//div[@class="song"]层级定位:(索引定位)//div[@id="head"]/div/div[2]/a[@class="toindex"]【注】索引从1开始//div[@id="head"]//a[@class="toindex"]【注】双斜杠代表下面所有的a节点,不管位置逻辑运算://input[@class="s_ipt" and @name="wd"]模糊匹配:contains//input[contains(@class, "s_i")]所有的input,有class属性,并且属性中带有s_i的节点//input[contains(text(), "爱")]starts-with//input[starts-with(@class, "s")]所有的input,有class属性,并且属性以s开头取文本://div[@id="u1"]/a[5]/text() 获取节点内容//div[@id="u1"]//text() 获取节点里面不带标签的所有内容取属性://div[@id="u1"]/a[5]/@hrefnew_book.xml<?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <book> <title lang="eng">Harry Potter</title> <price>29.99</price> </book> <book> <title lang="eng">Learning XML</title> <price>39.95</price> </book> </bookstore>from lxml import etree tree=etree.parse('new_book.xml') #xpath表达式需要载入xpath函数中进行执行 #xpath返回的是列表 #tree.xpath('/bookstore') #从根节点开始导航定位到的节点信息 #tree.xpath('/bookstore/book') tree.xpath('//book[2]') #索引从1开始 tree.xpath('//book[last()]') tree.xpath('//book[position()<2]') tree.xpath('//title[@lang="eng"]')代码中使用xpathfrom lxml import etree两种方式使用:将html文档变成一个对象,然后调用对象的方法去查找指定的节点(1)本地文件tree = etree.parse(文件名)(2)网络文件tree = etree.HTML(网页字符串)ret = tree.xpath(路径表达式)【注】ret是一个列表安装xpath插件:可以执行xpath相应的路径指令将xpath插件拖动到谷歌浏览器扩展程序(更多工具中)中,安装成功启动和关闭插件 ctrl + shift + x案例:from lxml import etree url='http://www.haoduanzi.com/category-10_2.html' #//div[@class="log cate10 auth1"]/h3/a/text() #取标题 #//div[@class="log cate10 auth1"]/div[@class="cont"]//text() #取内容 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) response=urllib.request.urlopen(request) url_content=response.read().decode() #使用xpath对url_conten进行解析 #使用xpath解析从网络上获取的数据 tree=etree.HTML(url_content) #解析获取当页所有段子的标题 title_list=tree.xpath('//div[@class="log cate10 auth1"]/h3/a/text()') text_list=tree.xpath('//div[@class="log cate10 auth1"]/div[@class="cont"]//text()') list=str(text_list).split('阅读全文') text=list[0:12]JsonPath解析拓展:jsonPath-简单入门jsonpath: 用来解析json数据使用的安装:pip install lxml pip install jsonpath jsonpath和xpath的对比xPathjsonPath描述/$根元素.@当前元素/. or []子元素..n/a父元素//..递归下降,JSONPath是从E4X借鉴的。**通配符,表示所有的元素@n/a属性访问字符[][]子元素操作符\ [,]连接操作符在XPath 结果合并其它结点集合。JSONP允许name或者数组索引。n/a[start: end: step]数组分割操作从ES4借鉴。[]?()应用过滤表示式n/a()脚本表达式,使用在脚本引擎下面。()n/aXpath分组注意: xpath 索引下标从1开始 jsonpath 索引下标从0开始 处理json用到的函数导包:import jsonjson.dumps():将字典或者列表转化为json格式的字符串json.dump():将字典或者列表转化为json格式字符串并且写入到文件中json.loads():将json格式字符串转化为python对象(字典/列表)json.load():从文件中读取json格式字符串,转化为python对象import json json_obj={ "name":['张三','lisi','xiaohei'], "age":[10,20,30] } #将json对象转换成json串 str_json=json.dumps(json_obj,ensure_ascii=False) obj=json.loads(str_json) #将json_obj转换成json格式的字符串,然后写入到磁盘 #json.dump(json_obj,open('./a.json','w')) #将a.json文件中的json字符串转换成json对象 obj=json.load(open('./a.json','r'))test.json{ "store": { "book": [ { "category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95 }, { "category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99 }, { "category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99 }, { "category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", "price": 22.99 } ], "bicycle": { "color": "red", "price": 19.95 } } }import jsonpath import json #jsonpath函数返回值是一个列表 #将test.json中的字符串提取出来 obj=json.load(open('./test.json','r')) #使用jsonpath函数去执行jsonpath表达式 #获取书店里所有书的作者 #/store/book/author #jsonpath.jsonpath(obj,'$.store.book[*].author') #获取第三本书 #jsonpath.jsonpath(obj,'$.store.book[2]')[0] #获取最后一本书 #jsonpath.jsonpath(obj,'$..book[(@.length-1)]') #过滤出价格小于10的所有图书 #jsonpath.jsonpath(obj,'$..book[?(@.price<10)]') #所有元素 jsonpath.jsonpath(obj,'$..*')案例:淘宝评论爬取要求:将评论中的评论内容,手机详情和用户昵称爬取存储写入json文件。 url='https://rate.tmall.com/list_detail_rate.htm?itemId=560257961625&spuId=893336129&sellerId=1917047079&order=3¤tPage=3&append=0&content=1&tagId=&posi=&picture=&ua=098%23E1hvmpvBvoGvUpCkvvvvvjiPPs5vtjibP2FvljrCPmPptjlWn2cOsj1UPsLW0jY8PghCvCB4cJrUyn147DIsWKwG8lID75qNh46Cvvyv2bgjtJZvO6ArvpvEvC2MmERLvhK99phv2HiJFMwXzHi47k7IzT6CvCvwhHeCeiIv%2B48nrsw6Zf5B3QhvCvvhvvm5vpvhvvmv9FyCvvpvvvvvvphvC9vhvvCvpbyCvm9vvvvvphvvvvvv99CvpvF4vvmmvhCv2UvvvUUvphvUgQvv99CvpvFFuphvmvvv9bUui7cWkphvC99vvOC0ppyCvhQUlC6vCld6u70xdByapbmxfwkK5ehhfw1l%2BboJEcqUaNspV13gprLO6nv7RAYVyO2vqbVQWl4v1WFIRfU6pwet9E7r5C69D7zZa40A2QhvCvvvvvmrvpvEvvp19aMNvmxhRphvCvvvvvvtvpvhvvvvvv%3D%3D&needFold=0&_ksTS=1535091159955_1320&callback=jsonp1321' 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) json_text=urllib.request.urlopen(request).read().decode() #原始的json串存在内容:在开始的位置出现了一些字符数据。 json_text=json_text.strip('\r\njsonp1321()') #将json格式的字符串转换成json对象 json_obj=json.loads(json_text) #进行json解析 rate_list=json_obj['rateDetail']['rateList'] my_rate_list=[] #存储解析后的内容 for rate in rate_list: rate_content=rate['rateContent'] phone_detail=rate['auctionSku'] userName=rate['displayUserNick'] rate_dic={ '评论内容':rate_content, '商品详情':phone_detail, '用户昵称':userName } my_rate_list.append(rate_dic) #将解析到的内容(json对象)写入磁盘 json.dump(my_rate_list,open('./rate.json','w',encoding='utf-8'),ensure_ascii=False)
2019年07月26日
760 阅读
0 评论
0 点赞
2019-07-26
3.登录相关、代理
URLErrorURLError是HTTPError的父类型:出现URLError的错误原因:没有网服务器连接失败找不到指定的服务器import urllib.request import urllib.error url = 'http://www.basjdfkjgkfjgfjhd.com.cn' try: re = urllib.request.urlopen(url) print('here') except urllib.error.URLError as e: print(e.reason) # [Errno 11001] getaddrinfo failedHandler处理器、自定义Opener高级功能的处理:使用代理和cookie#向百度发起一个请求 url='http://www.baidu.com/' #1.创建一个Handler处理器对象 handler=urllib.request.HTTPHandler() #2,通过处理器对象生成一个Opener对象 opener=urllib.request.build_opener(handler) #opener作用:发起请求 request=urllib.request.Request(url) response=opener.open(request) print(response.read()) # <http.client.HTTPResponse at 0x7dbd780>代理生活:中介,代购程序: 正向代理:代理客户端获取数据 反向代理:代理服务器提供数据#使用代码的形式设置客户端代理 #创建处理器对象 handler=urllib.request.ProxyHandler(proxies={'http':'112.95.224.58:80'}) #2。创建opener对象,然后使用该对象发起一个请求 opener=urllib.request.build_opener(handler) url='https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&rsv_idx=1&tn=baidu&wd=IP&oq=%25E8%25A5%25BF%25E5%2588%25BA%25E4%25BB%25A3%25E7%2590%2586&rsv_pq=fee3639900007be7&rsv_t=0d8cHJ8skuhEa3sCpORP%2FnTD7xO8gLUHq1Azm%2FXGJmqWlTIM3GuMWBSzjTg&rqlang=cn&rsv_enter=1&inputT=1271&rsv_sug3=12&rsv_sug1=6&rsv_sug7=100&rsv_sug2=0&rsv_sug4=1271' response=opener.open(url) with open('./daili.html','wb') as fp: fp.write(response.read())cookiecookie是什么?http协议,无状态网站登录时候的时候,用来记录用户身份的#模拟登陆-cookie #人人网案例:进入需要登录才可以访问的网页,则可以带着cookie值进行访问 url='http://www.renren.com/289676607/profile' headers={ "Cookie": "anonymid=jl1x24dy-u0udsq; depovince=BJ; _r01_=1; __utma=151146938.1794929042.1534809369.1534809369.1534809369.1; __utmz=151146938.1534809369.1.1.utmcsr=renren.com|utmccn=(referral)|utmcmd=referral|utmcct=/; _de=0832477C7D3BDE6C8C7E21AC68FA766C7DE1374C26B60001; ln_uact=www.zhangbowudi@qq.com; ln_hurl=http://hdn.xnimg.cn/photos/hdn221/20120418/1315/h_main_0Rbs_563500058dec2f76.jpg; jebe_key=626a9db1-7655-44f4-a1f2-6f69b1e0e681%7C55b0a29313d4d905d984b3769dc164d4%7C1534809469266%7C1%7C1534809477953; jebecookies=56edc7c2-4deb-4e27-8742-b6393274dfc7|||||; JSESSIONID=abcH2ScyV4I-2baIjJBvw; ick_login=9fc272ea-6b5d-4898-ae49-9813f4d7331b; p=0c58e07ece2863c4a02deda63944262a7; first_login_flag=1; t=e39afe60de96d0a877661965f4b7bacf7; societyguester=e39afe60de96d0a877661965f4b7bacf7; id=289676607; loginfrom=syshome; wp_fold=0; xnsid=a47161ec" } request=urllib.request.Request(url,headers=headers) response=urllib.request.urlopen(request) with open('./renren.html','wb') as fp: fp.write(response.read())cookiejar对象作用:自动保存请求中的cookie数据信息注意:必须和handler和opener一起使用创建一个cookiejar对象import http.cookiejarcj = http.cookiejar.CookieJar()通过cookiejar创建一个handlerhandler = urllib.request.HTTPCookieProcessor(cj)根据handler创建一个openeropener = urllib.request.build_opener(handler)再往下所有的操作都是用opener.open方法去发送请求,因为这里面带着cookie过去了代码:#使用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' resonse=opener.open(s_url) with open('./renren.html','wb') as fp: fp.write(resonse.read())
2019年07月26日
653 阅读
0 评论
0 点赞
2019-07-18
2.根据不同请求爬取数据(get、post)
urllib库urllib:python自带的一个包。模拟浏览器发送请求Python2:urllib2 urllibPython3:urllib.parse urllib.request#最简单的爬虫程序 #1.指定一个url #2.编写爬虫程序模拟浏览器发起一个请求 #3.获取数据,解析数据 import urllib.request import urllib.parse url='http://www.baidu.com/' response=urllib.request.urlopen(url) #HTTPResponse:响应对象类型 data=response.read() #获取响应回客户端的数据值(bytes) data=data.decode() print(data)import urllib.request import urllib.parse url='http://www.baidu.com/' response=urllib.request.urlopen(url) #response.getcode() #状态码 #response.getheaders() #请求头信息 response.geturl() #网址#将响应会的数据值写入磁盘进行存储 url='http://www.baidu.com/' response=urllib.request.urlopen(url) #HTTPResponse:响应对象类型 data=response.read().decode() #获取响应回客户端的数据值(bytes) with open('./test/baidu.html','w') as fp: fp.write(data)保存图片方式一:#忽略证书:如果爬虫程序发起的是一个https请求,则必须执行如下代码进行证书的忽略 import ssl ssl._create_default_https_context = ssl._create_unverified_context #图片,音频,视频 必须为二进制类型 image_url='https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1534761981365&di=fa19817d15b6234ce5735d5007a95367&imgtype=0&src=http%3A%2F%2Fimgsrc.baidu.com%2Fimgad%2Fpic%2Fitem%2F21a4462309f79052b0ac781007f3d7ca7bcbd568.jpg' image_response=urllib.request.urlopen(image_url) image_data=image_response.read() with open('./test/data.jpg','wb') as fp: fp.write(image_data)方式二:#保存图片数据的第二种方式 url='https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1534825530753&di=3d46bfef5943bbed7b4301bc198cfc2e&imgtype=0&src=http%3A%2F%2Fwww.qqma.com%2Fimgpic2%2Fcpimagenew%2F2018%2F4%2F5%2F6e1de60ce43d4bf4b9671d7661024e7a.jpg' urllib.request.urlretrieve(url=url,filename='tupian.jpg') # ('tupian.jpg', <http.client.HTTPMessage at 0x6166978>)url特性:url必须为ascii编码(字母,数字,符号)。url必须由字母,数字,下划线或者符号组成。urllib.parse.quote()#urllib.parse.quoteu() 可以将非ASCII的字符编码成ASCII urllib.parse.quote('人民币') #注意:如果使用quote的话,该函数只可以为url中非ASCII的字符进行编码 ## %E4%BA%BA%E6%B0%91%E5%B8%81url='https://www.baidu.com/s?ie=utf-8&wd=%s' wd=urllib.parse.quote('人民币') url=format(url%wd) #接下来就可以对url发起一个请求urllib.parse.urlencode()#制定爬去百度中任意关键字对应的页面 url='http://www.baidu.com/s?' wd=input('enter a word:') data={ 'ie':'utf-8', 'wd':wd } #需要对url进行转码 data=urllib.parse.urlencode(data) url+=data response=urllib.request.urlopen(url) filename='./test/'+wd+".html" with open(filename,'wb') as fp: fp.write(response.read())通过修改UA的值进行身份的伪装:UA是存在于哪里请求需要自制定request对象#自己编写一个请求头 header={ "User-Agent":" Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36" } #Request()该函数返回一个自制定的请求对象,我们可以手动的给该请求对象中参数赋值 request=urllib.request.Request(url=url,headers=header) urllib.request.urlopen(request)使用爬虫爬取get请求采用字符串拼接的方式将get请求的网址拼接起来import urllib.request import urllib.parse url='http://www.baidu.com/s?' data={ 'ie':'utf-8', 'wd':'你好吗' } data=urllib.parse.urlencode(data) #将get请求后的参数存入字典,然后再用urlencode()方法将字典格式化处理,变为 ie=utf-8&wd=%E4%BD%A0%E5%A5%BD%E5%90%97 ,且为ascii码,这是url的特性 url += data #将网址拼接为完整get请求http://www.baidu.com/s?ie=utf-8&wd=%E4%BD%A0%E5%A5%BD%E5%90%97 headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5792.400 QQBrowser/10.2.2101.400' } request=urllib.request.Request(url,headers=headers) response=urllib.request.urlopen(request) print(response.read().decode())使用爬虫爬取post请求由于post的特点,无法通过字符串拼接url的方式进行请求import urllib.request import urllib.parse post_url='https://fanyi.baidu.com/sug' #1.该请求是一个post(携带参数) data={ "kw":"dog" } data=urllib.parse.urlencode(data) headers={ "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36" } #自定义请求对象 request=urllib.request.Request(post_url,data=data.encode(),headers=headers) #自定义的请求对象中的参数(data必须为bytes类型) response=urllib.request.urlopen(request) print(response.read().decode('unicode_escape'))使用爬虫爬取Ajax的get请求ajax的get请求:豆瓣网的分类排行榜案例分析url='https://movie.douban.com/j/chart/top_list?' start=input('enter the start:') data={ "type":'5', "interval_id":"100:90", "action":'', "start":start, "limit":1 } data=urllib.parse.urlencode(data).encode() headers={ "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36" } request=urllib.request.Request(url,data,headers=headers) response=urllib.request.urlopen(request) print(response.read().decode())使用爬虫爬取Ajax的post请求**ajax的post请求:参考案例:http://www.kfc.com.cn/kfccda/index.aspx肯德基餐厅查询**url='http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword' city=input('enter the city of you want to search:') data={ "cname":'', "keyword":city, "pageIndex":'1', "pageSize":"10", "pid":'' } data=urllib.parse.urlencode(data).encode() headers={ "User-Agent":" Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36" } request=urllib.request.Request(url,data,headers) response=urllib.request.urlopen(request) print(response.read().decode())综合练习:百度贴吧需求:输入吧名,输入起始页码和结束页码,然后在当前文件夹中创建一个以吧名为名字的文件夹,里面是每一页html内容,文件名是吧名_pageNum.htmlimport ssl import os ssl._create_default_https_context = ssl._create_unverified_context url='http://tieba.baidu.com/f?' name=input('enter name:') s_pageNum=int(input('enter start pageNum:')) e_pageNum=int(input('enter end pageNum:')) #创建一个存储html文件的文件夹 if not os.path.exists(name): os.mkdir(name) for page in range(s_pageNum,e_pageNum+1): print('开始下载第%d页的内容'%page) data={ "kw":name, "ie":'utf-8', "pn":(page-1)*50 } data=urllib.parse.urlencode(data) request=urllib.request.Request(url,data.encode()) response=urllib.request.urlopen(request) #文件名称 fileName=name+"_"+str(page)+'.html' filePath=name+'/'+fileName with open(filePath,'wb') as fp: fp.write(response.read()) print('结束下载第%d页的内容'%page) ''' enter name:周杰伦 enter start pageNum:0 enter end pageNum:3 开始下载第0页的内容 结束下载第0页的内容 开始下载第1页的内容 结束下载第1页的内容 开始下载第2页的内容 结束下载第2页的内容 开始下载第3页的内容 结束下载第3页的内容 '''
2019年07月18日
641 阅读
0 评论
0 点赞
2019-07-18
1.爬虫入门了解
爬虫概念什么是爬虫?概念:编写程序去互联网上爬取数据的过程哪些语言可以实现爬虫?javaphpc/c++python:提供了无限的模块爬虫的分类聚焦爬虫:“抓取系统”通用爬虫:根据制定的需求获取网页中制定的数据值问题:爬虫程序如何获取网站中的数据值?主动提交url搜索引擎公司会和DNS服务商进行合作robots.txt:口头的协议。如果门户网站指定了该协议后,表示该门户拒绝搜索引擎和爬虫程序爬去网站中的数据。http协议附:HTTP教程什么是http协议?服务器和客户端之间传输数据的一种形式HTTP 工作原理?HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器有:Apache服务器,IIS服务器(Internet Information Services)等。Web服务器根据接收到的请求后,向客户端发送响应信息。HTTP默认端口号为80,但是你也可以改为8080或者其他端口。HTTP三点注意事项:HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。一个http请求都包含什么?请求行:上图中的1,2,3请求头:请求体:learn-url常用的请求头: Accept-charsets:浏览器支持的字符类型get 和post请求:GET产生的URL地址可以被Bookmark,而POST不可以。GET请求会被浏览器主动cache,而POST不会,除非手动设置。GET请求只能进行url编码,而POST支持多种编码方式。GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。GET请求在URL中传送的参数是有长度限制的,而POST么有。对参数的数据类型,GET只接受ASCII字符,而POST没有限制。GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。GET参数通过URL传递,POST放在Request body中。https协议?HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。sslhttps和http的区别?超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。HTTPS和HTTP的区别主要为以下四点:(1)、https协议需要到ca申请证书,一般免费证书很少,需要交费。(2)、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。(3)、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。(4)、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。fiddler什么是fiddler?专业的抓包工具,青花瓷配置:配置可以抓取https请求的操作有些浏览器也自带抓包工具fiddler的基本使用:右上:请求区域header:请求的头信息(UA,cookie)WebForms:请求对象中夹带的数据值Raw:请求对象中主要的详情json:接口XML:接口右下:响应区域
2019年07月18日
465 阅读
0 评论
0 点赞
1
2
3