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')