获取网站表情包
运行环境:
#环境:win10
import requests #发送请求
from lxml import etree #获取html主页树状代码
import os #创建本地文件夹用来存储图片
1.分析:
目标网址:https://www.runoob.com/
首先想要获取什么就从哪里入手,打开图所在的网页,F12查看代码的内容,此处抓取的是资源文件,爬取中发现ajax类型的文件加载出来的无法知道图片的源地址所以暂时不能用这种方式获取。因此可以生成第一步的代码。
import requesturl = "https://www.runoob.com/w3cnote/programmer-joke-22.html"
headers = {"User-Agent" :'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
res = requests.get(url =url ,headers = headers) #获取了该页面的内容
2.筛选:
获取的内容是整个网页的内容,我们需要筛选出我们需要的东西,这个地方使用到了知识点“xpath”
,我们通过HTML的代码已经知道了动态图所放的位置,找到最外层的标签class=“article-intro”,然后获取src对应的地址就可以了
import request
from lxml import etreeurl = "https://www.runoob.com/w3cnote/programmer-joke-22.html"
headers = {"User-Agent" :'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
res = requests.get(url =url ,headers = headers) #获取了该页面的内容
# print(res.text)
tree = etree.HTML(res.text)
# print(tree.xpath("//*[@class='article-intro']/p/@src")) #之前经常用这个方法,出来的往往是空
print(tree.xpath("//div[@class='article-intro']/descendant::*/@src")) #descendant::*表示的是@class='article-intro'标签下面所有
3.范围扩大:
通过上面的设计,我们已经可以获取当前页面的图片的地址了,但是我们应该可以从下面知道这里是有很多页的,这个地方我知道两种方法,一种就是读取下一页标签,结束的时候标签已经是消失的状态,以此来获取下一页的跳转地址。另外一种就是我这次用的目测法,我直接是对比了几个页面的区别,就发现了页面中数字参数就是控制不同页面的。
import request
from lxml import etreeurl = "https://www.runoob.com/w3cnote/programmer-joke-22.html"
headers = {"User-Agent" :'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}for j in range(22,28):url = f"https://www.runoob.com/w3cnote/programmer-joke-{j}.html"res = requests.get(url =url ,headers = headers) #获取了该页面的内容# print(res.text)tree = etree.HTML(res.text)# print(tree.xpath("//*[@class='article-intro']/p/@src")) #之前经常用这个方法,出来的往往是空print(tree.xpath("//div[@class='article-intro']/descendant::*/@src"))
4.存储:
我们已经获取了每个页面的每一条图片的链接,这个时候我们就可以进行图片的存储,无论是图片还是视频这一类的数据都需要通过二进制的形式进行存储,所以写入的时候通常是response.content,这个地方我是首先创建了一个文件夹,然后在此路径下写入图片的数据,因为网站中获取src相关的链接有些许不同,所以我在设计的时候也调整了一下我的代码设计。
import requests
from lxml import etree
import os
url = "https://www.runoob.com/w3cnote/programmer-joke-22.html"
headers = {"User-Agent" :'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
if not os.path.exists('images'):os.makedirs('images')
http = "https:"
for j in range(22,28):url = f"https://www.runoob.com/w3cnote/programmer-joke-{j}.html"res = requests.get(url =url ,headers = headers)# print(res.text)tree = etree.HTML(res.text)# print(tree.xpath("//*[@class='article-intro']/p/@src")) #之前经常用这个方法,出来的往往是空print(tree.xpath("//div[@class='article-intro']/descendant::*/@src"))for i in tree.xpath("//div[@class='article-intro']/descendant::*/@src"):try:if "https" in i:x = i.split("/")print(x[-1])res = requests.get(url=i, headers=headers)with open(f"images/{x[-1]}","wb") as f:f.write(res.content)elif "//" in i :x = i.split("/")y = x[-1]y = y.replace('"',"")print(x[-1])res = requests.get(url=(http + i), headers=headers)with open(f"images/{y}", "wb") as s:s.write(res.content)else:continueexcept:print("跳过一个异常")
结语:
至此就实现了对于图片的一个获取,这种图片或者文字都是比较好获取的,通过这个方法也可以轻易的获取某些网站的头条热点的文字和链接,也可以用scrapy框架来进行爬取,一般情况下我是习惯先用基础代码捋清思路然后再用框架实现爬取的过程。学习过程中也是发现,部分内容无法通过request的返回值来爬取的,因为这些数据是动态的,虽然可以在F12中看到他们的存在。这种通过ajax生成的内容我们可能需要使用selenium来进行爬取,当然selenium的劣势就是无法在服务器进行部署,只能在有网页实体中获取对应的内容。