我的编程空间,编程开发者的网络收藏夹
学习永远不晚

三步爬取半次元热门图片

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

三步爬取半次元热门图片

前言:

边学习,边创造是一件开心的事情,因为你会清楚的认识到自己的状态,以及那充满内心的成就感,因此从写爬虫开始学习python是一个简单粗暴的提升路线,不知不觉了解很多东西

这里以半次元为例对爬虫整体流程以及部分细节进行简单汇总,如果有不正确的地方还请大家指出

 

---------------------------------------分割线----------------------------------------------

 

话不多说,我们打开待爬的页面

会发现这个页面运用了ajax技术,只有向下滑动才会触发请求,如果我们按照现在页面地址爬取,也只能是得到部分相册,既然是ajax,这里我们打开F12  网络工具 刷新页面

滑动到底部,会发现又多了四条GET请求,查看请求的url ,会发现这些url之间不同的只有 p 的值 p=1, p=2, p=3, p=4,p=5

知道了这些,就可以开始编写python文件,请求页面内容了

1、创建一个AlbumUrl类 , 开始获取页面所有相册的url


 

import requests
from bs4 import BeautifulSoup


album_urls = [] #相册url列表

headers = {
"Host": "bcy.net",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:63.0) Gecko/20100101 Firefox/63.0"
}


#获取相册url
class AlbumUrl():

def __init__(self, url, url2):
self.url = url
self.url2 = url2
def page(self, start, end):

for i in range(start, end):

url = self.url % i
response = requests.get(url, headers=headers)

response.encoding = 'utf-8'
after_bs = BeautifulSoup(response.text, 'lxml')

li_s = after_bs.find_all('li', class_='js-smallCards _box') #提取li标签内容

for li in li_s:
list_a = li.find_all('a', class_='db posr ovf') #提取a标签内容
for a in list_a:
a_href = a.get('href') #取出部分url 进行拼接
album_urls.append(self.url2 + a_href)



if __name__ == '__main__':
url = 'https://bcy.net/coser/index/ajaxloadtoppost?p=%s'
url2 = 'https://bcy.net'
spider = AlbumUrl(url, url2)
spider.page(1, 6) #分析出来的页数

编写完毕,运行一下, 无误,把这些相册url保存到列表,等待逐个分析里面的图片内容

 

2、新建一个ImgUrl类  继承threading.Thread类 因为这里我打算用多线程, 导入相应的模块


 

import requests
from bs4 import BeautifulSoup
import threading
import re
import time


album_urls = [] #相册url列表
all_img_urls = [] #所有图片

lock = threading.Lock() #互斥锁

headers = {
"Host": "bcy.net",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:63.0) Gecko/20100101 Firefox/63.0"
}

#抓取每个相册里面图片url
class ImgUrl(threading.Thread):

def run(self):

while len(album_urls) > 0: #只要不为空 就一直抓取
lock.acquire() #上锁
album_url = album_urls.pop()
lock.release() # 解锁

try:
response = requests.get(album_url, headers=headers, timeout=3)
response.encoding = 'utf-8'
re_obj = re.compile('"path(.*?)w650', re.S)
r = (re_obj.findall(response.text))
print("正在分析" + album_url)
after_bs = BeautifulSoup(response.text, 'lxml')

lock.acquire() # 上锁
for title in after_bs.find_all('title'):
global album_title
album_title = (str(title.get_text())).split('-')[0]

for i in range(len(r)):
img_url = r[i].replace(r'\\u002F', '/')[5:] + 'w650.jpg' #拼接字符串,完成每张图片url

img_dict = {album_title: img_url} #相册名和图片url存入字典
all_img_urls.append(img_dict)
print(album_title + '获取成功')

lock.release() # 解锁
time.sleep(0.5)
except:
pass



#获取相册url
class AlbumUrl():

def __init__(self, url, url2):
self.url = url
self.url2 = url2
def page(self, start, end):

for i in range(start, end):

url = self.url % i
response = requests.get(url, headers=headers)

response.encoding = 'utf-8'
after_bs = BeautifulSoup(response.text, 'lxml')

li_s = after_bs.find_all('li', class_='js-smallCards _box') #提取li标签内容

for li in li_s:
list_a = li.find_all('a', class_='db posr ovf') #提取a标签内容
for a in list_a:
a_href = a.get('href') #取出部分url 进行拼接
album_urls.append(self.url2 + a_href)



if __name__ == '__main__':
url = 'https://bcy.net/coser/index/ajaxloadtoppost?p=%s'
url2 = 'https://bcy.net'
spider = AlbumUrl(url, url2)
spider.page(1, 5) #分析出来的页数
for x in range(5):
t = ImgUrl()
t.start()

