您的位置:首页 > 编程语言 > Python开发

python:使用requests,bs4爬取mmjpg上的图片

2017-11-18 21:31 246 查看
这是我的第一个爬虫,选择爬这个网站是因为,他URL特别有规律,不是因为他的图片,不是因为图片,不是。。。

首先他每套图的第一张地址如下

http://www.mmjpg.com/mm/1

图片的地址如下

http://img.mmjpg.com/2015/1/1.jpg

图片的地址的URL里面有年份,因为不知道那些图片是哪一年发的,所以不方便把所有的图片都爬下来

因此我从套图的地址中找到第一张图片的图片地址

然后将图片名每次加一,直到最后一张(可以从套图的地址中找到一共有多少张)

# 得到一共有多少张图
def get_img_sum_num(self, img_url):
fa = fake_useragent.UserAgent()
headers = {'User-Agent': fa.random,
'Referer': 'http://www.mmjpg.com'}
request = requests.get(img_url, headers=headers)
soup = bs4.BeautifulSoup(request.content, 'lxml')
# 获取标签里面的值
img_sum_number = soup.find_all('a', href=re.compile('/mm'))[8].get_text().strip()
print img_sum_number
img_sum_number = int(img_sum_number)
# print img_sum_number
return img_sum_number

# 得到该套图中的所有图片的URL
def get_img_urls(self, url):
fa = fake_useragent.UserAgent()
headers = {'User-Agent': fa.random,
'Referer': 'http://m.mmjpg.com'}
request = requests.get(url, headers=headers)
soup = bs4.BeautifulSoup(request.content, 'lxml')
first_img_url = soup.find('img').get('src')     # 获取标签值
url_split = first_img_url.split('/')
img_urls = []
for i in xrange(1, self.get_img_sum_num(url)+1):
url_split[-1] = (str(i)+'.jpg')
img_urls.append('/'.join(url_split))
# print img_urls
return img_urls


根据图片的URL下载图片

def down_pictures(self, img_urls):
img_name = str(img_urls[0].split('/')[-2])+'-'+str(img_urls[0].split('/')[-3])
if os.path.exists(img_name):    # 查重 如果这个文件夹存在则跳过 防止重复下载
time.sleep(1)
print img_name+'存在'
return
os.mkdir(img_name)
for img_url in img_urls:
fa = fake_useragent.UserAgent()
headers = {'User-Agent': fa.random,
'Referer': 'http://m.mmjpg.com'}
request = requests.get(img_url, headers=headers)

with open(img_name + u'/' + img_url.split('/')[-1], 'wb') as f:
f.write(request.content)    # contents返回的为二进制   text返回的为union类型
f.close()
print "已保存" + img_name + '/' + img_url.split('/')[-1]
time.sleep(random.random()*2)


在爬的过程中遇到的问题:

1、被ban:更改header的User-Agent,伪装成浏览器浏览,如果还被ban可以使用代理,这个网站只需要伪装头再加上time.sleep()就可以解决了(我导入了fake_useragent,也可以自己造个轮子,我比较懒,直接用了别人的轮子)

2、下载下来的图片是同一张,全是防盗链图片这个问题我也找了好久,结果发现只要在头里加上’Referer’就可以了

HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。——百度百科

全部代码:https://github.com/YoungChild/mmjpg_python
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 爬虫