前言

其实很简短就是利用爬虫的第三方库Requests与BeautifulSoup。

其实就几行代码,但希望没有开发基础的人也能一下子看明白,所以大神请绕行。

基本环境配置

  • python 版本:2.7
  • IDE :pycharm

相关模块

import urllib2
import io
import random
import urllib
from bs4 import BeautifulSoup
import re
import os

完整代码

import urllib2
import io
import random
import urllib
from bs4 import BeautifulSoup
import re
import os import sys
reload(sys)
sys.setdefaultencoding('utf8')
'''
遇到不懂的问题?Python学习交流群:821460695满足你的需求,资料都已经上传群文件,可以自行下载!
'''
def getHtml(url):
#尽可能让爬虫显示为一个正常用户。若不设置,则发送的请求中,user-agent显示为Python+版本
user_agent = [
'Mozilla/5.0 (Windows NT 5.2) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30',
'Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0',
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET4.0E; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C)',
'Opera/9.80 (Windows NT 5.1; U; zh-cn) Presto/2.9.168 Version/11.50',
'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1',
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET4.0E; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C)'
]
#设置网页编码格式,解码获取到的中文字符
encoding = "gb18030"
#构造http请求头,设置user-agent
header = {"User-Agent":random.choice(user_agent)}
#构造发送请求
request = urllib2.Request(url,headers=header)
#发送请求,获取服务器响应回来的html页面
html = urllib2.urlopen(request).read()
#使用beautifulSoup处理的html页面,类似dom
soup = BeautifulSoup(html,from_encoding=encoding)
return soup # 获取整个站点所有图集的页码
def getPageNum(url):
soup = getHtml(url)
# 直接在站点首页获取所有图集的总页码
nums=soup.find_all('a',class_='page-numbers')
# 除掉“下一页”的链接,并获取到最后一页
totlePage = int(nums[-2].text)
return totlePage #获取指定页面下图集名称和链接
def getPicNameandLink(url): soup = getHtml(url)
meun = []
#类似html dom对象,直接查找id为“pins”的ul标签,返回的结果是一个dom对象
targetul = soup.find("ul",id="pins")
if targetul:
#获取该ul下所有的超链接,返回值的类型是list,find_all中第二个参数表示某个指定标签的属性
pic_list = targetul.find_all("a",target="_blank")
if pic_list:
# 遍历所有指定的标签a
for pic in pic_list:
#获取图集的链接
link = pic["href"]
picturename = ""
#找到标签a中,“class”为“lazy”的img标签。
#find中,第二个参数表示某个指定标签的属性。
#在python中class是保留字,所有标签的class属性的名称为“class_”
img = pic.find("img",class_='lazy')
if img:
# 保证中文字符能够正常转码。
picturename = unicode(str(img["alt"]))
else:
continue
#插入图集名称和对应的url
meun.append([picturename,link]) return meun
return None #function获取所有的图集名称
def getallAltls(url):
totalpage = getPageNum(url)
#获取首页中所有的图集名称。首页的url和其他页面不同,没有page
meun = getPicNameandLink(url)
#循环遍历所有的图集页面,获取图集名称和链接
for pos in range(2,totalpage):
currenturl = url + "/page/" + str(pos)
#getPicNameandLink()返回的值是一个list。
#当一个list插入到另一个list中时,使用extend。
#若是插入一个值时,可以用append
meun.extend(getPicNameandLink(currenturl)) return meun # 获取从首页到指定页面所有的图集名称和链接
def getparAltls(url,page):
meun = getPicNameandLink(url) for pos in range(2,page):
currenturl = url + "/page/" + str(pos)
meun.extend(getPicNameandLink(currenturl)) return meun #获取单个相册内图片页码
def getSinglePicNum(url):
soup = getHtml(url)
#pagenavi还是一个对象(Tag),可以通过find_all找出指定标签出来
pagenavi = soup.find("div",class_="pagenavi")
pagelink = pagenavi.find_all("a") num = int(pagelink[-2].text)
return num #下载单个相册中的所有图片
def getSinglePic(url,path):
totalPageNum = getSinglePicNum(url)
#从第一页开始,下载单个图集中所有的图片
#range()第二个参数是范围值的上限,循环时不包括该值
#需要加1以保证读取到所有页面。
for i in range(1,totalPageNum + 1):
currenturl = url + "/" + str(i)
downloadpic(currenturl,path) #下载单个页面中的图片
def downloadpic(url,path):
soup = getHtml(url)
#找出指定图片所在父容器div
pageimg = soup.find("div",class_="main-image") if pageimg:
#找出该div容器中的img,该容器中只有一个img
img = pageimg.find("img")
#获取图片的url
imgurl = img["src"]
#获取图片的文件名
restring = r'[A-Za-z0-9]+\.jpg'
reimgname = re.findall(restring,imgurl) #将图片保存在指定目录下
path = str(path)
if path.strip() == "":
downloadpath = reimgname[0]
else:
downloadpath = path + "/" + reimgname[0]
#伪装一下下载的http请求,否则有些站点不响应下载请求。
#不设置的话,下载请求中的user-agent为python+版本号
urllib.URLopener.version = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36 SE 2.X MetaSr 1.0'
#下载图片到指定目录中,保留图片在服务器上的文件名
urllib.urlretrieve(imgurl,downloadpath) def downimgofsite(url,path = ""): path = str(path)
#获取所有图集的名称和链接
meun_list = getallAltls(url)
directorypath = "" for meun in meun_list:
directoryname = meun[0]
if path.strip() != "":
directorypath = path + "/" + directoryname
else:
directorypath = os.getcwd + "/" + directoryname if not os.path.exists(directorypath):
os.makedirs(directorypath) getSinglePic(meun[1], directorypath) if __name__ == "__main__": # page = 8
url = "XXXXX"
menu = getallAltls(url)
#menu = getparAltls(url, page) f = open("tsts.txt","a")
for i in menu:
f.write(str(unicode(i[0]))+"\t"+str(i[1])+"\n")
f.close()

