纠纷奇闻作文社交美文家庭
家庭城市
爱好生活
创业男女
能力餐饮
美文职业
心理周易
母婴奇趣
两性技能
社交传统
新闻范文
工作个人
思考社会
作文职场
家居中考
兴趣安全
解密魅力
奇闻笑话
写作笔记
阅读企业
饮食时事
纠纷案例
初中历史
说说童话
乐趣治疗

python爬虫保姆级教学urllib的使用以及页面解析

9月17日 尘世客投稿
  1。urllib库1。1基本使用
  使用urllib来获取百度首页的源码importurllib。request1、定义一个url就是你要访问的地址urlhttp:www。baidu。com2、模拟浏览器向服务器发送请求response响应responseurllib。request。urlopen(url)3、获取响应中的页面的源码contentresponse。read()。decode(utf8)4、打印数据print(content)
  read方法,返回的是字节形式的二进制数据,我们要将二进制的数据转换为字符串,需解码:decode(‘编码的格式’)1。21个类型和6个方法importurllib。requesturlhttp:www。baidu。com模拟浏览器向服务器发送请求responseurllib。request。urlopen(url)一个类型:response是HTTPResponse的类型print(type(response))按照一个字节一个字节的去读contentresponse。read()print(content)返回多少个字节contentresponse。read(5)print(content)读取一行contentresponse。readline()print(content)一行一行读取直至结束contentresponse。readlines()print(content)返回状态码如果是200了那么就证明我们的逻辑没有错print(response。getcode())返回的是url地址print(response。geturl())获取是一个状态信息print(response。getheaders())
  一个类型:HTTPResponse六个方法:read、readline、readlines、getcode、geturl、getheaders1。3下载importurllib。request下载网页urlpagehttp:www。baidu。comurl代表的是下载的路径filename文件的名字urllib。request。urlretrieve(urlpage,baidu。html)下载图片urlimghttps:img1。baidu。comitu3004965690,4089234593fm26fmtautogp0。jpgurllib。request。urlretrieve(urlurlimg,filenamelisa。jpg)下载视频urlvideohttps:vd3。bdstatic。commdamhkku4ndaka5etk31080pcaeh2641629557146541497769mdamhkku4ndaka5etk3。mp4?vfromshkapphaokantuchengauthkey1629687514007ed57ed7d1168bb1f06d18a4ea214300bcevodchannelsearchboxfeedpd1pt3abtesturllib。request。urlretrieve(urlvideo,hxekyyds。mp4)
  在python中,可以写变量的名字,也可以直接写值1。4请求对象的定制importurllib。requesturlhttps:www。baidu。comheaders{UserAgent:Mozilla5。0(WindowsNT10。0;Win64;x64)AppleWebKit537。36(KHTML,likeGecko)Chrome92。0。4515。159Safari537。36}因为urlopen方法中不能存储字典所以headers不能传递进去请求对象的定制requesturllib。request。Request(urlurl,headersheaders)responseurllib。request。urlopen(request)contentresponse。read()。decode(utf8)print(content)1。5get请求的quote方法
  get请求参数,如果是中文,需要对中文进行编码,如下面这样,如果不编码会报错。
  需求获取https:www。baidu。coms?wd周杰伦的网页源码编码后如下:https:www。baidu。coms?wdE591A8E69DB0E4BCA6importurllib。requestimporturllib。parseurlhttps:www。baidu。coms?wd请求对象的定制为了解决反爬的第一种手段headers{UserAgent:Mozilla5。0(WindowsNT10。0;Win64;x64)AppleWebKit537。36(KHTML,likeGecko)Chrome92。0。4515。159Safari537。36}将周杰伦三个字变成unicode编码的格式,需要依赖于urllib。parsenameurllib。parse。quote(周杰伦)将转码后的字符串拼接到路径后面urlurlname请求对象的定制requesturllib。request。Request(urlurl,headersheaders)模拟浏览器向服务器发送请求responseurllib。request。urlopen(request)获取响应的内容contentresponse。read()。decode(utf8)打印数据print(content)
  quote适用于将中文转码成Unicode编码1。6get请求的urlencode方法
  urlencode应用场景:多个参数的时候。如下
  https:www。baidu。coms?wd周杰伦sex男获取https:www。baidu。coms?wdE591A8E69DB0E4BCA6sexE794B7的网页源码importurllib。requestimporturllib。parsebaseurlhttps:www。baidu。coms?data{wd:周杰伦,sex:男,location:中国台湾省}newdataurllib。parse。urlencode(data)请求资源路径urlbaseurlnewdataheaders{UserAgent:Mozilla5。0(WindowsNT10。0;Win64;x64)AppleWebKit537。36(KHTML,likeGecko)Chrome92。0。4515。159Safari537。36}请求对象的定制requesturllib。request。Request(urlurl,headersheaders)模拟浏览器向服务器发送请求responseurllib。request。urlopen(request)获取网页源码的数据contentresponse。read()。decode(utf8)打印数据print(content)1。7post请求importurllib。requestimporturllib。parseurlhttps:fanyi。baidu。comsugheaders{UserAgent:Mozilla5。0(WindowsNT10。0;Win64;x64)AppleWebKit537。36(KHTML,likeGecko)Chrome92。0。4515。159Safari537。36}data{kw:spider}post请求的参数,必须要进行编码dataurllib。parse。urlencode(data)。encode(utf8)requesturllib。request。Request(urlurl,datadata,headersheaders)模拟浏览器向服务器发送请求responseurllib。request。urlopen(request)获取响应的数据contentresponse。read()。decode(utf8)字符串》json对象importjsonobjjson。loads(content)print(obj)
  post请求的参数必须要进行编码:dataurllib。parse。urlencode(data)undefined编码之后必须调用encode方法:dataurllib。parse。urlencode(data)。encode(‘utf8’)undefinedpost的请求的参数,是不会拼接在url的后面的,而是需要放在请求对象定制的参数中:undefinedrequesturllib。request。Request(urlurl,datadata,headersheaders)1。8异常importurllib。requestimporturllib。errorurlhttp:www。doudan1。comheaders{UserAgent:Mozilla5。0(WindowsNT10。0;Win64;x64)AppleWebKit537。36(KHTML,likeGecko)Chrome92。0。4515。159Safari537。36}try:requesturllib。request。Request(urlurl,headersheaders)responseurllib。request。urlopen(request)contentresponse。read()。decode(utf8)print(content)excepturllib。error。HTTPError:print(系统正在升级)excepturllib。error。URLError:print(我都说了系统正在升级)1。9handler
  为什么要学习handler?urllib。request。urlopen(url)不能定制请求头urllib。request。Request(url,headers,data)可以定制请求头Handler:定制更高级的请求头(随着业务逻辑的复杂请求对象的定制已经满足不了我们的需求,动态cookie和代理不能使用请求对象的定制)需求使用handler来访问百度获取网页源码importurllib。requesturlhttp:www。baidu。comheaders{UserAgent:Mozilla5。0(WindowsNT10。0;Win64;x64)AppleWebKit537。36(KHTML,likeGecko)Chrome92。0。4515。159Safari537。36}requesturllib。request。Request(urlurl,headersheaders)handlerbuildopeneropen(1)获取hanlder对象handlerurllib。request。HTTPHandler()(2)获取opener对象openerurllib。request。buildopener(handler)(3)调用open方法responseopener。open(request)contentresponse。read()。decode(utf8)print(content)1。10代理
  为什么需要代理?因为有的网站是禁止爬虫的,如果用真实的ip去爬虫,容易被封掉。importurllib。requesturlhttp:www。baidu。coms?wdipheaders{UserAgent:Mozilla5。0(WindowsNT10。0;Win64;x64)AppleWebKit537。36(KHTML,likeGecko)Chrome92。0。4515。159Safari537。36}请求对象的定制requesturllib。request。Request(urlurl,headersheaders)模拟浏览器访问服务器responseurllib。request。urlopen(request)proxies{http:118。24。219。151:16817}handlerbuildopeneropenhandlerurllib。request。ProxyHandler(proxiesproxies)openerurllib。request。buildopener(handler)responseopener。open(request)获取响应的信息contentresponse。read()。decode(utf8)保存withopen(daili。html,w,encodingutf8)asfp:fp。write(content)
  代理可以使用:快代理。可以使用代理池来代替一个代理
  2。解析技术2。1xpathxpath安装及加载
  1。安装lxml库
  pipinstalllxmlihttps:pypi。douban。comsimple
  2。导入lxml。etree
  fromlxmlimportetree
  3。etree。parse()解析本地文件
  htmltreeetree。parse(‘XX。html’)
  4。etree。HTML()服务器响应文件
  htmltreeetree。HTML(response。read()。decode(‘utf8’)
  5。解析获取DOM元素
  htmltree。xpath(xpath路径)按照xpath的chrome插件,使用ctrlshiftx打开插件xpath基本语法
  1。路径查询
  :查找所有子孙节点,不考虑层级关系undefined:找直接子节点
  2。谓词查询
  pidundefinedpidmaincontent
  3。属性查询
  class
  4。模糊查询
  pcontains(id,he)undefinedpstartswith(id,he)
  5。内容查询
  ph1text()
  6。逻辑运算
  pidheadandclasssdownundefinedtitleprice
  示例:fromlxmlimportetreexpath解析本地文件treeetree。parse(test。html)查找ul下面的lililisttree。xpath(bodyulli)查找所有有id的属性的li标签,text()获取标签中的内容lilisttree。xpath(ulli〔id〕text())找到id为l1的li标签注意引号的问题lilisttree。xpath(ulli〔idl1〕text())查找到id为l1的li标签的class的属性值litree。xpath(ulli〔idl1〕class)查询id中包含l的li标签lilisttree。xpath(ulli〔contains(id,l)〕text())查询id的值以l开头的li标签lilisttree。xpath(ulli〔startswith(id,c)〕text())查询id为l1和class为c1的lilisttree。xpath(ulli〔idl1andclassc1〕text())lilisttree。xpath(ulli〔idl1〕text()ulli〔idl2〕text())2。2JsonPath
  JsonPath只能解析本地文件。jsonpath的安装及使用
  pip安装:
  pipinstalljsonpath
  jsonpath的使用:
  objjson。load(open(‘json文件’,‘r’,encoding‘utf8’))undefinedretjsonpath。jsonpath(obj,‘jsonpath语法’)
  示例:{store:{book:〔{category:修真,author:六道,title:坏蛋是怎样练成的,price:8。95},{category:修真,author:天蚕土豆,title:斗破苍穹,price:12。99},{category:修真,author:唐家三少,title:斗罗大陆,isbn:0553213113,price:8。99},{category:修真,author:南派三叔,title:星辰变,isbn:0395193958,price:22。99}〕,bicycle:{author:老马,color:黑色,price:19。95}}}
  解析上面的json数据importjsonimportjsonpathobjjson。load(open(jsonpath。json,r,encodingutf8))书店所有书的作者authorlistjsonpath。jsonpath(obj,。store。book〔〕。author)所有的作者authorlistjsonpath。jsonpath(obj,。。author)store下面的所有的元素taglistjsonpath。jsonpath(obj,。store。)store里面所有东西的pricepricelistjsonpath。jsonpath(obj,。store。。price)第三个书bookjsonpath。jsonpath(obj,。。book〔2〕)最后一本书bookjsonpath。jsonpath(obj,。。book〔(。length1)〕)前面的两本书booklistjsonpath。jsonpath(obj,。。book〔0,1〕)booklistjsonpath。jsonpath(obj,。。book〔:2〕)条件过滤需要在()的前面添加一个?过滤出所有的包含isbn的书。booklistjsonpath。jsonpath(obj,。。book〔?(。isbn)〕)哪本书超过了10块钱booklistjsonpath。jsonpath(obj,。。book〔?(。price10)〕)2。3BeautifulSoup基本介绍BeautifulSoup简称:bs4什么是BeatifulSoup?BeautifulSoup,和lxml一样,是一个html的解析器,主要功能也是解析和提取数据优缺点
  缺点:效率没有lxml的效率高
  优点:接口设计人性化,使用方便安装以及创建安装
  pipinstallbs4ihttps:pypi。douban。comsimple导入
  frombs4importBeautifulSoup创建对象服务器响应的文件生成对象soupBeautifulSoup(response。read()。decode(),‘lxml’)本地文件生成对象soupBeautifulSoup(open(‘1。html’),‘lxml’)
  注意:默认打开文件的编码格式gbk所以需要指定打开编码格式节点定位
  1。根据标签名查找节点
  soup。a只能找到第一个asoup。a。name
  soup。a。attrs
  2。函数find(返回一个对象)
  find(‘a’):只找到第一个a标签
  find(‘a’,title‘名字’)
  find(‘a’,class‘名字’)findall(返回一个列表)
  findall(‘a’):查找到所有的a
  findall(〔‘a’,‘span’〕)返回所有的a和span
  findall(‘a’,limit2)只找前两个aselect(根据选择器得到节点对象)【】element:p。class:。firstnameid:firstname属性选择器:undefined〔attribute〕:lisoup。select(‘li〔class〕’)undefined〔attributevalue〕:lisoup。select(‘li〔classhengheng1〕’)层级选择器:undefinedpp后代选择器undefinedpp子代选择器:某标签的第一级子标签undefinedp,pp或p标签的所有的对象节点信息获取节点内容:适用于标签中嵌套标签的结构
  obj。string
  obj。gettext()【推荐】节点的属性
  tag。name:获取标签名
  tag。attrs:将属性值作为一个字典返回获取节点属性
  obj。attrs。get(‘title’)【常用】
  obj。get(‘title’)
  obj〔‘title’〕
  示例:!DOCTYPEhtmlhtmllangenheadmetacharsetUTF8titleTitletitleheadbodyulliidl1张三liliidl2李四lili王五li尚硅谷span嘿嘿嘿spanul百度span哈哈哈spanpidp1classp1呵呵呵bodyhtml
  使用BeautifulSoup解析上面的htmlfrombs4importBeautifulSoup默认打开的文件的编码格式是gbk,所以在打开文件的时候需要指定编码soupBeautifulSoup(open(bs4的基本使用。html,encodingutf8),lxml)根据标签名查找节点,找到的是第一个符合条件的数据print(soup。a)获取标签的属性和属性值print(soup。a。attrs)bs4的一些函数(1)find:返回的是第一个符合条件的数据print(soup。find(a))根据title的值来找到对应的标签对象print(soup。find(a,titlea2))根据class的值来找到对应的标签对象注意的是class需要添加下划线print(soup。find(a,classa1))(2)findall返回的是一个列表,并且返回了所有的a标签print(soup。findall(a))如果想获取的是多个标签的数据那么需要在findall的参数中添加的是列表的数据print(soup。findall(〔a,span〕))limit的作用是查找前几个数据print(soup。findall(li,limit2))(3)select(推荐)select方法返回的是一个列表,并且会返回多个数据print(soup。select(a))可以通过。代表class我们把这种操作叫做类选择器print(soup。select(。a1))print(soup。select(l1))属性选择器:通过属性来寻找对应的标签查找到li标签中有id的标签print(soup。select(li〔id〕))查找到li标签中id为l2的标签print(soup。select(li〔idl2〕))层级选择器后代选择器:找到的是p下面的liprint(soup。select(pli))子代选择器:某标签的第一级子标签print(soup。select(pulli))找到a标签和li标签的所有的对象print(soup。select(a,li))获取节点内容objsoup。select(d1)〔0〕如果标签对象中,只有内容,那么string和gettext()都可以使用如果标签对象中,除了内容还有标签,那么string就获取不到数据而gettext()是可以获取数据推荐使用gettext()print(obj。string)print(obj。gettext())节点的属性objsoup。select(p1)〔0〕name是标签的名字print(obj。name)将属性值左右一个字典返回print(obj。attrs)获取节点的属性print(obj。attrs。get(class))print(obj。get(class))print(obj〔class〕)
投诉 评论 转载

红米独立后的处女作RedmiNote7,亮点总结,剁手吗?小米手机的红米系列,升级为红米Redmi品牌独立运营。像魅族的魅蓝系列,华为的荣耀系列,都被独立出来运营,这能让产品线变得更加清晰,专注自己的定位。此前,雷军就在抖……马斯克特斯拉汽车不久后将会说话,还会夸行人穿的衣服好看据国外媒体报道,特斯拉公司CEO埃隆马斯克(ElonMusk)周日发布了一个视频,在这个视频中,一辆特斯拉Model3车辆正在说话。在视频中,这辆车说的话是:别只是站在那儿,快……国产特斯拉背后钢铁侠马斯克永不停歇没有你们(上海市政府以及特斯拉老车主)的支持,就没有特斯拉的今天。特斯拉CEO埃隆马斯克说到。1月7日,位于上海的特斯拉超级工厂,国产特斯拉Model3正式开启大规模交付……雷诺变形金刚概念电动汽车可扩展电池组续航达700公里IT之家3月2日消息据外媒消息,雷诺最新的概念电动汽车MorphozEV为电动车的发展提供了一个新的思路,可变续航。IT之家获悉,MorphozEV平时搭载40kWh电池……python爬虫保姆级教学urllib的使用以及页面解析1。urllib库1。1基本使用使用urllib来获取百度首页的源码importurllib。request1、定义一个url就是你要访问的地址urlhttp:www。b……只因车大不好卖?特斯拉去年在日本只销售千辆据外媒报道,来自欧洲和日本的最新数据表明,特斯拉新车注册量正在急剧下滑。挪威凭借其积极的电动汽车激励措施,始终是特斯拉的重要市场。2019年2月,该国注册的特斯拉新车数量……vivoV1芯片发布华为nova9系列9月23日发布红魔6S1、vivoV1芯片正式发布:开启硬件级算法时代,将于X70系列亮相今天,深圳vivo芯之所像主题影像技术分享会正式召开。vivo自主研发的首款专业影像芯片vivoV1亮……致农民作家高启伟(1)致农民作家高启伟(1)作者闲云野鹤(2019。12。25)农民作家高启伟三部巨作心无愧心牵百姓忧与苦惮精竭力不觉累湖北女婿杨岭峰……成都车展新车抢先看荣威高性能运动轿车上市,让品质出行触手可及最具质感高性能运动轿车、最舒适出行头等舱、最高颜值改装车阵容全军出击,成都车展上汽荣威展台爆点满满等你来撩!新车方面,全新荣威i5GT将成展台的绝对主角。新车演绎更个性的……小米11pro和小米mix4相比较,该如何选?本人有幸两个手机都用过。先用的小米11pro,使用了两个月,后把手机给老爸,自己换了小米mix4。小米11pro,发热严重,看网上评价还会烧wifi。但是屏幕2k屏,清晰……大众CEO我们是快速追赶者,努力尽可能追上特斯拉3月3日消息,据国外媒体报道,在近几年大热的电动汽车方面,成立不到20年的特斯拉行业领先,分析师认为他们的技术领先其他厂商,领先优势在未来可能会继续扩大。大众CEO赫伯特……GPU暴跌,是缺芯潮结束的信号吗?路透社4月25日消息称,最近GPU价格的大幅下降使得一些机构作出了全球芯片危机结束在即的预测。这场持续了几年的危机已经成为了智能手机行业和汽车制造业等相关行业头上不散的阴云。英……
雷诺AIR4复古概念飞行汽车亮相纯电驱动,能飞700米高飞行汽车真的爽小鹏汽车CEO带来飞行器航拍体验,400米左右法国巴黎计划在2024年奥运会之前,开通电动飞行出租车路线小鹏汇天飞行汽车首次亮相欧洲,计划2022年上半年欧洲试飞吉利商用车发布换电豪华重卡远程星瀚H,2024年量产交付FF面临资金链断裂!留给贾跃亭腾挪只剩34天买米面选京东同款产品比拼多多便宜27元一台华为手机的成本是多少,以华为P40为例比亚迪海豚实车参展ChinaJoy国风漫画涂装,售价1113国民好物aigo65W电源适配,出差好伴侣比亚迪与智能激光雷达系统公司速腾聚创达成合作微软2022年6月15日彻底结束IE浏览器使命
浪够了再回来武汉平安大厦解放造句用解放造句大全站桩后如何收功站桩结束的收功方法碰瓷青年安卓手机如何恢复微信聊天记录怎么查(怎么查微信里面的聊天记录课文海上日出优秀教学设计范文抖音容易上热门的句子毅力号登陆火星一周年,核动力机械臂直升机,比祝融号更先进你需要长假的个迹象深入人心的哲理句子,深刻精辟,让人醒悟一次相逢一次暖

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找美丽时装彩妆资讯历史明星乐活安卓数码常识驾车健康苹果问答网络发型电视车载室内电影游戏科学音乐整形