首页
旅行足迹
友链
留言
关于
壁纸
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
页面
旅行足迹
友链
留言
关于
壁纸
搜索到
23
篇与
的结果
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日
654 阅读
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日
642 阅读
0 评论
0 点赞
1
2
3