查看: 1647|回复: 3

[编程交流] python爬取福利网站图片完整代码,懂得人都懂

[复制链接]
发表于 2020-11-11 09:40 | 显示全部楼层 |阅读模式
非法程序、 2020-11-11 09:40 1647 3 显示全部楼层
网址需要自己替换懂的人都懂512*2,主要学习简单的爬虫,别乱用,否则后果自负!
  1. import requests,bs4,re,os,threading



  2. class MeiNvTu:

  3.     def __init__(self):

  4.         self.url_main='https://网址保密,不能乱发哈哈/pw/'

  5.         self.url=f'{self.url_main}thread.php?fid='

  6.     def getPageMax(self,typeID=14):

  7.         try:

  8.             res = requests.get(f'{self.url}{typeID}')

  9.             res.encoding = 'utf-8'

  10.             soup = bs4.BeautifulSoup(res.text, 'lxml')

  11.             pageNum = soup.select('#main > div > span.fl > div.pages.cc > span')

  12.             pageNum = int(re.search('/(.*?)Go', str(pageNum)).group(1))

  13.             return pageNum

  14.         except:

  15.             return 0

  16.     def getTitleList(self,typeID=14,page=1):

  17.         '''

  18.         爬取栏目里某一页的列表,网络错误返回False

  19.         :param typeID:

  20.         :param page:

  21.         :return:

  22.         '''

  23.         try:

  24.             res=requests.get(f'{self.url}{typeID}&page={page}')

  25.             res.encoding= 'utf-8'

  26.             soup=bs4.BeautifulSoup(res.text,'lxml')

  27.             listTitle=soup.select('tr > td > h3')

  28.             lists=[]

  29.             for item in listTitle:

  30.                 if 'html_data' in item.a['href'] :

  31.                     d={}

  32.                     d['href']=self.url_main+item.a['href']

  33.                     d['title']=item.a.text

  34.                     lists.append(d)

  35.             return lists

  36.         except:

  37.             return False

  38.     def downImg(self,url,path):

  39.         '''

  40.         下载一整个页面的图片

  41.         :param url:

  42.         :param path:

  43.         :return:

  44.         '''

  45.         global pool_sema

  46.         res = requests.get(url)

  47.         res.encoding = 'utf-8'

  48.         soup = bs4.BeautifulSoup(res.text, 'lxml')

  49.         imgs=soup.select('#read_tpc > img')

  50.         lists=[]

  51.         try:

  52.             for i,item in enumerate(imgs):



  53.                 imgUrl=re.search("window.open\('(.*?)'\);", str(item['onclick'])).group(1)

  54.                 imgData=requests.get(imgUrl).content

  55.                 typ=imgUrl.split('.')[-1]

  56.                 with open(f'{path}{i}.{typ}','wb')as f:

  57.                     f.write(imgData)

  58.         except:

  59.             print('\033[31m[下载失败!网络异常] ' + path)

  60.             pool_sema.release()

  61.             return



  62.         #将下载好的情况记录下来,下次可以跳过

  63.         textpath=''

  64.         for item in path.split('\\')[0:3]:

  65.             textpath=textpath+item+'\\'

  66.         mutex.acquire()

  67.         try:

  68.             with open(textpath+'log.txt','a')as f:

  69.                f.writelines(path.split('\\')[3]+'\n\r')

  70.         except:

  71.             pass

  72.         mutex.release()

  73.         # 完成后线程池记录-1

  74.         print('\033[31m[完成下载] '+path)

  75.         pool_sema.release()

  76.     def get_typeTitle(self,id):

  77.         '''

  78.         返回类型的标题

  79.         :param id:

  80.         :return:

  81.         '''

  82.         if id==14:

  83.             return '唯美写真'

  84.         if id==15:

  85.             return '网友马赛克'

  86.         if id==16:

  87.             return '露出马赛克'

  88.         if id==49:

  89.             return '街拍马赛克'

  90.         if id==21:

  91.             return '丝袜美腿'

  92.         if id==114:

  93.             return '欧美马赛克'

  94.     def downloadthe(self,title,path):

  95.         '''

  96.         判断是否已经下载过,下载过返回True,没下载过返回False

  97.         :param title:

  98.         :param path:

  99.         :return:

  100.         '''



  101.         try:

  102.             with open(path+'log.txt', 'r')as f:

  103.                 text = f.read()

  104.             if title in text:

  105.                 return True

  106.             else:

  107.                 return False

  108.         except:

  109.             return False

  110.     def get_Page_History(self,path):

  111.         '''

  112.         读取上一次结束 的页码

  113.         :param path:

  114.         :return:

  115.         '''

  116.         try:

  117.             with open(path+'pagelog.ini','r')as f:

  118.                 return int(f.read())

  119.         except:

  120.             return 0

  121. if __name__ == '__main__':

  122.     # 限制线程数量

  123.     pool_sema = threading.BoundedSemaphore(70)

  124.     # 创建互斥体

  125.     mutex = threading.Lock()

  126.     #创建爬取对象

  127.     mnt=MeiNvTu()

  128.     #栏目id

  129.     typeID=21

  130.     #获得最大页数

  131.     page_max=mnt.getPageMax(typeID)

  132.     if page_max==0:

  133.         print('\033[31m网络错误!,总页数为0')

  134.     else:

  135.         path_main= f"D:\\爬取的网站图片\\{mnt.get_typeTitle(typeID)}\"

  136.         if os.path.isdir(path_main) != True:

  137.             os.makedirs(path_main, mode=0o777)

  138.         #爬取某页的列表

  139.         page_History=mnt.get_Page_History(path_main)

  140.         for i in range(page_max):

  141.             #跳过之前下载过的页码

  142.             if i+1<page_History:

  143.                 print(f'\033[37m跳过页码:{i + 1}')

  144.                 continue

  145.             #记录下来页码

  146.             with open(path_main+'pagelog.ini','w')as f:

  147.                 f.write(str(i+1))

  148.             print(f'\033[37m当前页码:{i+1}')

  149.             titleList = mnt.getTitleList(typeID, i + 1)

  150.             if titleList==False:

  151.                 print('\033[31m网络错误!,列表获取失败!')

  152.                 break

  153.             for item in titleList:

  154.                 title=item['title'].replace(' ','').replace(':','').replace('!','').replace('?','').replace('*','').replace('"','')

  155.                 path = path_main + title + "\"

  156.                 #判断是否有这个目录,没有的话就建立

  157.                 if os.path.isdir(path) != True:

  158.                     os.makedirs(path, mode=0o777)

  159.                 if mnt.downloadthe(title,path_main)==False:

  160.                     # 线程池记录+1

  161.                     pool_sema.acquire()

  162.                     print('\033[37m[开始下载] '+path)

  163.                     # 爬取某个标题中的所有图片

  164.                     t=threading.Thread(target=mnt.downImg,args=(item['href'], path))

  165.                     t.setDaemon(True)

  166.                     t.start()

  167.                 else:

  168.                     print('\033[35m发现下载过的:',title,' 已经智能跳过!')
复制代码


python爬取福利网站图片完整代码,懂得人都懂.jpg
发表于 2020-11-11 10:19 | 显示全部楼层
HeiDi 2020-11-11 10:19 显示全部楼层
能不能爬小黄站的整个源码
回复

使用道具 举报

发表于 2020-11-11 13:10 | 显示全部楼层
药不能停 / 加大药量
回复

使用道具 举报

发表于 2020-11-18 02:25 | 显示全部楼层
飞飞哦 2020-11-18 02:25 显示全部楼层
感谢楼主,好人一生平安
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 返回列表 发新帖

快速回复 返回顶部 返回列表