却道天凉好个秋~
废话写在后面好了....里面有可以直接爬取的程序,几个g的图哦!
小白爬虫学习,爬取图片站的全部图片,python爬虫爬取妹子图源码分享
python写的一个爬取九妹图社的一个爬虫,这个站是js动态加载的,有一定技术成分在里面,这里直接分享源码并有一定注释:
- # -*- coding: utf-8 -*-
- #这个头的编码基本固定,不该的,显示中文的编码
- import sys
- import requests
- from bs4 import BeautifulSoup
- import os
- import random
- import re
- #url = 'http://www.99mm.me/url.php?id=2508'
- #这几个库是基本的几个呀,没什么好说的
- class mzitu():
- #主函数在这里!!!!!请看!入口!!!
- def all_url(self):
- f = open('log.txt', 'r+') #这里用一个txt做日志文件,记录上次爬到第几页了
- i = f.read()
- f.close()
- print 'begin',str(i)
- for i in range(int(i) ,67):
- f = open('log.txt','w+') #好像必须先用r模式读取再用w模式写入文件....
- f.write(str(i))
- f.close()
- url = 'http://www.99mm.me/hot/mm_4_'+str(i)+'.html'
- print url
- html = self.request(url) #从这里调用请求函数了,让我们跟进看看这个函数!
- mid_href = BeautifulSoup(html.text,'lxml').find('ul',id='piclist').find_all('a',target='_blank')
- # mmid_href =[mid_href[j] for j in range(0,len(mid_href),2)]
- mmid_href = mid_href[::2] #为什么隔一个取一个网址呢,因为它会返回此时的一个连接,和下一个连接
- for la_href in mmid_href:
- href = 'http://www.99mm.me' + la_href['href']
- self.html(href) #然后就开始爬对应图片网址了
- # print href
- def request(self, url): ##这个函数获取网页的response 然后返回
- headers = {
- 'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}
- content = requests.get(url, headers=headers)
- return content
- def html(self, href):
- # print href
- htmlcont = self.request(href) #这里又解析图片的网址
- title = BeautifulSoup(htmlcont.content,'lxml').find('h2').get_text()
- print 'Start Save', title
- if not self.mkdir(title): ##跳过已存在的文件夹
- print u'跳过:', title
- return
- for page in range(2, 38):
- page_url = 'http://www.99mm.me/url.php?id=' + href[-9:-5]#因为这个站是动态加载的,,,拼接成这样
- refer_url = href + '?url=' +str(page-1) #refer_url用来反反扒
- # print page_url
- self.img(page_url,refer_url) #保存图片地址的函数
- def img(self, page_url,refer_url):
- # print page_url
- # img_html = self.requestpic(page_url,refer_url)
- #img_url = BeautifulSoup(img_html.content, 'lxml').find('div', id='picbox').find('img')
- img_html = self.requestpic(page_url,refer_url)
- img_url = re.findall('src="(.*?)"', img_html)[0]
- if img_url:
- #print img_html
- #print img_url
- self.save(img_url)
- else:
- return #返回空,上面的html爬取函数就跳过了,我没获取每个页面的最大页面,用了个吉利数字38封底
- def save(self, img_url):#这个函数存图片了
- name = img_url[-8:-4]
- # print name,img_url
- try:
- img = self.request(img_url)
- f = open(name + '.jpg', 'ab') #这里是存图了,打开一个,并且图片这类文件用'b'二进制模式存取
- f.write(img.content)
- f.close()
- #print name,'保存成功'
- except IOError: ##捕获异常,继续往下走
- print u'图片不存在已跳过:', img_url
- return False
- def mkdir(self, path): ##这个函数创建文件夹,知识点就在代码里,不需要说明,看不懂的地方直接百度
- path = path.strip()
- isExists = os.path.exists(os.path.join("D:\All_img", path))
- if not isExists:
- os.mkdir(os.path.join("D:\All_img", path))
- print u'建了一个名字叫做', path, u'的文件夹!'
- os.chdir(os.path.join("D:\All_img", path)) ##切换到目录
- return True
- else:
- print u'名字叫做', path, u'的文件夹已经存在了!'
- return False
- def requestpic(self, url, Referer): ##这个函数获取网页的response 然后返回
- user_agent_list = [ \
- "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1" \
- "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11", \
- "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6", \
- "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6", \
- "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1", \
- "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5", \
- "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5", \
- "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3", \
- "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3", \
- "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3", \
- "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3", \
- "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3", \
- "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3", \
- "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3", \
- "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3", \
- "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3", \
- "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24", \
- "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
- ]
- #上面这一堆是为了模拟文件头,,,多搞几个身份伪装总是好的
- # print Referer
- ua = random.choice(user_agent_list)
- headers = {'User-Agent': ua, "Referer": Referer}
- ##较之前版本获取图片关键参数在这里,就referer这个东西,他是传输过程用来记录来访页面的
- content = requests.get(url ,headers=headers).content.decode()
- # print content
- return content
- ##这里用try语句是为了防止命令行出错时直接关闭退出
- try:
- print u'作者:COOLMIN'
- print u'时间:20171210'
- print u'版本:1.0测试版--刚学完强行打包测试版本'
- print u'PXX:有错肯定是代码没优化好,93654539放这里了,源码也共享了,供学习交流,请注明出处'
- print '-------------------------------------------------------------------------------'
- if not os.path.exists("D:\All_img"):
- os.mkdir("D:\All_img") #建立一个总文件夹
- print u'总文件夹在:D:\All_img'
- Mzitu = mzitu() #实例化
- Mzitu.all_url() #调用这个all_url函数
- print u'恭喜您下载完成啦!'
- except:
- print "Unexpected error:", sys.exc_info() # sys.exc_info()返回出错信息
- raw_input('press enter key to exit') #这儿放一个等待输入是为了不让程序退出
如上,这个源码我进行了适当的注释,适合初入爬虫坑的胖友们学习食用。爬取了九妹图社http://www.99mm.me/,大家请酌情食用,我和站长也没仇,不希望他的服务器爆了,在此我也要感谢一下这位站长,虽然我并不认识。
然后本人对文件进行了打包,做成了可在Windows平台下运行的一个可执行程序,什么叫可执行程序??我不想解释,,,然后如果使用,会出现如下的效果:
完事后大概是这个站的全部图片吧,几个g吧....我反正没爬完,我对这些图不感兴趣,,,纯粹是为了技术交流学习,,,毕竟py,,,真的我没爬完,我不知道,你看上面的截图示例!!截完图我都删了的好伐!!!博主刚正不阿嘿!!!,,,
哦对,源码下载链接以及程序都在百度云:链接:https://pan.baidu.com/s/1o8on8d8 密码:rnfg
想起来了,一开始准备说的废话:如你所见,博主又是停更了一个多星期了吧,这篇博文应该也是继承了上篇博文提到的博主开始的py之路,如今py之路达到了目前的水平,暂时可以爬取一些基本的图片站了,当然其他类似的自然也不在话下,什么时候爬到这样的7,8个站就可以开始考虑玩大数据了,以上...其他源码会在陆续放出交流学习
文章以及程序转载请注明出处,尊重原创,谢谢,,,学习的过程有什么疑问也可以随时留言交流...