zoukankan      html  css  js  c++  java
  • 【Python学习之旅】---爬虫(xpath表达式,爬取网络段子和贴吧图片)

     1 #解析字符窜形式html
     2 
     3 text='''
     4 <div>
     5     <ul>
     6         <li class="item-1"><a href="link1.html">张三</a></li>
     7         <li class="item-2"><a href="link2.html">李四</a></li>
     8         <li class="item-3"><a href="link3.html">王五</a>
     9     </ul>
    10 </div>
    11 '''
    12 from lxml import etree
    13 # etree.HTML()将字符窜解析成特殊的html对象
    14 html=etree.HTML(text)
    15 # 将html对象转换成字符窜
    16 res=etree.tostring(html,encoding="utf-8").decode()
    17 print(res)
    18 
    19 
    20 #解析本地html
    21 #爬虫中网页处理方式:
    22     # 1、在爬虫中,数据获取和数据清洗一体,HTML()
    23     # 2、数据获取和数据清洗分开,parse()
    24 html=etree.parse(r"123.html")
    25 res=html.xpath("//a") #获取所有a标签中的内容
    26 print(res[0].text)  #返回结果是一个列表对象地址,取任意一个元素,解析成文本格式
    27 
    28 
    29 
    30 # #获取指定属性的标签
    31 html=etree.parse(r"123.html")
    32 res=html.xpath("//li/a[@href='link3.html']") #获取所有li标签下的a标签中指定属性包裹的信息
    33 print(res[0].text)
    34 
    35 
    36 #获取标签的属性
    37 html=etree.parse(r"123.html")
    38 res=html.xpath("//li/@class") #获取所有li标签中的calss属性值
    39 res1=html.xpath("//li/a/@href")
    40 print(res)  #直接生成列表,打印出来,因为属性值下没有其它的标签了
    41 print(res1)
    42 #一般情况下,需要拿到a标签下href中的网址,
    43 for i in res1:
    44     requests.get(i)
    45 
    46 
    47 
    48 #获取子标签
    49 from lxml import etree
    50 html=etree.parse(r"123.html")
    51 # res=html.xpath("//li/a") #获取所有li标签下一级标签
    52 # res1=html.xpath("//li//span") #获取所有li下所有符合的子标签
    53 res2=html.xpath("//li//@href")  #获取所有li标签下的所有href属性
    54 print(res2)
    55 
    56 
    57 
    58 #获取标签名和内容
    59 html=etree.parse(r"123.html")
    60 res=html.xpath("//li[last()-1]/a") #获取倒数第二个a标签下的内容
    61 res1=html.xpath("//li/a")
    62 print(res1[-2].text)  #获取倒数第二个a标签下的内容,text表示获取标签内容
    63 
    64 #获取class属性值为item-2的标签
    65 html=etree.parse(r"123.html")
    66 res=html.xpath("//*[@class='item-2']")
    67 print(res[0].tag)   #tag表示获取标签名
     1 #爬取段子中的文字部分
     2 
     3 import requests
     4 from lxml import etree
     5 header={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36"}
     6 url="https://ishuo.cn/"
     7 txt=requests.get(url,headers=header).text
     8 html=etree.HTML(txt)
     9 res=html.xpath('//div[@class="info"]/a') #获取所有div标签下倒数第一个a标签中href属性值
    10 print(res[0].text)
    11 
    12 #https://ishuo.cn/subject/5899
    13 
    14 for i in res:
    15     xurl="https://ishuo.cn"+i
    16     resp2=requests.get(xurl).text
    17     html2=etree.HTML(resp2)
    18     res2=html2.xpath("//div[@class='content']")  #获取div标签下class属性值为content的内容,段子中的文字部分
    19     print(res2[0].text)
    20 
    21 
    22 
    23 #爬取贴吧中的图片
    24 import urllib
    25 from urllib import request
    26 from lxml import etree
    27 class Spider():
    28     def __init__(self):
    29         self.tiebaName="周杰伦"
    30         self.beginpage=1
    31         self.endpage=3
    32         self.url="http://tieba.baidu.com/f?"
    33         self.ua_header={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36;"}
    34         self.filename=1
    35     #构造url
    36     def tiebaspider(self):
    37         for page in range(self.beginpage,self.endpage+1):
    38             pn=(page-1)*50
    39             wo={"kw":self.tiebaName}
    40             word=urllib.parse.urlencode(wo)  #构造URL编码
    41             myurl=self.url+word+"&pn="+str(pn)           #形成完整的URL
    42             self.loadpage(myurl)             #调用下一个方法,传入url
    43 
    44     #爬起网页内容
    45     def loadpage(self,url): #接收上一个方法传入的myurl参数
    46         req=request.Request(url,headers=self.ua_header)
    47         data=request.urlopen(req).read().decode()
    48         print(data)  #打印所爬取的3页网页的信息
    49         html_new = data.replace(r'<!--', '"').replace(r'-->', '"')  #将网页内容的注释取消
    50         html=etree.HTML(html_new)
    51         links=html.xpath('//div[@class="threadlist_lz clearfix"]/div/a/@href')
    52         print(links)
    53         for link in links:
    54             link="http://tieba.baidu.com"+link
    55             self.loadImages(link)
    56 
    57 
    58     #爬取图片所在的链接
    59     def loadImages(self,link):
    60         req=request.Request(link,headers=self.ua_header)
    61         data=request.urlopen(req).read()
    62         # print(data)
    63         html=etree.HTML(data)
    64         links=html.xpath('//img[@class="BDE_Image"]/@src') #获取图片的链接
    65         print(links)
    66         for link in links:
    67             self.writeImages(link)
    68 
    69     #通过图片所在的链接,将图片写入到本地
    70     def writeImages(self,imageslink):
    71 
    72          print("正在下载图片:",self.filename,"...")
    73          resp=request.urlopen(imageslink).read()
    74          with open(r"D:软件pythonpython_workPython_day17图片下载\"+str(self.filename)+".jpg","wb") as f:
    75             f.write(resp)
    76          self.filename+=1
    77 
    78 if __name__=='__main__':
    79     mySpider=Spider()
    80     mySpider.tiebaspider()
  • 相关阅读:
    我孤独吗?我软弱吗?
    DataGrid 中的 HyperLinkColumn 如何传递多个参数?(未整理)
    C# 获取 MAC地址!
    (文本)文件操作
    ioninfinitescroll实现上拉分页加载更多
    前端面试题:防抖的实现
    vue 传送门功能,实现模态窗口
    前端面试题:节流的实现( 减少一段时间的触发频率)
    vue中的render函数
    ionic5实现tab栏切换效果
  • 原文地址:https://www.cnblogs.com/chenyuxia/p/12521459.html
Copyright © 2011-2022 走看看