鱼C论坛

 找回密码
 立即注册
查看: 2952|回复: 6

[技术交流] 好吧!我也来放一个妹子图的小爬虫,供各位学习了。

[复制链接]
发表于 2017-2-20 19:56:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
刚刚看见有一个妹子图的爬虫,我也把我之前写的一个贴上来:

内容有点多,都有注释,各位小伙伴悠着点看。


下载部分:Download.py

  1. import requests
  2. import re
  3. import random
  4. import time


  5. class download():

  6.     def __init__(self):

  7.         self.iplist = []  ##初始化一个list用来存放我们获取到的IP
  8.         html = requests.get("http://haoip.cc/tiqu.htm")  ##不解释咯
  9.         iplistn = re.findall(r'r/>(.*?)<b', html.text, re.S)  ##表示从html.text中获取所有r/><b中的内容,re.S的意思是包括匹配包括换行符,findall返回的是个list哦!
  10.         for ip in iplistn:
  11.             i = re.sub('\n', '', ip)  ##re.sub 是re模块替换的方法,这儿表示将\n替换为空
  12.             self.iplist.append(i.strip())  ##添加到我们上面初始化的list里面

  13.         self.user_agent_list = [
  14.             "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
  15.             "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
  16.             "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
  17.             "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
  18.             "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
  19.             "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
  20.             "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
  21.             "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
  22.             "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
  23.             "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",
  24.             "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
  25.             "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
  26.             "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
  27.             "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
  28.             "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
  29.             "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
  30.             "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
  31.             "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
  32.         ]

  33.     def get(self, url, timeout, proxy=None, num_retries=6): ##给函数一个默认参数proxy为空
  34.         UA = random.choice(self.user_agent_list) ##从self.user_agent_list中随机取出一个字符串
  35.         headers = {'User-Agent': UA}  ##构造成一个完整的User-Agent (UA代表的是上面随机取出来的字符串哦)

  36.         if proxy == None: ##当代理为空时,不使用代理获取response(别忘了response啥哦!之前说过了!!)
  37.             try:
  38.                 return requests.get(url, headers=headers, timeout=timeout)##这样服务器就会以为我们是真的浏览器了
  39.             except:##如过上面的代码执行报错则执行下面的代码

  40.                 if num_retries > 0: ##num_retries是我们限定的重试次数
  41.                     time.sleep(10) ##延迟十秒
  42.                     print(u'获取网页出错,10S后将获取倒数第:', num_retries, u'次')
  43.                     return self.get(url, timeout, num_retries-1)  ##调用自身 并将次数减1
  44.                 else:
  45.                     print(u'开始使用代理')
  46.                     time.sleep(10)
  47.                     IP = ''.join(str(random.choice(self.iplist)).strip()) ##下面有解释哦
  48.                     proxy = {'http': IP}
  49.                     return self.get(url, timeout, proxy,) ##代理不为空的时候

  50.         else: ##当代理不为空
  51.             try:
  52.                 IP = ''.join(str(random.choice(self.iplist)).strip()) ##将从self.iplist中获取的字符串处理成我们需要的格式(处理了些什么自己看哦,这是基础呢)
  53.                 proxy = {'http': IP} ##构造成一个代理
  54.                 return requests.get(url, headers=headers, proxies=proxy, timeout=timeout) ##使用代理获取response
  55.             except:

  56.                 if num_retries > 0:
  57.                     time.sleep(10)
  58.                     IP = ''.join(str(random.choice(self.iplist)).strip())
  59.                     proxy = {'http': IP}
  60.                     print(u'正在更换代理,10S后将重新获取倒数第', num_retries, u'次')
  61.                     print(u'当前代理是:', proxy)
  62.                     return self.get(url, timeout, proxy, num_retries - 1)
  63.                 else:
  64.                     print(u'代理也不好使了!取消代理')
  65.                     return self.get(url, 3)

  66. request = download()  ##
复制代码




内容提取部分:meizitu.py

  1. from bs4 import BeautifulSoup
  2. import os
  3. from Download import request ##导入模块变了一下
  4. from pymongo import MongoClient

  5. class mzitu():


  6.     def all_url(self, url):

  7.         html = request.get(url, 3) ##这儿更改了一下(是不是发现  self 没见了?)
  8.         all_a = BeautifulSoup(html.text, 'lxml').find('div', class_='all').find_all('a')
  9.         for a in all_a:
  10.             title = a.get_text()
  11.             print(u'开始保存:', title)
  12.             path = str(title).replace("?", '_')
  13.             self.mkdir(path)
  14.             os.chdir("D:\mzitu\"+path)
  15.             href = a['href']
  16.             self.html(href)

  17.     def html(self, href):
  18.         html = request.get(href, 3)##这儿更改了一下(是不是发现  self 没见了?)
  19.         max_span = BeautifulSoup(html.text, 'lxml').find_all('span')[10].get_text()
  20.         for page in range(1, int(max_span) + 1):
  21.             page_url = href + '/' + str(page)
  22.             self.img(page_url)

  23.     def img(self, page_url):
  24.         img_html = request.get(page_url, 3) ##这儿更改了一下(是不是发现  self 没见了?)
  25.         img_url = BeautifulSoup(img_html.text, 'lxml').find('div', class_='main-image').find('img')['src']
  26.         self.save(img_url)

  27.     def save(self, img_url):
  28.         name = img_url[-9:-4]
  29.         print(u'开始保存:', img_url)
  30.         img = request.get(img_url, 3) ##这儿更改了一下(是不是发现  self 没见了?)
  31.         f = open(name + '.jpg', 'ab')
  32.         f.write(img.content)
  33.         f.close()

  34.     def mkdir(self, path):
  35.         path = path.strip()
  36.         isExists = os.path.exists(os.path.join("D:\mzitu", path))
  37.         if not isExists:
  38.             print(u'建了一个名字叫做', path, u'的文件夹!')
  39.             os.makedirs(os.path.join("D:\mzitu", path))
  40.             return True
  41.         else:
  42.             print(u'名字叫做', path, u'的文件夹已经存在了!')
  43.             return False




  44. Mzitu = mzitu() ##实例化
  45. Mzitu.all_url('http://www.mzitu.com/all') ##给函数all_url传入参数  你可以当作启动爬虫(就是入口)
复制代码



使用方法:新建文件夹--按照给出的名字建立py文件---拷贝代码进去--在文件夹建一个__init__.py文件。像下面这样:

QQ截图20161030144544-e1477920240854.png


现在想来还有更好的方法写,也难得改了。

具体的教程点我
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-20 20:14:35 | 显示全部楼层
谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-20 21:03:06 | 显示全部楼层
楼主你是不是写过小白学python
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-20 23:56:15 | 显示全部楼层
吴嘉 发表于 2017-2-20 21:03
楼主你是不是写过小白学python

到是有个编辑叫我写  小白学Python 不过没动静 我也就没理他了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-21 08:25:36 | 显示全部楼层
受教了~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-21 10:50:33 | 显示全部楼层
可以,还没学到这里来,谢谢楼主
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-21 11:40:33 | 显示全部楼层
些的不错,学习了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 01:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表