今天我们来爬取http://www.shuaia.net/
但是我们今天只爬取图片http://www.shuaia.net/tp/ 下面均是分析过程。
按照之前的套路,我们先拿到所有的图片分类标签。
点击【更多图片】即可得到所有图片的分类
点击【动漫图片】的大分类进去
得到一整个页面,一个页面有个20个套图。所以我们先来搞定分页,如下:
再来对付每一个套图的入口
继续点击该套图,进去后发现所有的图片都是在一个网页上,嗯,挺方便。
至此,分析完毕。
好了,我们先下载一张图片试试水。
代码如下:
import requests
def run10():
headers = {
"Referer": "https://www.mm131.net/",
'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
'Accept-Language': 'en-US,en;q=0.8',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive'
} ###设置请求的头部,伪装成浏览器
with open("D:/estimages/mn.jpg", "wb") as f :
f.write(requests.get("http://www.shuaia.net/d/file/kaifamei/202009/16002185322978467.jpg", headers=headers).content)
f.close
if __name__ == "__main__": #主程序入口
run10() #调用上面的run方法
效果可以。。。。
完整代码如下:
# coding: utf-8
from concurrent.futures import ThreadPoolExecutor
import time
import os
import requests
from bs4 import BeautifulSoup
rootrurl = 'http://www.shuaia.net'
save_dir = 'D:/estimages/'
no_more_pages = 'END'
max_pages = 10
headers = {
"Referer": rootrurl,
'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
'Accept-Language': 'en-US,en;q=0.8',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive'
} ###设置请求的头部,伪装成浏览器
def getAllTags(rootrurl):
taglist = {}
html = BeautifulSoup(requests.get(rootrurl + '/qm/moresc/', headers=headers).text.encode('iso-8859-1').decode('utf-8'),
features="html.parser")
a_s = html.find('div', {'class': 'g-big-box'}).find_all('a')
for a in a_s:
taglist[a.get('href')] = a.string
return taglist
def saveOneImg(dir, img_url):
img = requests.get(img_url, headers=headers) # 请求图片的实际URL
with open(
'{}/{}'.format(dir, img.url.split("/")[-1]), 'wb') as jpg: # 请求图片并写进去到本地文件
jpg.write(img.content)
print(img_url)
def saveImgGroup(dir, href):
new_headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
}
html = BeautifulSoup(requests.get(rootrurl + href, headers=new_headers).text.encode('iso-8859-1').decode('utf-8'),
features="html.parser")
# get total pages
imgs = html.find('div', {'class': 'm_qmview'}).find_all('img')
# directly get url of imgs
for img in imgs:
url = rootrurl + img.get('src')
saveOneImg(dir, url)
def saveOnePageFunc(dir, imgsPage):
for imgPage in imgsPage:
# 按照tag和图片组的内容来创建目录
new_dir = '{}{}/{}'.format(save_dir, dir, imgPage.get('title'))
if not os.path.exists(new_dir):
os.makedirs(new_dir)
saveImgGroup(new_dir, imgPage.get('href'))
pass
def tagSpider(tag, dir):
url = rootrurl + tag + 'index.html'
print(url)
while 1:
# 解析当前页面
html = BeautifulSoup(requests.get(url, headers=headers).text.encode('iso-8859-1').decode('utf-8'),
features="html.parser")
# 提交一个保存页面的任务
saveOnePageFunc(dir, html.find('ul', {'class': 'g-gxlist-imgbox'}).find_all('a', {'target': '_blank'}))
# 找到下一个页面的地址
next_page = html.find('div', {'class': 'tsp_nav'}).find_all('a')[-2]
if next_page.get_text() != '下一页':
break
url = rootrurl + next_page.get('href')
print("thread work over. ")
if __name__ == '__main__':
# 获得所有标签
taglist = getAllTags(rootrurl)
print(taglist)
# 给每个标签配备一个线程
with ThreadPoolExecutor(max_workers=10) as t: # 创建一个最大容纳数量为20的线程池
for tag, dir in taglist.items():
t.submit(tagSpider, tag, dir)
# 等待所有线程都完成。
while 1:
time.sleep(1)
效果如下: