python hack-requests_python全自动无人值守爬取某网站妹子图集

[Python] 纯文本查看 复制代码import requests

from lxml import etree

import time

import os

import re

import multiprocessing as mp

def geturl(url = 'https://www.tujigu.com/'):

headers = {

'Accept': '*/*',

'Accept-Language': 'en-US,en;q=0.8',

'Cache-Control': 'max-age=0',

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36',

'Connection': 'keep-alive',

'Referer': 'http://www.baidu.com/'

}

try:

res = requests.get(url , headers=headers , timeout = 16) #获取源码

time.sleep(2)

res.encoding = res.apparent_encoding #防乱码

xml = etree.HTML(res.text) #转换成xml格式

return xml

except:

print(f'获取{url}页面失败,已经放弃!')

return 'error'

def getmaxpage (count):

maxpage = geturl()

if maxpage == 'error':

print('取得最大页失败!')

return 'max page error'

else:

atlnum = maxpage.xpath('//div[5]/ul/li[1]/a/@href') #取得最新图集链接

maxnum = atlnum[0].split('/') #分割链接,取得最大的图集数量

if int(count) +6 > int(maxnum[-2]):

print(f'输入的数值超过现有图集数量,已经把数量更改为现有图集数量{maxnum[-2]}') # 最大图集数量获取的是首页最新图集的编号!

print('准备开始>>>>>>>')

return maxnum[-2]

else:

print('准备开始>>>>>>>')

return count

def getatlname(url):

atlcode = geturl(url) # 获取页面源码

if atlcode == 'error':

print('获取源码失败!')

return 'code error'

else:

atlname = atlcode.xpath('//div[@class="tuji"]/div[@class="weizhi"]/h1/text()') #获取图集标题

atlnumber = atlcode.xpath('//div[@class="tuji"]/p[contains(text(),"图片数量")]/text()') #获取图集内图片数量

if atlnumber != []:

atlnumber1 = atlnumber[0].split('P') #分割文本去掉数字后的”p“

atlnum = atlnumber1[0].split(' ') #分割文本 获得图集内图片数量的数字

atllink = atlcode.xpath('//*[@id="pages"]/a/@href')

pagenum = atlcode.xpath('//*[@id="pages"]/text()/following-sibling::a/text()') #子页面总数量

return atlnum[1] , atlname ,atllink,pagenum[-2] #把图集内图片数量和图集名称返回

else:

print('未获取到图片数量!')

return 'code error'

total = 0

# count = input('请输入需要采集的图集数量:')

count = 666103 #这里写想要采集的数量 更改起始采集图集编号在下面倒数第二行里面

maxnum2 = getmaxpage(count)

if maxnum2 == 'max page error':

print(f'没有获取到最大页,已经默认输入的{count}为最大页')

maxnum = int(count)

else:

maxnum = int(maxnum2)

def getpic(i):

atlas = 'https://www.tujigu.com/a/' + str(i) + '/' #构造url

# print(tuji)

atlasinfo = getatlname(atlas) #调用函数取得图集名称和图集内图片数量及全部的图集子页面url

if atlasinfo == 'code error':

print('获得源码失败!放弃这个图集')

print(f'url地址:{atlas}')

# continue

else:

picname = 1 #实在不知道咋命名了……随便弄了个变量命名!

atlname = re.sub('\s' , '' , atlasinfo[1][0]).replace('/' , '') #清理一下获取到的图集名,免得命名文件夹的时候出现奇怪的问题

path = 'D:/tujigu/'+str(atlname) #构造存储路径

if not os.path.exists(path):

os.makedirs(path) #如果路径不存在就创建

print(f'正在采集{atlasinfo[1][0]},图集编号为【{i}】,本图集一共{atlasinfo[0]}张')

for j in range(1,int(atlasinfo[3])+1):

if j == 1:

atllink = 'https://www.tujigu.com/a/' + str(i) + '/' #第一页后面加后缀不能访问

else:

atllink = 'https://www.tujigu.com/a/' + str(i) + '/' + str(j) + '.html' #构造第二页以后的页面

picxml = geturl(atllink)

if picxml == 'error':

print('获取图片列表失败')

continue

else:

piclist = picxml.xpath('//div[@class="content"]/img/@src') #获取当前页面下所有的图片列表

for pic in piclist:

piccon = requests.get(pic)

with open(path + '/' + str(picname) + '.jpg' , 'wb') as f: #写入图片

f.write(piccon.content)

global total

total += 1

picname += 1

if __name__ == '__main__':

pool = mp.Pool(processes=8) #创建进程池,需要几个就把数字改成几

res = pool.map(getpic , (range(6,maxnum+1))) #启动进程,传入开始图集编号,和需要的图集数量

print(res) #没啥用,可以删掉

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值