前言

其实很简短就是利用爬虫的第三方库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. Scrapy爬虫案例 | 数据存储至MongoDB

    豆瓣电影TOP 250网址 要求: 1.爬取豆瓣top 250电影名字.演员列表.评分和简介 2.设置随机UserAgent和Proxy 3.爬取到的数据保存到MongoDB数据库  items.py ...

  2. 洛谷p2330繁忙的都市题解

    题面 根据题意来分析, 要求出你选了几条路, 最小生成树是能解的, 那么就直接输出n - 1条路即可, 至于最大值则走一遍最小生成树求出即可 这里提供最小生成树的两种方法 1. 克鲁斯卡尔 克鲁斯卡尔 ...

  3. RMQ问题(超详细!!!)

    一.简介 RMQ是询问某个区间内的最大值或最小值,暴力解法对每个询问区间用循环找最值,当n.q>10000会TLE. 常用RMQ的求解方法——ST算法. ST算法通常用在要多次询问一些区间的最值 ...

  4. shell 查找字符串中字符出现的位置

    #!/bin/bash a="The cat sat on the mat" test="cat" awk -v a="$a" -v b=& ...

  5. 【POJ3414】Pots

    本题传送门 本题知识点:宽度优先搜素 + 字符串 题意很简单,如何把用两个杯子,装够到第三个杯子的水. 操作有六种,这样就可以当作是bfs的搜索方向了 // FILL(1) 把第一个杯子装满 // F ...

  6. Honk's pool[STL multiset]

    目录 题目地址 题干 代码和解释 题目地址 Honk's pool(The Preliminary Contest for ICPC Asia Shenyang 2019 ) 题干 代码和解释 本题使 ...

  7. Netty 优雅退出

    Netty 优雅退出机制和原理:https://www.infoq.cn/article/netty-elegant-exit-mechanism-and-principles/?utm_source ...

  8. javascript的Map使用

    setExpenseAndAmountSum: function() { var detailList = vehicleVueObj.vehicleData; var expenseAmountSu ...

  9. Chrome:不受信任的证书----openssl签发带Subject Alternative Name的证书

    Chrome下自签名证书提示无效的问题 发现chrome验证证书很严格,必须带有Subject Alternative Name.签发csr时,修改openssl.cnf : vi /etc/ssl/ ...

  10. Ubuntu 安装最新版 (1.12) Golang 并使用 go mod

    wget https://dl.google.com/go/go1.12.4.linux-amd64.tar.gz sudo tar -zxvf go1.12.4.linux-amd64.tar.gz ...