前言

其实很简短就是利用爬虫的第三方库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. LeetCode 865. Smallest Subtree with all the Deepest Nodes

    原题链接在这里:https://leetcode.com/problems/smallest-subtree-with-all-the-deepest-nodes/ 题目: Given a binar ...

  2. Numpy | 08 切片和索引

    ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样. (1)ndarray 数组索引可以基于 0 - n 的下标进行: (2)切片对象可以通过内置的 ...

  3. datetime.now()提示没有now方法

    py3.6 导入方法是 from datetime import datetime 在使用datetime.now()的时候报错,说没有now 在保存module的create_time字段的时候,提 ...

  4. ABP 05 创建Model 以及 相应的增删改查

    在core层 添加一个model,如图 2.在 EntityFrameworkCore 层的 DbContext 中添加 Menu 3.编译一下 准备把新增的Model迁移到数据库 打开 程序包管理器 ...

  5. [Zjoi2006]三色二叉树(bzoj1864)(洛谷2585)题解

    原题地址:https://www.luogu.org/problemnew/show/P2585 题目大意:可以把一个节点染成三种颜色,父节点和两个子节点(可以有一个)颜色不能相同.求最多(少)能有多 ...

  6. openjudge1.1

    目录 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8 1.1.9 1.1.10 1.1.1 描述 对于大部分编程语言来说,编写一个能够输出"H ...

  7. request登录案例

    一.案例需求 1.编写login.html登录页面 username & password 两个输入框 2.使用Druid数据库连接池技术,操作mysql,day14数据库中user表 3.使 ...

  8. charles安装及使用

    一.下载安装charles 1.官方网址:https://www.charlesproxy.com/ 选择自己需要的macos/windows/linux下对应的最新版本安装即可 我的是mac,下载版 ...

  9. Note_3.31

    2019/4/1 奇奇怪怪的笔记 整理了一些之前没有写过的东西,把它们拼在一起,并没有什么逻辑可言qwq FWT快速沃尔什变换 \[ FWT(A)=merge(FWT(A0),FWT(A0+A1)) ...

  10. 集合类 collection接口 Set

    Collection接口的另外一种实现为Set集合,主要有两种实现方式一种为HashSet另一种为TreeSet,两种实现都依赖与对应的Map实现类. 代码如下: public HashSet() { ...