参考网站:https://blog.csdn.net/Young_Child/article/details/78571422
在爬的过程中遇到的问题:
1、被ban:更改header的User-Agent,伪装成浏览器浏览,如果还被ban可以使用代理,这个网站只需要伪装头再加上time.sleep()就可以解决了(我导入了fake_useragent,也可以自己造个轮子,我比较懒,直接用了别人的轮子)
2、下载下来的图片是同一张,全是防盗链图片这个问题我也找了好久,结果发现只要在头里加上’Referer’就可以了
HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。——百度百科
3. 此代码需要在在linux的python2下运行,在windows下会出现异常。
完整代码如下
1 #!/usr/bin/evn python 2 # -*- coding:utf-8 -*- 3 # __author__: 4 #import urllib2 5 import bs4 6 import time 7 import requests 8 import fake_useragent 9 import os 10 import re 11 import sys 12 #import xlrd 13 import random 14 15 # 用于将u 转换成 string 16 reload(sys) 17 sys.setdefaultencoding('utf-8') # u -> str 18 19 20 class GetPictures(object): 21 def __init__(self): 22 self.url = 'http://www.mmjpg.com/mm/1' 23 self.first_num = 0 24 self.sum_num = 0 25 self.pictures_sum() 26 self.urls = self.get_urls() 27 for url in self.urls: 28 self.down_pictures(self.get_img_urls(url)) 29 30 # 输入需要的套数 31 def pictures_sum(self): 32 str1 = raw_input(r"第几套开始,重复会跳过") 33 try: 34 self.first_num = int(float(str1)) 35 except ValueError: 36 print ('输入的不为数字') 37 38 str1 = raw_input("收集多少套") 39 try: 40 self.sum_num = int(float(str1)) 41 except ValueError: 42 print("输入的不为数字") 43 exit(1) 44 45 # 得到所有套图的第一张所在网页的URL 46 def get_urls(self): 47 urls = [] 48 for i in xrange(self.first_num, self.first_num+self.sum_num): 49 url_split = self.url.split('/') 50 url_split[-1] = str(i) 51 urls.append('/'.join(url_split)) 52 # print urls 53 return urls 54 55 # 得到一共有多少张图 56 def get_img_sum_num(self, img_url): 57 fa = fake_useragent.UserAgent() 58 headers = {'User-Agent': fa.random, 59 'Referer': 'http://www.mmjpg.com'} 60 request = requests.get(img_url, headers=headers) 61 soup = bs4.BeautifulSoup(request.content, 'lxml') 62 # 获取标签里面的值 63 img_sum_number = soup.find_all('a', href=re.compile('/mm'))[8].get_text().strip() 64 print img_sum_number 65 img_sum_number = int(img_sum_number) 66 # print img_sum_number 67 return img_sum_number 68 69 # 得到该套图中的所有图片的URL 70 def get_img_urls(self, url): 71 fa = fake_useragent.UserAgent() 72 headers = {'User-Agent': fa.random, 73 'Referer': 'http://m.mmjpg.com'} 74 request = requests.get(url, headers=headers) 75 soup = bs4.BeautifulSoup(request.content, 'lxml') 76 first_img_url = soup.find('img').get('src') # 获取标签值 77 url_split = first_img_url.split('/') 78 img_urls = [] 79 for i in xrange(1, self.get_img_sum_num(url)+1): 80 url_split[-1] = (str(i)+'.jpg') 81 img_urls.append('/'.join(url_split)) 82 # print img_urls 83 return img_urls 84 85 # 下载图片 86 def down_pictures(self, img_urls): 87 img_name = str(img_urls[0].split('/')[-2])+'-'+str(img_urls[0].split('/')[-3]) 88 if os.path.exists(img_name): # 查重 如果这个文件夹存在则跳过 防止重复下载 89 time.sleep(1) 90 print img_name+'存在' 91 return 92 os.mkdir(img_name) 93 for img_url in img_urls: 94 fa = fake_useragent.UserAgent() 95 headers = {'User-Agent': fa.random, 96 'Referer': 'http://m.mmjpg.com'} 97 request = requests.get(img_url, headers=headers) 98 99 with open(img_name + u'/' + img_url.split('/')[-1], 'wb') as f: 100 f.write(request.content) # contents返回的为二进制 text返回的为union类型 101 f.close() 102 print "已保存" + img_name + '/' + img_url.split('/')[-1] 103 time.sleep(random.random()*2) 104 105 106 # 运行程序 107 if __name__ == '__main__': 108 GetPictures() 109 110 ''' 111 用requests,bs4 抓取mmjpg.com上的套图 112 将上面的套图按套进行保存 113 '''