title: 8.用Scrapy框架进行爬取的案例date: 2019-07-31 14:15:50tags:爬虫Scrapycategories: Pythoncopyright: false只有一个页面，无需跳转的爬取案例文件下载创建项目： scrapy startproject 项目名scrapy startproject myFirstScrapy创建爬虫： scrapy genspider 爬虫名 域名scrapy genspideer intersting u148.cn[...]
Scrapy概述：是一个爬虫框架，提取结构性的数据。其可以应用在数据挖掘，信息处理等方面。提供了许多的爬虫的基类，帮我们更简便使用爬虫。基于Twisted首先安装依赖库Twistedpip install （依赖库的路径）在这个网址http://www.lfd.uci.edu/~gohlke/pythonlibs#twisted 下面去寻找符合你的python版本和系统版本的Twisted然后在安装scrapy框架pip install scrapy【注意】路径名不能有中文，不能用管理员进入cmd，电脑系统用户路径不能是中文框架简介该框架是一个第三方的框架，许多功能已经被封装好（比如：下载功能）由五部分构成：引擎、下载器、爬虫、调度器、管道（item和pipeline）以上五部分我们只需要关心其中的两部分：爬虫和管道spiders：蜘蛛或爬虫，我们分析网页的地方，我们主要的代码写在这里管道：包括item和pipeline，用于处理数据其他部分：了解引擎：用来处理整个系统的数据流，触发各种事务（框架的核心）下载器：用于下载网页内容，并且返回给蜘蛛（下载器基于Twisted的高效异步模型）调度器：用来接收引擎发过来的请求，压入队列中等处理任务简单用法（1）创建项目指令：scrapy startproject 项目名 （2）项目目录结构 firstSpider firstSpider spiders 爬虫目录（写代码位置） __init__.py myspider.py 爬虫文件,以后的爬虫代码写在这里 __init__.py items.py 定义数据结构地方 middlewares.py 中间件（了解） pipelines.py 管道文件 settings.py 项目配置文件 scrapy.cfg 项目创建处理，里面是没有爬虫的，我们需要通过指令来创建一个爬虫：cd firstSpider/firstSpider scrapy genspider qiubai “www.qiushibaike.com" 以上指令完事后，就会在firstSpider/firstSpider/spiders里面自动创建一个qiubai.pyqiubai.py文件：name: 爬虫的名字，启动的时候根据爬虫的名字启动项目allowed_domains：允许的域名，就是爬取的时候这个请求要不要发送，如果是该允许域名之下的url，就会发送，如果不是，则过滤掉这个请求，这是一个列表，可以写多个允许的域名start_urls：爬虫起始url，是一个列表，里面可以写多个，一般只写一个def parse(self, response): pass #这个函数非常重要，就是你以后写代码的地方，parse函数名是固定的， #当收到下载数据的时候会自动的调用这个方法，该方法第二个参数为 #response，这是一个响应对象，从该对象中获取html字符串，然后解析之 #【注】这个parse函数必须返回一个可迭代对象（3）定制item.py， 其实就是您的数据结构，格式非常简单，复制粘贴即可（4）撰写蜘蛛打印response对象，简单跑一把指令：cd firstSpider/firstSpider/spidersscrapy crawl qiubai 【注意】第一次抓取的时候如果出错，则 pip install pypiwin32根据response获取网页内容response.text 字符串类型response.body 二进制类型（5）运行scrapy crawl qiubai -o qiubai.json 保存为json文件crapy crawl qiubai -o qiubai.xml 保存为xml文件scrapy crawl qiubai -o qiubai.csv 保存为csv文件用Scrapy写爬虫的一步骤：1）创建项目 scrapy startproject 项目名2）创建爬虫 scrapy genspider 爬虫名 域名3）根据需求编写item4）在spiders里面解析数据5）在管道中处理解析完的数据6）运行： scrapy crawl 爬虫名 [-o xx.json/xml/csv]原理
概述：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)
懒加载技术：用的时候再加载懒加载的要点如下：图片进入可视区域之后请求图片资源；对于电商等图片较多，页面很长的业务场景很适用；可以减少无效资源的加载；并发加载的资源过多会阻塞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()
正则表达式解析单字符： . : 除换行以外所有字符 [] ：[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=' .*? .*? ' 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' \s+ .*? ',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' \s+ (.*?) ', pageInfo) content = re.findall(r' (.*?) ',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 ' ' in content[paragraph] or ' ' in content[paragraph]: if len(re.split(' | ', content[paragraph])[0]) == 0: f.write(re.split(' | ', content[paragraph])[1]+'\n') else: f.write(re.split(' | ', 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"?> Harry Potter 29.99 Learning XML 39.95 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&currentPage=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)
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())
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页的内容 '''
爬虫概念什么是爬虫？概念：编写程序去互联网上爬取数据的过程哪些语言可以实现爬虫？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：接口右下：响应区域