看到某小说站点封推的图片,感觉很好看,想要保存到本地欣赏欣赏。手动保存又太累,所以想要自动化操作,但是自己又没学过爬虫,python也是很久以前学过基础。
所以写出来进行一个学习。
所有爬 取图片,欣赏完毕后均已删除!测试过程均以本地文件测试,未对服务器进行大批量攻击行为。
文章目录
操作步骤
1.获取网页内容
爬 取网页内容,说白了就是访问它,获取源码.
起点封推页面URL地址:https://www.qidian.com/book/coverrec/
现在我们需要通过python对其进行访问
from webbrowser import get
import requests
from bs4 import BeautifulSoup
#定义url地址
url = 'https://www.qidian.com/book/coverrec/'
#定义请求头,模拟浏览器
headers = {
"Host":"www.qidian.com",
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0',
}
#发送GET请求
res = requests.get(url, headers=headers) #返回 <Response [200]> 证明正常通信
soup = BeautifulSoup(res.text,'html.parser') #通过res.text获取具体的源代码
print(soup) #返回url页面的html源代码
2.定位图片位置
通过浏览器自带的检查或者按键F12直接定位到图片的位置。
可以看到是第三方的云存储.所以我们想要将图片保存到本地,我们还需要访问该图片地址.
思路简单一点
获取所有图片地址
通过上面的python我们已经成功获取了网页代码.在测试的过程中可以将其保存到本地然后进行测试
在学习的过程中也应该尽量避免对网站进行大量请求.
# print(soup) #返回url页面的html源代码
#这里直接接上面代码,因为我们只需要图片地址,所以注释print
#参考上图进行操作
#定位到class属性
soup = soup.find_all(attrs={'class':'focus-img'})
#获取class属性下面img标签的src地址 soup[0]代表仅获取第一个图
soup = soup[0].find('img').get('src')
print(soup) #返回内容://bossaudioandcomic-1252317822.image.myqcloud.com/activity/document/57ac136e91ead69306c1be2bdf0b0bf5.jpg
依次将其拼接http:
或https
使合法化(被python识别)
//这样浏览器可以解析,但是python无法解析(也许有其他方法),所以我们直接对其进行处理.
#print(soup)
#之所以是https的原因是浏览器访问下就知道了
url = 'https:' + soup
依次访问
上面通过soup[0]
得到了第一张图的地址,那么soup[1]
是不是就是第二张图的地址?
直接一个循环就行了,那么到多少结束? 起点一页封推是60本,也就是60个页面.
#直接在代码开始添加
for i in range(60):
#下面soup位置改成i即可
soup = soup[i].find('img').get('src')
#但是这样我自己看着不舒服,所以给封装了函数
def get_url(num):
....
....
....
soup = soup[num].find('img').get('src')
url = 'https:' + soup
return url
for i in range(60):
get_url(i)
返回的内容
3.保存图片到本地
通过前面我们已经将当前页面所有的图片地址爬 取了下来,接下来就是将其保存.
保存图片的步骤主要是
访问图片(请求页面)
#通过get_url(i)已经获取了url,加上是在for循环中,所以我们可以直接在for循环下面直接写
url = get_url(i)
res2 = requests.get(url)
将其写入到本地
#因为是图片,所以不好显示,我们直接通过二进制写入本地即可
#直接截取url中的图片名称
name = url[74:110]
with open(name,"wb") as file:
file.write(res2.content)
将所有代码组合起来
from webbrowser import get
import requests
from bs4 import BeautifulSoup
def get_url(num):
url = 'https://www.qidian.com/book/coverrec/'
headers = {
"Host":"www.qidian.com",
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0',
}
res = requests.get(url, headers=headers)
soup = BeautifulSoup(res.text,'html.parser')
# print(soup)
soup = soup.find_all(attrs={'class':'focus-img'})
soup = soup[num].find('img').get('src')
# print(soup)
url = 'https:' + soup
return url
for i in range(2):
url = get_url(i)
res2 = requests.get(url)
name = url[74:110]
with open(name,"wb") as file:
file.write(res2.content)
print("图片"+name+"已经被保存到本地")
4.分页处理
每个站点当内容变多的时候,为了用户的体验以及美观等多个因素进行考虑都会在站点上添加如下功能,也就是分页
在爬 虫的过程中,对于分页的处理大多数情况下是比较简单的,观察页面与页面url之间的规律,从而写出对应的处理代码.
#其中第一页通过测试,发现写成 https://www.qidian.com/book/coverrec/page1/ 同样有效
https://www.qidian.com/book/coverrec/
https://www.qidian.com/book/coverrec/page2/
https://www.qidian.com/book/coverrec/page39/
问题就很简单了,在url后面添加个变量,在for循环外再套一个大的循环,来进行页面处理.(因为都是数字且是有序)
from itertools import count
from webbrowser import get
import requests
from bs4 import BeautifulSoup
def get_url(page,num):
url = 'https://www.qidian.com/book/coverrec/page%s/'%page
headers = {
"Host":"www.qidian.com",
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0',
}
res = requests.get(url, headers=headers)
soup = BeautifulSoup(res.text,'html.parser')
# print(soup)
soup = soup.find_all(attrs={'class':'focus-img'})
soup = soup[num].find('img').get('src')
# print(soup)
url = 'https:' + soup
return url
for j in range(39):
for i in range(10):
url = get_url(j,i)
res2 = requests.get(url)
name = url[74:110]
with open(name,"wb") as file:
file.write(res2.content)
print("图片"+name+"已经被保存到本地")
运行结果就不截图了