[Python]爬取mzitu网站

  1 import io
  2 import os
  3 import re
  4 import sys
  5 import datetime
  6 from bs4 import BeautifulSoup
  7 from pxydowwload import request
  8 from pymongo import MongoClient
  9 
 10 sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
 11 
 12 
 13 class mzitu():
 14     def __init__(self):
 15         client = MongoClient('192.168.200.11', 27017)
 16         db = client["mzitulg"]
 17         self.mzitu_collection = db["mzitulg"]
 18         self.title = ''
 19         self.url = ''
 20         self.img_urls = []  # 初始化一个 列表 用来保存图片地址
 21 
 22     def all_url(self, url):
 23         html = request.get_agent(url, 3)
 24         # html = self.request(url)  # 调用request函数把套图地址传进去会返回给我们一个response
 25         all_a = BeautifulSoup(html.text, 'lxml').find(
 26             'div', class_='postlist').find_all('a')[0:47]
 27         # print(len(all_a))
 28         for i in range(1, len(all_a) - 1, 2):
 29             a = all_a[i]
 30             title = a.get_text()
 31             self.title = title
 32             print(u'开始保存:', title)  # 加点提示不然太枯燥了
 33             # 我注意到有个标题带有 ?  这个符号Windows系统是不能创建文件夹的所以要替换掉
 34             path = str(title).replace("?", '_')
 35             self.mkdir(path)  # 调用mkdir函数创建文件夹!这儿path代表的是标题title哦!!!!!不要糊涂了哦!
 36             #os.chdir("/Users/ang/Pictures/mzitu.com/" + path)
 37             href = a['href']
 38             # 调用html函数把href参数传递过去!href是啥还记的吧? 就是套图的地址哦!!不要迷糊了哦!
 39             self.url = href  # 将页面地址保存到self.url中
 40             if self.mzitu_collection.find_one({'主题页面地址': href}):
 41                 print(u'这个页面已经爬取过!')
 42             else:
 43                 self.html(href)
 44 
 45     def html(self, href):  # 这个函数是处理套图地址获得图片的页面地址
 46         html = request.get_agent(href, 3)
 47         #html = self.request(href)
 48         max_span = BeautifulSoup(html.text, 'lxml').find_all('span')[
 49             8].get_text()
 50         page_num = 0
 51         for page in range(1, int(max_span) + 1):
 52             page_num += 1
 53             page_url = href + '/' + str(page)
 54             # 调用img函数,把上面我们我们需要的两个变量,传递给下一个函数。
 55             self.img(page_url, max_span, page_num)
 56 
 57     def img(self, page_url, max_span, page_num):  # 这个函数处理图片页面地址获得图片的实际地址
 58         img_html = request.get_agent(page_url, 3)
 59         #img_html = self.request(page_url)
 60         img_url = BeautifulSoup(img_html.text, 'lxml').find(
 61             'div', class_='main-image').find('img')['src']
 62         self.save(img_url)
 63         self.img_urls.append(img_url)
 64 
 65         if int(max_span) == page_num:
 66             self.save(img_url)
 67             post = {  # 这是构造一个字典,里面有啥都是中文,很好理解吧!
 68                 '主题页面标题': self.title,
 69                 '主题页面地址': self.url,
 70                 '主题图片地址': self.img_urls,
 71                 '主题获取时间': datetime.datetime.now()
 72             }
 73             self.mzitu_collection.save(post)
 74             print(u'插入数据库成功!')
 75         else:
 76             self.save(img_url)
 77 
 78     def save(self, img_url):  # 这个函数保存图片
 79         name = img_url[-9:-4]
 80         print(u'开始保存:', img_url)
 81         img = request.get_agent(img_url, 3)
 82         #img = self.request(img_url)
 83         fp = open(name + '.jpg', 'ab')
 84         fp.write(img.content)
 85         fp.close()
 86 
 87     def mkdir(self, path):  # 这个函数创建文件夹
 88         path = path.strip()
 89         isExists = os.path.exists(os.path.join(
 90             "/Users/ang/Pictures/mzitu.com", path))
 91         if not isExists:
 92             print(u'建了一个名字叫做', path, u'的文件夹!')
 93             os.makedirs(os.path.join(
 94                 "/Users/ang/Pictures/mzitu.com", path))
 95             os.chdir(os.path.join("/Users/ang/Pictures/mzitu.com", path))
 96             # # 切换到目录
 97             return True
 98         else:
 99             print(u'名字叫做', path, u'的文件夹已经存在了!')
100             os.chdir(os.path.join("/Users/ang/Pictures/mzitu.com", path))
101             return False
102 
103     """
104     def request(self, url):  # 这个函数获取网页的response 然后返回
105         headers = {
106             'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}
107         content = requests.get(url, headers=headers)
108         return content
109     """
110 
111 
112 Mzitu = mzitu()  # 实例化
113 # 给函数all_url传入参数  你可以当作启动爬虫(就是入口)
114 Mzitu.all_url('http://www.mzitu.com/xinggan')

猜你喜欢

转载自www.cnblogs.com/Start12/p/9342126.html