【Python爬虫案例学习】下载某图片网站的所有图集的更多相关文章

  1. [记录][python]python爬虫,下载某图片网站的所有图集

    随笔仅用于学习交流,转载时请注明出处,http://www.cnblogs.com/CaDevil/p/5958770.html 该随笔是记录我的第一个python程序,一个爬去指定图片站点的所有图集 ...

  2. 【Python爬虫案例学习】Python爬取淘宝店铺和评论

    安装开发需要的一些库 (1) 安装mysql 的驱动:在Windows上按win+r输入cmd打开命令行,输入命令pip install pymysql,回车即可. (2) 安装自动化测试的驱动sel ...

  3. 【Python爬虫案例学习】分析Ajax请求并抓取今日头条街拍图片

    1.抓取索引页内容 利用requests请求目标站点,得到索引网页HTML代码,返回结果. from urllib.parse import urlencode from requests.excep ...

  4. 【Python爬虫案例学习】Python爬取天涯论坛评论

    用到的包有requests - BeautSoup 我爬的是天涯论坛的财经论坛:'http://bbs.tianya.cn/list.jsp?item=develop' 它里面的其中的一个帖子的URL ...

  5. 【Python爬虫案例学习】python爬取淘宝里的手机报价并以价格排序

    第一步: 先分析这个url,"?"后面的都是它的关键字,requests中get函数的关键字的参数是params,post函数的关键字参数是data, 关键字用字典的形式传进去,这 ...

  6. 【Python爬虫案例学习2】python多线程爬取youtube视频

    转载:https://www.cnblogs.com/binglansky/p/8534544.html 开发环境: python2.7 + win10 开始先说一下,访问youtube需要那啥的,请 ...

  7. 使用Python爬虫爬取网络美女图片

    代码地址如下:http://www.demodashi.com/demo/13500.html 准备工作 安装python3.6 略 安装requests库(用于请求静态页面) pip install ...

  8. Python爬虫系统化学习(2)

    Python爬虫系统学习(2) 动态网页爬取 当网页使用Javascript时候,很多内容不会出现在HTML源代码中,所以爬取静态页面的技术可能无法使用.因此我们需要用动态网页抓取的两种技术:通过浏览 ...

  9. Python爬虫系统化学习(4)

    Python爬虫系统化学习(4) 在之前的学习过程中,我们学习了如何爬取页面,对页面进行解析并且提取我们需要的数据. 在通过解析得到我们想要的数据后,最重要的步骤就是保存数据. 一般的数据存储方式有两 ...

随机推荐

  1. C# 请求数据 方式1

    public static string PostWebRequest2() { HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create( ...

  2. ModuleNotFoundError: No module named 'suit'

    ModuleNotFoundError: No module named 'suit' pip3. install suit

  3. [技术博客]windows中使用docker技术

    背景 我们的工程使用了一个叫做termux的安卓上的linux终端,这个终端在所有的软件包里硬编码了软件的运行路径(/data/data/com.termux/..),由于安卓系统的权限设计,我们名为 ...

  4. MyBatis(六):Mybatis Java API编程实现一对多、一对一

    最近工作中用到了mybatis的Java API方式进行开发,顺便也整理下该功能的用法,接下来会针对基本部分进行学习: 1)Java API处理一对多.多对一的用法: 2)增.删.改.查的用法: 3) ...

  5. 测试winform自动悬浮

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  6. DB2数据库基础

    一.DB2数据库安装教程 DB2安装教程:https://jingyan.baidu.com/article/e75057f2f59ef9ebc91a8905.html 二.DB2常用命令 1. 打开 ...

  7. mapdb的适用场景介绍

    对于大部分系统来说,mapdb并无太大价值,而且增加了成本.但是如果一级缓存巨大例如数以十GB级别,或占据了整个JVM的1/2以上,mapdb的价值就会体现出来.正如其官网介绍: MapDB prov ...

  8. C#反射方式调用泛型方法

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  9. Spark连续特征转化成离散特征

    当数据量很大的时候,分类任务通常使用[离散特征+LR]集成[连续特征+xgboost],如果把连续特征加入到LR.决策树中,容易造成overfit. 如果想用上连续型特征,使用集成学习集成多种算法是一 ...

  10. 【WPF】修改ListBox的Item的样式

    <ListBox> <!-- 数据 --> <ListBoxItem>AAAA</ListBoxItem> <ListBoxItem>BB& ...