范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

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

  1.urllib库1.1 基本使用
  使用urllib来获取百度首页的源码import urllib.request  # 1、定义一个url  就是你要访问的地址 url = "http://www.baidu.com"  # 2、模拟浏览器向服务器发送请求 response响应 response = urllib.request.urlopen(url)  # 3、获取响应中的页面的源码 content = response.read().decode("utf-8")  # 4、打印数据 print(content)
  read方法,返回的是字节形式的二进制数据,我们要将二进制的数据转换为字符串,需解码 : decode(‘编码的格式’)1.2 1个类型和6个方法import urllib.request  url = "http://www.baidu.com"  # 模拟浏览器向服务器发送请求 response = urllib.request.urlopen(url)  # 一个类型:response是HTTPResponse的类型 print(type(response))  # 按照一个字节一个字节的去读 content = response.read() print(content)  # 返回多少个字节 content = response.read(5) print(content)  # 读取一行 content = response.readline() print(content)  # 一行一行读取 直至结束 content = response.readlines() print(content)  # 返回状态码  如果是200了 那么就证明我们的逻辑没有错 print(response.getcode())  # 返回的是url地址 print(response.geturl())  # 获取是一个状态信息 print(response.getheaders())
  一个类型:HTTPResponse六个方法: read、readline、readlines、getcode、geturl、getheaders1.3 下载import urllib.request  # 下载网页 url_page = "http://www.baidu.com"  # url代表的是下载的路径  filename文件的名字 urllib.request.urlretrieve(url_page,"baidu.html")  # 下载图片 url_img = "https://img1.baidu.com/it/u=3004965690,4089234593&fm=26&fmt=auto&gp=0.jpg" urllib.request.urlretrieve(url= url_img,filename="lisa.jpg")  # 下载视频 url_video = "https://vd3.bdstatic.com/mda-mhkku4ndaka5etk3/1080p/cae_h264/1629557146541497769/mda-mhkku4ndaka5etk3.mp4?v_from_s=hkapp-haokan-tucheng&auth_key=1629687514-0-0-7ed57ed7d1168bb1f06d18a4ea214300&bcevod_channel=searchbox_feed&pd=1&pt=3&abtest="  urllib.request.urlretrieve(url_video,"hxekyyds.mp4")
  在python中,可以写变量的名字,也可以直接写值1.4 请求对象的定制import urllib.request  url = "https://www.baidu.com"  headers = {     "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36" }  # 因为urlopen方法中不能存储字典 所以headers不能传递进去 # 请求对象的定制 request = urllib.request.Request(url=url,headers=headers) response = urllib.request.urlopen(request) content = response.read().decode("utf8") print(content)1.5 get请求的quote方法
  get请求参数,如果是中文,需要对中文进行编码,如下面这样,如果不编码会报错。
  需求 获取 https://www.baidu.com/s?wd=周杰伦的网页源码编码后如下: https://www.baidu.com/s?wd=%E5%91%A8%E6%9D%B0%E4%BC%A6import urllib.request import urllib.parse  url = "https://www.baidu.com/s?wd="  # 请求对象的定制为了解决反爬的第一种手段 headers = {     "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36" }  # 将周杰伦三个字变成unicode编码的格式,需要依赖于urllib.parse name = urllib.parse.quote("周杰伦")  # 将转码后的字符串拼接到路径后面 url = url + name  # 请求对象的定制 request = urllib.request.Request(url=url,headers=headers)  # 模拟浏览器向服务器发送请求 response = urllib.request.urlopen(request)  # 获取响应的内容 content = response.read().decode("utf-8")  # 打印数据 print(content)
  quote适用于将中文转码成Unicode编码1.6 get请求的urlencode方法
  urlencode应用场景:多个参数的时候。如下
  https://www.baidu.com/s?wd=周杰伦&sex=男# 获取https://www.baidu.com/s?wd=%E5%91%A8%E6%9D%B0%E4%BC%A6&sex=%E7%94%B7的网页源码  import urllib.request import urllib.parse  base_url = "https://www.baidu.com/s?"  data = {     "wd":"周杰伦",     "sex":"男",     "location":"中国台湾省" }  new_data = urllib.parse.urlencode(data)  # 请求资源路径 url = base_url + new_data  headers = {     "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36" }  # 请求对象的定制 request = urllib.request.Request(url=url,headers=headers)  # 模拟浏览器向服务器发送请求 response = urllib.request.urlopen(request)  # 获取网页源码的数据 content = response.read().decode("utf-8")  # 打印数据 print(content)1.7 post请求import urllib.request import urllib.parse  url = "https://fanyi.baidu.com/sug"  headers = {     "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36" }  data = {     "kw":"spider" }  # post请求的参数,必须要进行编码 data = urllib.parse.urlencode(data).encode("utf-8") request = urllib.request.Request(url=url,data=data,headers=headers)  # 模拟浏览器向服务器发送请求 response = urllib.request.urlopen(request)  # 获取响应的数据 content = response.read().decode("utf-8")  # 字符串--》json对象 import json obj = json.loads(content) print(obj)
  post请求的参数 必须要进行编码:data = urllib.parse.urlencode(data)undefined编码之后 必须调用encode方法 : data = urllib.parse.urlencode(data).encode(‘utf-8’)undefinedpost的请求的参数,是不会拼接在url的后面的 ,而是需要放在请求对象定制的参数中:undefined request = urllib.request.Request(url=url,data=data,headers=headers)1.8 异常import urllib.request import urllib.error  url = "http://www.doudan1.com"  headers = {     "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36" }  try:     request = urllib.request.Request(url = url, headers = headers)     response = urllib.request.urlopen(request)     content = response.read().decode("utf-8")     print(content) except urllib.error.HTTPError:     print("系统正在升级…") except urllib.error.URLError:     print("我都说了 系统正在升级…")1.9 handler
  为什么要学习handler?urllib.request.urlopen(url) 不能定制请求头urllib.request.Request(url,headers,data) 可以定制请求头Handler:定制更高级的请求头(随着业务逻辑的复杂 请求对象的定制已经满足不了我们的需求,动态cookie和代理不能使用请求对象的定制)# 需求 使用handler来访问百度  获取网页源码  import urllib.request  url = "http://www.baidu.com" headers = {     "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36" }  request = urllib.request.Request(url = url,headers = headers)  # handler   build_opener  open  #(1)获取hanlder对象 handler = urllib.request.HTTPHandler()  #(2)获取opener对象 opener = urllib.request.build_opener(handler)  # (3) 调用open方法 response = opener.open(request) content = response.read().decode("utf-8") print(content)1.10 代理
  为什么需要代理?因为有的网站是禁止爬虫的,如果用真实的ip去爬虫,容易被封掉。import urllib.request  url = "http://www.baidu.com/s?wd=ip"  headers = {     "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36" }  # 请求对象的定制 request = urllib.request.Request(url = url,headers= headers)  # 模拟浏览器访问服务器 # response = urllib.request.urlopen(request)  proxies = {     "http":"118.24.219.151:16817" }  # handler  build_opener  open handler = urllib.request.ProxyHandler(proxies = proxies) opener = urllib.request.build_opener(handler) response = opener.open(request)  # 获取响应的信息 content = response.read().decode("utf-8")  # 保存 with open("daili.html","w",encoding="utf-8")as fp:     fp.write(content)
  代理可以使用:快代理。可以使用代理池来代替一个代理
  2.解析技术2.1 xpathxpath安装及加载
  1.安装lxml库
  pip install lxml ‐i https://pypi.douban.com/simple
  2.导入lxml.etree
  from lxml import etree
  3.etree.parse() 解析本地文件
  html_tree = etree.parse(‘XX.html’)
  4.etree.HTML() 服务器响应文件
  html_tree = etree.HTML(response.read().decode(‘utf‐8’)
  5.解析获取DOM元素
  html_tree.xpath(xpath路径) 按照xpath的chrome插件,使用 ctrl + shift + x 打开插件xpath基本语法
  1.路径查询
  //:查找所有子孙节点,不考虑层级关系undefined/ :找直接子节点
  2.谓词查询
  //p@idundefined//p@id="maincontent"
  3.属性查询
  //@class
  4.模糊查询
  //pcontains(@id, "he")undefined//pstarts‐with(@id, "he")
  5.内容查询
  //p/h1/text()
  6.逻辑运算
  //p@id="head" and @class="s_down"undefined//title | //price
  示例:from lxml import etree  # xpath解析本地文件 tree = etree.parse("test.html")  # 查找ul下面的li li_list = tree.xpath("//body/ul/li")  # 查找所有有id的属性的li标签,text()获取标签中的内容 li_list = tree.xpath("//ul/li[@id]/text()")  # 找到id为l1的li标签  注意引号的问题 li_list = tree.xpath("//ul/li[@id="l1"]/text()")  # 查找到id为l1的li标签的class的属性值 li = tree.xpath("//ul/li[@id="l1"]/@class")  # 查询id中包含l的li标签 li_list = tree.xpath("//ul/li[contains(@id,"l")]/text()")  # 查询id的值以l开头的li标签 li_list = tree.xpath("//ul/li[starts-with(@id,"c")]/text()")  #查询id为l1和class为c1的 li_list = tree.xpath("//ul/li[@id="l1" and @class="c1"]/text()")  li_list = tree.xpath("//ul/li[@id="l1"]/text() | //ul/li[@id="l2"]/text()")2.2 JsonPath
  JsonPath只能解析本地文件。jsonpath的安装及使用
  pip安装:
  pip install jsonpath
  jsonpath的使用:
  obj = json.load(open(‘json文件’, ‘r’, encoding=‘utf‐8’))undefinedret = jsonpath.jsonpath(obj, ‘jsonpath语法’)
  示例:{   "store": {     "book": [       {         "category": "修真",         "author": "六道",         "title": "坏蛋是怎样练成的",         "price": 8.95       },       {         "category": "修真",         "author": "天蚕土豆",         "title": "斗破苍穹",         "price": 12.99       },       {         "category": "修真",         "author": "唐家三少",         "title": "斗罗大陆",         "isbn": "0-553-21311-3",         "price": 8.99       },       {         "category": "修真",         "author": "南派三叔",         "title": "星辰变",         "isbn": "0-395-19395-8",         "price": 22.99       }     ],     "bicycle": {       "author": "老马",       "color": "黑色",       "price": 19.95     }   } }
  解析上面的json数据import json import jsonpath  obj = json.load(open("jsonpath.json","r",encoding="utf-8"))  # 书店所有书的作者 author_list = jsonpath.jsonpath(obj,"$.store.book[*].author")  # 所有的作者 author_list = jsonpath.jsonpath(obj,"$..author")  # store下面的所有的元素 tag_list = jsonpath.jsonpath(obj,"$.store.*")  # store里面所有东西的price price_list = jsonpath.jsonpath(obj,"$.store..price")  # 第三个书 book = jsonpath.jsonpath(obj,"$..book[2]")  # 最后一本书 book = jsonpath.jsonpath(obj,"$..book[(@.length-1)]")  #  前面的两本书 book_list = jsonpath.jsonpath(obj,"$..book[0,1]") book_list = jsonpath.jsonpath(obj,"$..book[:2]")  # 条件过滤需要在()的前面添加一个? #   过滤出所有的包含isbn的书。 book_list = jsonpath.jsonpath(obj,"$..book[?(@.isbn)]")  # 哪本书超过了10块钱 book_list = jsonpath.jsonpath(obj,"$..book[?(@.price>10)]")2.3 BeautifulSoup基本介绍BeautifulSoup简称:bs4什么是BeatifulSoup? BeautifulSoup,和lxml一样,是一个html的解析器,主要功能也是解析和提取数据优缺点
  缺点:效率没有lxml的效率高
  优点:接口设计人性化,使用方便安装以及创建安装
  pip install bs4 -i https://pypi.douban.com/simple导入
  from bs4 import BeautifulSoup创建对象服务器响应的文件生成对象 soup = BeautifulSoup(response.read().decode(), ‘lxml’)本地文件生成对象 soup = BeautifulSoup(open(‘1.html’), ‘lxml’)
  注意:默认打开文件的编码格式gbk所以需要指定打开编码格式节点定位
  1.根据标签名查找节点
  soup.a # 只能找到第一个a soup.a.name
  soup.a.attrs
  2.函数find(返回一个对象)
  find(‘a’):只找到第一个a标签
  find(‘a’, title=‘名字’)
  find(‘a’, class_=‘名字’)find_all(返回一个列表)
  find_all(‘a’) :查找到所有的a
  find_all([‘a’, ‘span’]) 返回所有的a和span
  find_all(‘a’, limit=2) 只找前两个aselect(根据选择器得到节点对象)【 】element:p.class:.firstname#id:#firstname属性选择器:undefined[attribute]:li = soup.select(‘li[class]’)undefined[attribute=value]:li = soup.select(‘li[class="hengheng1"]’)层级选择器:undefinedp p 后代选择器undefinedp>p 子代选择器:某标签的第一级子标签undefinedp,p p或p标签的所有的对象节点信息获取节点内容:适用于标签中嵌套标签的结构
  obj.string
  obj.get_text()【推荐】节点的属性
  tag.name:获取标签名
  tag.attrs:将属性值作为一个字典返回获取节点属性
  obj.attrs.get(‘title’)【常用】
  obj.get(‘title’)
  obj[‘title’]
  示例:            Title                
  • 张三
  • 李四
  • 王五
  • 尚硅谷 嘿嘿嘿
百度 哈哈哈

呵呵呵   使用BeautifulSoup解析上面的htmlfrom bs4 import BeautifulSoup # 默认打开的文件的编码格式是gbk,所以在打开文件的时候需要指定编码 soup = BeautifulSoup(open("bs4的基本使用.html",encoding="utf-8"),"lxml") # 根据标签名查找节点,找到的是第一个符合条件的数据 print(soup.a) # 获取标签的属性和属性值 print(soup.a.attrs) # bs4的一些函数 # (1)find:返回的是第一个符合条件的数据 print(soup.find("a")) # 根据title的值来找到对应的标签对象 print(soup.find("a",title="a2")) # 根据class的值来找到对应的标签对象 注意的是class需要添加下划线 print(soup.find("a",class_="a1")) # (2)find_all 返回的是一个列表,并且返回了所有的a标签 print(soup.find_all("a")) # 如果想获取的是多个标签的数据 那么需要在find_all的参数中添加的是列表的数据 print(soup.find_all(["a","span"])) # limit的作用是查找前几个数据 print(soup.find_all("li",limit=2)) # (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[id="l2"]")) # 层级选择器 # 后代选择器:找到的是p下面的li print(soup.select("p li")) # 子代选择器:某标签的第一级子标签 print(soup.select("p > ul > li")) # 找到a标签和li标签的所有的对象 print(soup.select("a,li")) # 获取节点内容 obj = soup.select("#d1")[0] # 如果标签对象中,只有内容,那么string和get_text()都可以使用 # 如果标签对象中,除了内容还有标签,那么string就获取不到数据 而get_text()是可以获取数据 # 推荐使用get_text() print(obj.string) print(obj.get_text()) # 节点的属性 obj = soup.select("#p1")[0] # name是标签的名字 print(obj.name) # 将属性值左右一个字典返回 print(obj.attrs) # 获取节点的属性 print(obj.attrs.get("class")) print(obj.get("class")) print(obj["class"])


苹果再丢一城,ProMotion技术也被国产厂商反超,苹果还有何优势不得不说,在之前很长一段时间里,苹果手机在各项技术方面的确是领先全球其他手机厂商不少。特别是对于我们的国产手机来说,苹果手机更是之前一直都迈不过去的一道坎。无论是在手机的外观设计方苹果再挤牙膏!iPhone14或将芯片混用,标准本无缘A16芯片iPhone13系列发布之后深受消费者的喜爱,还帮助苹果坐上了今年10月11月国内第一厂商的宝座,而随着2022年即将到来,不少人也在开始期待明年的iPhone14系列。但从近日一苹果ios15。2更新内容可查看手机零件是否正品苹果官方公布了iOS15。2版本的一些更新细节,称其解决了在使用第三方屏幕的iPhone13系列机型上禁用FaceID的问题,还能查看iPhone维修零部件是否是正品。在此之前,如滴滴司机肺腑之言年轻人最好不要入行,没有后悔药网约车平台的出现改变了人们的生活方式,以前出行的时候只能乘坐公交车和出租车,现在有了网约车,动一动手机就能叫车上门,生活半径缩小了不少。有些年轻人看上了滴滴司机这个工作,认为滴滴司鸿蒙HarmonyOS上线控制中心小白条功能,使用更方便自今年6月份鸿蒙系统2。0正式发布之后,经过短短半年的时间,现在升级到鸿蒙系统的用户量已经超过1。3亿,可见用户对于鸿蒙系统的期待和认可值都是非常高的。最近鸿蒙系统官方又对2。0版谷歌正开发Panlingual功能Android13支持为单个App指定语言IT之家12月24日消息,据AndroidPolice报道,谷歌正在为Android13开发一个名为Panlingual的功能,该功能允许用户为单个应用指定语言和相关设置,例如在社印度半导体百亿补贴进展成熟制程优先23年内首批产能落地财联社(上海,编辑史正丞)讯,当地时间周三,印度铁道通信电子和信息技术部部长AshwiniVaishnaw接受媒体采访,进一步向外界披露了该国政府旨在从零开始建立本土半导体产业的计台积电预计将于2022年末量产3nm芯片,早于首批M3A17芯片IT之家12月24日消息,DigiTimes援引消息人士的话称,台积电计划在2022年第四季度开始商业化生产基于其3nm工艺的芯片。完整的报告尚未发布,因此目前无法提供更多详细信息折叠屏手机加速渗透,供应链深度受益事件OPPO推出首款折叠屏手机OPPOFindN。屏幕方面,该机采用5。49英寸外屏(60Hz刷新率)7。1英寸内屏(自适应刷新率1Hz120Hz)。其采用12层复合屏幕结构,搭载中国穷与我何干?电池大王钟馨稼向美捐7千万后,口出狂言引众怒宁德时代是国人引以为傲的一家企业,成立于2011年的它,在短短十年内将新能源电池领域做到了天花板,与比亚迪书写中国新能源的篇章。宁德时代曾毓群凭借着宁德时代,曾毓群还在今年以345在新能源汽车产业变革中把握投资机遇本报记者万宇在造车新势力威马汽车D1轮融资投资者名单中,广发信德位列其中。广发信德智能制造与高科技投资部总经理杨立忠在接受中国证券报记者专访时表示,新能源汽车的变革是一个前所未有的
卓文科技智能微型融合断路器空气开关自动开关近年来,我国电气火灾多发,造成重大人员伤亡和财产损失。据统计,2011年至2016年,我国共发生电气火灾52。4万起,造成3261人死亡2063人受伤,直接经济损失92亿余元,均占智能开关哪家好?山东卓文信息科技有限公司智能开关哪家好?山东卓文信息科技有限公司发布时间20200319133017编辑lxy随着经济水平的迅速发展,技术水平的不断提高,无论是工业生产还是日常生活都对电力系统的供电质量提火线与零线接反了有什么危害?卓文科技提醒您安全用电!1火线与零线接反了有什么危害如果安装不注意的话,火线与零线接反。这种情况下,火线与零线接反了不会影响到家里的电器的使用,但对于安全用电来讲,是存在隐患的。主要是一些家电的控制开关是AI人工智能,一直是令人神之向往随着社会的高速发展,未来的科技和美好的生活,正在一步一步的实现。现在我们最耀眼的技术就是人工智能,人工智能就像珠穆朗玛峰,令人非常的向往。AI界的天花板自从去年GPT3横空出世,A华为孟晚舟结束隔离,正式回归华为办公室11月25日,华为孟晚舟女士正式结束隔离回到深圳坂田华为基地上班。华为基地B1办公区,华为员工为孟晚舟女士的回归举行了盛大的欢迎仪式。孟晚舟表示回到公司,来到你们的身边,看到你们的美妆也在AI技术的赋能下,进入了产业智能化的通道近些年,国内AIAR等先进技术不断发展成熟,家居医疗等纷纷吹响了产业智能化的革命号角,美妆也在AIAR技术的赋能下,进入了产业智能化的通道,从新一代年轻消费者成为助推AR美妆快速发小心这些不注意的小细节会毁掉你的音箱阜新声艺视听专业音响是一种不容易出现故障的设备,但并不一定出现故障不代表不会出故障。音箱在使用的过程中,总会出现这样或那样的问题,给我们带来很大的不便。俗话说的好,未雨绸缪,如果能在使用专业音常见音响连接线介绍阜新声艺视听音响是我们家里常用额一种电子设备。我们要把电脑电视或者手机里的歌曲外放时,都要用音响来播放,让歌曲变得更大声。可以让所有人都听得见,我们通常使用音响时都要用音响连接线连接,那么音响打败教父,横扫351项大奖,它凭什么成为影史第一?前有阿凡达的潘多拉后有魔戒的中土世界。老好莱坞大片接连上映,再一次席卷了票房。不过,在众多影迷的心中,真正的影史第一既不是阿凡达,也不是复联4。而是它,有史以来最好的电影指环王三部发烧友丨我只是一个喜爱音乐的人!阜新声艺视听我以为,最能打动人的艺术首推音乐了。两千多年前,孔子因陶醉于音乐而三月不知肉味卓文君因司马相如一曲凤求凰而不惜放弃富贵生活与之私奔俞伯牙因一曲高山流水结识钟子期陶渊明因喜爱音乐而在等了21年,两大视帝再次合作,这样的华语剧看一部少一部刑侦剧,一直是TVB的王牌类型。从洗冤录到陀枪师姐法证先锋,可谓是无数人童年的回忆。近几年,TVB也开始打起吃老本的主意,推出不少经典刑侦剧的续集,结果却是拍一部毁一部。法证先锋4