# 这里需要注意的是,图片的url并不是直接暴露的,里面惨杂了一些字符串,这里我们运用正则来进行筛选,然后用replace进行相应字符串的替换

开五个线程运行一下, 无误,可以准备写入文件了

 

 3、新建一个Download类  同样继承threading.Thread类 ,用于下载图片到本地


 

 

import os

import requests
from bs4 import BeautifulSoup
import threading
import re
import time


album_urls = [] #相册url列表
all_img_urls = [] #所有图片

lock = threading.Lock() #互斥锁

headers = {
"Host": "bcy.net",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:63.0) Gecko/20100101 Firefox/63.0"
}




#抓取每个相册里面图片url
class ImgUrl(threading.Thread):

def run(self):

while len(album_urls) > 0: #只要不为空 就一直抓取
lock.acquire() #上锁
album_url = album_urls.pop()
lock.release() # 解锁

try:
response = requests.get(album_url, headers=headers, timeout=3)
response.encoding = 'utf-8'
re_obj = re.compile('"path(.*?)w650', re.S)
r = (re_obj.findall(response.text))
print("正在分析" + album_url)
after_bs = BeautifulSoup(response.text, 'lxml')

lock.acquire() # 上锁
for title in after_bs.find_all('title'):
global album_title
album_title = (str(title.get_text())).split('-')[0]

for i in range(len(r)):
img_url = r[i].replace(r'\\u002F', '/')[5:] + 'w650.jpg' #拼接字符串,完成每张图片url

img_dict = {album_title: img_url}
all_img_urls.append(img_dict)
print(album_title + '获取成功')

lock.release() # 解锁
time.sleep(0.5)
except:
pass

num = 0
#下载图片
class Download(threading.Thread):

def run(self):

while True:

lock.acquire() #上锁
if len(all_img_urls) == 0:
lock.release() #解锁
continue
else:
img_dict = all_img_urls.pop()
lock.release() #解锁

for key, values in img_dict.items(): #把键值取出

try:
os.mkdir(key)
print(key + '创建成功')
except:
pass
global num
num += 1
filename = str(num) + '.' + str(values).split('.')[-1] #给每张图片重新命名
filepath = os.path.join(key, filename)
session = requests.Session() #这里使用会话请求
http_obj = requests.adapters.HTTPAdapter(max_retries=20) #每次连接的最大失败重试次数
session.mount('https://', http_obj) #增加请求类型
session.mount('http://', http_obj)
try:
response = session.get(values) #读取会话

with open(filepath, 'wb', buffering=4*1024) as image:
image.write(response.content)
image.close()

print(filepath + '下载完毕')
except:
pass

time.sleep(0.1)


#获取相册url
class AlbumUrl():

def __init__(self, url, url2):
self.url = url
self.url2 = url2
def page(self, start, end):

for i in range(start, end):

url = self.url % i
response = requests.get(url, headers=headers)

response.encoding = 'utf-8'
after_bs = BeautifulSoup(response.text, 'lxml')

li_s = after_bs.find_all('li', class_='js-smallCards _box') #提取li标签内容

for li in li_s:
list_a = li.find_all('a', class_='db posr ovf') #提取a标签内容
for a in list_a:
a_href = a.get('href') #取出部分url 进行拼接
album_urls.append(self.url2 + a_href)



if __name__ == '__main__':
url = 'https://bcy.net/coser/index/ajaxloadtoppost?p=%s'
url2 = 'https://bcy.net'
spider = AlbumUrl(url, url2)
spider.page(1, 5) #分析出来的页数
threads = []
for x in range(5):
t = ImgUrl()
t.start()
threads.append(t)

for tt in threads: #设置堵塞,避免线程抢先
tt.join()

for x in range(5):
down = Download()
down.start()

#这里需要注意的是,请求图片的时候不能直接请求,否则会发生异常,这里用会话请求并设置相应的类型

好,开五个线程运行一下,看结果如何

 

 

到此为止,三步爬取半次元热门图片,演示完毕,其实不光是热门,我们也可以换成别的链接进行分析爬取,包括全站,整体原理都是类似的,一些请求细节需要理解

还有,bs4简直就是爬虫神器

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

三步爬取半次元热门图片

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

三步爬取半次元热门图片

前言:边学习,边创造是一件开心的事情,因为你会清楚的认识到自己的状态,以及那充满内心的成就感,因此从写爬虫开始学习python是一个简单粗暴的提升路线,不知不觉了解很多东西这里以半次元为例对爬虫整体流程以及部分细节进行简单汇总,如果有不正确
2023-01-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录