前言
各位小伙伴们,大家好呀,相信大家的第一次爬虫是爬取图片吧?确实,图片在爬虫里面的比较好拿取的数据,先从简单的开始,更有利于我们学习基本的知识
好了,想必大家都等不及了吧,直接上代码
首先导入库
import requests
from lxml import etree
import re
import os
分析要抓取的内容,这里以某网站为例,先写完代码的整体框架
import requests
from lxml import etree
import re
import os
# 解析函数
def parse_html(html):
pass
# 下载函数
def download_img(link, num):
pass
# 主要的爬虫逻辑
def main():
pass
# 程序的入口
if __name__ == '__main__':
main()
然后利用浏览器的右键检查工具分析网站,撰写主要的爬虫逻辑
# 主要的爬虫逻辑
def main():
# 爬取100页
for page in range(1,101):
# 初始的url
base_url = 'https://****/gallery/{}.html'.format(page)
# 首页的url需要特殊处理
if page == 1:
base_url = 'https://****/gallery/'
r1 = requests.get(url=base_url, headers=headers)
r1.encoding = 'utf-8'
# 解析html
tree1 = parse_html(r1.text)
# 每一页20套图集的列表
imglist_urls = tree1.xpath('//div[@id="listdiv"]/ul/li/div[@class="galleryli_title"]/a/@href')
# 遍历列表
for imglist_url,num in zip(imglist_urls,range(1,len(imglist_urls)+1)):
# 拼接成完整的url
imglist_url = 'https://****' + imglist_url
# print(imglist_url)
# 发送该套图集的请求
r2 = requests.get(url=imglist_url, headers=headers)
r2.encoding = 'utf-8'
tree2 = parse_html(r2.text)
# 获取图集的名称
name = tree2.xpath('//ul[@id="utag"]/li[1]/a/text()')[0]
# 改变工作路径
path = DOWNLOAD_PATH + name
if not os.path.exists(path):
os.makedirs(path)
os.chdir(path)
# 获取图集图片的数量
img_num_text = tree2.xpath('//span[@style="color: #DB0909"]/text()')[0]
img_num = re.findall('(.*?)张照片', img_num_text)[0] # 注意数量是str
# 获取第一张图片链接
first_img_link = tree2.xpath('//ul[@id="hgallery"]/img[1]/@src')[0]
first_img_link = first_img_link[0:-5] # 这里把0.jpg去掉,方便下面的构造
# 循环每一套图集数量的次数
print("-----正在下载----->>{},共{}张".format(name, img_num))
for img in range(1, int(img_num)+1):
# 构造图片地址最终的url
link = first_img_link
if img == 1:
link = first_img_link + "0.jpg"
elif img < 10:
link = first_img_link + "00{}.jpg".format(img)
else:
link = first_img_link + "0{}.jpg".format(img)
# 传入下载函数下载图片
download_img(link, img)
print("-----下载完成-----")
最后将主逻辑中得到的所有图片的url传入下载函数
# 下载函数
def download_img(link, num):
r = requests.get(url=link, headers=headers)
with open("{}.jpg".format(num), "wb") as f:
f.write(r.content)
print("\r{}.jpg".format(num), end="")
好了,本次爬虫项目顺利完成!
最后附上源码
import requests
from lxml import etree
import re
import os
# 在这里修改下载路径
DOWNLOAD_PATH = "G://爬虫下载//pic//"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36'
}
# 解析函数
def parse_html(html):
tree = etree.HTML(html)
return tree
# 下载函数
def download_img(link, num):
r = requests.get(url=link, headers=headers)
with open("{}.jpg".format(num), "wb") as f:
f.write(r.content)
print("\r{}.jpg".format(num), end="")
# 主要的爬虫逻辑
def main():
# 爬取100页
for page in range(1,101):
# 初始的url
base_url = 'https://****/gallery/{}.html'.format(page)
# 首页的url需要特殊处理
if page == 1:
base_url = 'https://****/'
r1 = requests.get(url=base_url, headers=headers)
r1.encoding = 'utf-8'
# 解析html
tree1 = parse_html(r1.text)
# 每一页20套图集的列表
imglist_urls = tree1.xpath('//div[@id="listdiv"]/ul/li/div[@class="galleryli_title"]/a/@href')
# 遍历列表
for imglist_url,num in zip(imglist_urls,range(1,len(imglist_urls)+1)):
# 拼接成完整的url
imglist_url = 'https://****' + imglist_url
# print(imglist_url)
# 发送该套图集的请求
r2 = requests.get(url=imglist_url, headers=headers)
r2.encoding = 'utf-8'
tree2 = parse_html(r2.text)
# 获取图集的名称
name = tree2.xpath('//ul[@id="utag"]/li[1]/a/text()')[0]
# 改变工作路径
path = DOWNLOAD_PATH + name
if not os.path.exists(path):
os.makedirs(path)
os.chdir(path)
# 获取图集图片的数量
img_num_text = tree2.xpath('//span[@style="color: #DB0909"]/text()')[0]
img_num = re.findall('(.*?)张照片', img_num_text)[0] # 注意数量是str
# 获取第一张图片链接
first_img_link = tree2.xpath('//ul[@id="hgallery"]/img[1]/@src')[0]
first_img_link = first_img_link[0:-5] # 这里把0.jpg去掉,方便下面的构造
# 循环每一套图集数量的次数
print("-----正在下载----->>{},共{}张".format(name, img_num))
for img in range(1, int(img_num)+1):
# 构造图片地址最终的url
link = first_img_link
if img == 1:
link = first_img_link + "0.jpg"
elif img < 10:
link = first_img_link + "00{}.jpg".format(img)
else:
link = first_img_link + "0{}.jpg".format(img)
# 传入下载函数下载图片
download_img(link, img)
print("-----下载完成-----")
# 程序的入口
if __name__ == '__main__':
main()
学习从来不是一个人的事情,要有个相互监督的伙伴,工作需要学习python或者有兴趣学习python的伙伴,可以关注公众号网课答题吧!小编会不定的整理python代码,并且发布!