python爬虫–九妹图社可执行爬虫程序学习分享

  • A+
所属分类:Python合集

废话写在后面好了....里面有可以直接爬取的程序,几个g的图哦!

 

小白爬虫学习,爬取图片站的全部图片,python爬虫爬取妹子图源码分享

 

python写的一个爬取九妹图社的一个爬虫,这个站是js动态加载的,有一定技术成分在里面,这里直接分享源码并有一定注释:

  1. # -*- coding: utf-8 -*-
  2. #这个头的编码基本固定,不该的,显示中文的编码
  3. import sys
  4. import requests
  5. from bs4 import BeautifulSoup
  6. import os
  7. import random
  8. import re
  9. #url = 'http://www.99mm.me/url.php?id=2508'
  10. #这几个库是基本的几个呀,没什么好说的
  11. class mzitu():
  12. #主函数在这里!!!!!请看!入口!!!
  13. def all_url(self):
  14.         f = open('log.txt', 'r+')  #这里用一个txt做日志文件,记录上次爬到第几页了
  15.         i = f.read()
  16.         f.close()
  17. print 'begin',str(i)
  18. for i in range(int(i) ,67):
  19.             f = open('log.txt','w+')  #好像必须先用r模式读取再用w模式写入文件....
  20.             f.write(str(i))
  21.             f.close()
  22.             url = 'http://www.99mm.me/hot/mm_4_'+str(i)+'.html'
  23. print url
  24.             html = self.request(url)  #从这里调用请求函数了,让我们跟进看看这个函数!
  25.             mid_href = BeautifulSoup(html.text,'lxml').find('ul',id='piclist').find_all('a',target='_blank')
  26. # mmid_href =[mid_href[j] for j in range(0,len(mid_href),2)]
  27.             mmid_href = mid_href[::2] #为什么隔一个取一个网址呢,因为它会返回此时的一个连接,和下一个连接
  28. for la_href in mmid_href:
  29.                 href = 'http://www.99mm.me' + la_href['href']
  30. self.html(href)  #然后就开始爬对应图片网址了
  31. # print href
  32. def request(self, url):  ##这个函数获取网页的response 然后返回
  33.         headers = {
  34.             'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}
  35.         content = requests.get(url, headers=headers)
  36. return content
  37. def html(self, href):
  38. # print href
  39.         htmlcont = self.request(href)  #这里又解析图片的网址
  40.         title = BeautifulSoup(htmlcont.content,'lxml').find('h2').get_text()
  41. print 'Start Save', title
  42. if not self.mkdir(title):  ##跳过已存在的文件夹
  43. print u'跳过:', title
  44. return
  45. for page in range(2, 38):
  46.             page_url = 'http://www.99mm.me/url.php?id=' + href[-9:-5]#因为这个站是动态加载的,,,拼接成这样
  47.             refer_url = href + '?url=' +str(page-1) #refer_url用来反反扒
  48. # print page_url
  49. self.img(page_url,refer_url) #保存图片地址的函数
  50. def img(self, page_url,refer_url):
  51. # print page_url
  52. # img_html = self.requestpic(page_url,refer_url)
  53. #img_url = BeautifulSoup(img_html.content, 'lxml').find('div', id='picbox').find('img')
  54.         img_html = self.requestpic(page_url,refer_url)
  55.         img_url = re.findall('src="(.*?)"', img_html)[0]
  56. if img_url:
  57. #print img_html
  58. #print img_url
  59. self.save(img_url)
  60. else:
  61. return   #返回空,上面的html爬取函数就跳过了,我没获取每个页面的最大页面,用了个吉利数字38封底
  62. def save(self, img_url):#这个函数存图片了
  63.         name = img_url[-8:-4]
  64. # print name,img_url
  65. try:
  66.             img = self.request(img_url)
  67.             f = open(name + '.jpg', 'ab')  #这里是存图了,打开一个,并且图片这类文件用'b'二进制模式存取
  68.             f.write(img.content)
  69.             f.close()
  70. #print name,'保存成功'
  71. except IOError:  ##捕获异常,继续往下走
  72. print  u'图片不存在已跳过:', img_url
  73. return False
  74. def mkdir(self, path):  ##这个函数创建文件夹,知识点就在代码里,不需要说明,看不懂的地方直接百度
  75.         path = path.strip()
  76.         isExists = os.path.exists(os.path.join("D:\All_img", path))
  77. if not isExists:
  78. os.mkdir(os.path.join("D:\All_img", path))
  79. print u'建了一个名字叫做', path, u'的文件夹!'
  80. os.chdir(os.path.join("D:\All_img", path))  ##切换到目录
  81. return True
  82. else:
  83. print u'名字叫做', path, u'的文件夹已经存在了!'
  84. return False
  85. def requestpic(self, url, Referer):  ##这个函数获取网页的response 然后返回
  86.         user_agent_list = [ \
  87.             "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1" \
  88.             "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11", \
  89.             "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6", \
  90.             "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6", \
  91.             "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1", \
  92.             "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5", \
  93.             "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5", \
  94.             "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3", \
  95.             "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3", \
  96.             "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", \
  97.             "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3", \
  98.             "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3", \
  99.             "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3", \
  100.             "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3", \
  101.             "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3", \
  102.             "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3", \
  103.             "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24", \
  104.             "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
  105.         ]
  106. #上面这一堆是为了模拟文件头,,,多搞几个身份伪装总是好的
  107. #   print Referer
  108.         ua = random.choice(user_agent_list)
  109.         headers = {'User-Agent': ua, "Referer": Referer}
  110. ##较之前版本获取图片关键参数在这里,就referer这个东西,他是传输过程用来记录来访页面的
  111.         content = requests.get(url ,headers=headers).content.decode()
  112. #   print content
  113. return content
  114. ##这里用try语句是为了防止命令行出错时直接关闭退出
  115. try:
  116. print u'作者:COOLMIN'
  117. print u'时间:20171210'
  118. print u'版本:1.0测试版--刚学完强行打包测试版本'
  119. print u'PXX:有错肯定是代码没优化好,93654539放这里了,源码也共享了,供学习交流,请注明出处'
  120. print '-------------------------------------------------------------------------------'
  121. if not os.path.exists("D:\All_img"):
  122. os.mkdir("D:\All_img") #建立一个总文件夹
  123. print u'总文件夹在:D:\All_img'
  124.     Mzitu = mzitu() #实例化
  125.     Mzitu.all_url() #调用这个all_url函数
  126. print u'恭喜您下载完成啦!'
  127. except:
  128. print "Unexpected error:", sys.exc_info() # sys.exc_info()返回出错信息
  129. 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个站就可以开始考虑玩大数据了,以上...其他源码会在陆续放出交流学习

 

文章以及程序转载请注明出处,尊重原创,谢谢,,,学习的过程有什么疑问也可以随时留言交流...

HeyBy

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:9   其中:访客  6   博主  3

    • avatar 匿名 3

      动态url怎么获得的

        • avatar heyby 博主

          @匿名 f12看network里面的doc,xhr等文件找出来啊,看浏览器的发送请求,根据经验找。

        • avatar 里维斯社 1

          这个厉害,不过很多图片抓取工具都有这样的功能,博主动手能力很强哦

          • avatar 促美优品 0

            这样的博客让人禁不住一天来几次!

            • avatar xiaomo 3

              哇,黑白居然会python了,什么时候教教我,啊啊啊{{|└(>o<)┘|}}

              • avatar 中青看点 0

                这样精彩的博客越来越少咯!

                • avatar 中医秘方 1

                  一言不发岂能证明我来过了?!