某群里某大学生每天在群里说XX网的图片好看,每天喊爬,但又不去作,实在看不下去了,便深夜有了此篇;
后续MM图的爬取,计划所有放到这里,有质量高的网站,能够留言,有空爬下~html
不解释,以前有篇requests的文章,代码如出一辙,只须要处理下xpath便可服务器
import requests
from lxml import html
import os
dir = "meizitupic/"
def Get_Page_Number(num):
url = 'http://www.mzitu.com/page'+ str(num)
response = requests.get(url).content
# 调用requests库,获取二进制的相应内容。
# 注意,这里使用.text方法的话,下面的html解析会报错.这里涉及到.content和.text的区别了。简单说,若是是处理文字、连接等内容,建议使用.text,处理视频、音频、图片等二进制内容,建议使用.content。
selector = html.fromstring(response)
# 使用lxml.html模块构建选择器,主要功能是将二进制的服务器相应内容response转化为可读取的元素树(element tree)。lxml中就有etree模块,是构建元素树用的。若是是将html字符串转化为可读取的元素树,就建议使用lxml.html.fromstring,毕竟这几个名字应该能大体说明功能了吧。
urls = []
# 准备容器
for i in selector.xpath("//div[@class='postlist']/ul[@id='pins']/li/a/@href"):
# 利用xpath定位到全部的套图的详细地址
urls.append(i)
# # 遍历全部地址,添加到容器中
return urls
def Get_Image_Title(url):
# 如今进入到套图的详情页面了,如今要把套图的标题和图片总数提取出来
response = requests.get(url).content
selector = html.fromstring(response)
image_title = selector.xpath("//div[@class='content']/h2/text()")[0]
# 须要注意的是,xpath返回的结果都是序列,因此须要使用[0]进行定位
return image_title
def Get_Image_Count(url):
response = requests.get(url).content
selector = html.fromstring(response)
image_count = selector.xpath("//div[@class='pagenavi']/a[last()-1]/text()")[0]
return image_count
def Get_Image_Url(url):
#获取图片的下载连接
response = requests.get(url).content
selector = html.fromstring(response)
image_links = []
image_aount = selector.xpath("//div[@class='pagenavi']/a[last()-1]/span/text()")[0]
# 获取网页总数,直接读取下一页那排的倒数第二个参数,通常是页数的总数,拿这个总数去遍历
for i in range(int(image_aount)):
image_url = url + "/" + str(i + 1)
response = requests.get(image_url).content
sel = html.fromstring(response)
image_download_link = sel.xpath("//div[@class='main-image']/p/a/img/@src")[0]
# 这里是单张图片的最终下载地址
image_links.append(str(image_download_link))
return image_links
def Download_Image(image_title, image_links):
num = 1
amount = len(image_links)
if not os.path.exists(dir):
os.makedirs(dir)
for i in image_links:
if not os.path.exists(dir+image_title):
os.makedirs(dir+image_title)
print('正在下载图片:%s第%s/%s张,' % (image_title, num, amount))
# 用于在cmd窗口上输出提示,感受能够增长一个容错函数,没想好怎么写
filename = image_title+"/"+str(num)+".jpg"
#建立文件名
with open(dir+filename, 'wb') as f:
#以二进制写入的模式在本地构建新文件
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.32 Safari/537.36',
'Referer':i}
f.write(requests.get(i,headers=header).content)
# urllib.request.urlretrieve(requests.get(i,headers=header), "%s%s%s.jpg" % (dir, image_title, num))
#若是使用这种方式爬,网站会返回防盗连接,爬的图片都同样,所以须要爬的时候UA作下处理,而urlretrieve并无设置请求头的方式,所以不适用本案例
num += 1
if __name__ == '__main__':
page_number = input('请输入须要爬取的页码:')
for link in Get_Page_Number(1):
Download_Image(Get_Image_Title(link), Get_Image_Url(link))
复制代码