【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:\软件\python\python_work\Python_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()

 

posted @ 2020-03-19 00:08  陈帅帅_大侠  阅读(237)  评论(0编辑  收藏  举报