|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 chenxz186 于 2018-6-14 07:05 编辑
很久没发过帖了,今日要发的帖是爬虫,本人在玩爬虫时对美女的图片特别热衷,所以今天的帖以美女为主题。这里用到的模块是requests, re, os, bs4,发布两个程序,第一个程序以requests, re, os爬取,另一个程序是以requests,bs4, os爬取,两者爬取内容是一样的,主要为了说明不懂得re正则表达式的朋友,不要怕,还可以用bs4的一些功能替代,好了,废话不多说,上代码吧。
第一个程序是以requests, re, os爬取:
- import requests
- import re
- import os
- def string_split_join(img):
- '''对每张图片的进行去除斜杠处理'''
- img_split = (img.split('/uploads/')[1]).split('/', 3)
- img_join = '-'.join(img_split)
- return img_join
- def url_open(url):
- '''将每个url用requests模块打开获取响应'''
- headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
- 'Chrome/63.0.3239.132 Safari/537.36 QIHU 360EE'}
- res = requests.get(url, headers=headers)
- res.encoding = 'gbk'
- return res
- def file_func(folder='MM'):
- '''生成文件夹'''
- os.mkdir(folder)
- os.chdir(folder)
- file = os.getcwd()
- return file
- def main():
- # 在http://www.meizitu.com网站中在一定范围内筛选图片,那么就来一个大循环a/1.html到a/6000.html之间
- min_wide = int(input('请输入你想爬到的范围最小值:'))
- max_wide = int(input('请输入你想爬到的范围最高值:'))
- # 生成文件夹
- file = file_func()
- filename = file
- while min_wide <= max_wide:
- url = 'http://www.meizitu.com/a/%s.html' % str(min_wide)
- res = url_open(url)
- p = r'src="([^"]+\.jpg)"'
- img_addrs = re.findall(p, res.text)
- print(filename)
- for each in img_addrs:
- if '/uploads/' in each:
- res_img = url_open(each)
- filename += '/' + string_split_join(each)
- with open(filename, 'wb') as f:
- f.write(res_img.content)
- filename = file
- min_wide += 1
- if __name__ == '__main__':
- main()
复制代码
第二个程序是以requests, bs4, os爬取:
- import requests
- import bs4
- import os
- def download_img(soup, file):
- """查找图片,并下载下来"""
- filename = file
- img_tag = soup.find_all('img')
- for each in img_tag:
- if 'limg.jpg' not in each['src'] and 'erweima.jpg' not in each['src']:
- each_url = each['src']
- res_img = open_url(each_url)
- filename += '/' + string_split_join(each_url)
- with open(filename, 'wb') as f:
- f.write(res_img.content)
- filename = file
- def string_split_join(img):
- """对每张图片的进行去除斜杠处理"""
- img_split = (img.split('/uploads/')[1]).split('/', 3)
- img_join = '-'.join(img_split)
- return img_join
- def cooking_soup(res):
- """将响应的网页用bs4内的BeautifulSoup渲染一趟,我在此将函数命名为cooking_soup,意为煮汤,哈哈"""
- soup = bs4.BeautifulSoup(res.text, 'html.parser')
- return soup
- def open_url(url):
- """将每个url用requests模块打开获取响应"""
- headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
- 'Chrome/63.0.3239.132 Safari/537.36 QIHU 360EE'}
- res = requests.get(url, headers=headers)
- res.encoding = 'gbk'
- return res
- def file_func(folder='MM'):
- """生成文件夹"""
- os.mkdir(folder)
- os.chdir(folder)
- file = os.getcwd()
- return file
- def main():
- # 在http://www.meizitu.com网站中在一定范围内筛选图片,那么就来一个大循环a/1.html到a/6000.html之间
- min_wide = int(input('请输入你想爬到的范围最小值:'))
- max_wide = int(input('请输入你想爬到的范围最高值:'))
- file = file_func()
- while min_wide <= max_wide:
- url = 'http://www.meizitu.com/a/%s.html' % str(min_wide)
- res = open_url(url)
- if res.status_code == 200:
- soup = cooking_soup(res)
- download_img(soup, file)
- else:
- print('%s不能正常响应,或许不存在此网' % url)
- min_wide += 1
- if __name__ == '__main__':
- main()
复制代码
这两个程序的目的是一样的,就是代码改变了一下以及用的模块有些不同,不过两个程序,还可以再改善得更好些,我没有花精力在上面,毕竟小程序,随手编来玩玩而已,以后会发更多自己认为更完美的程序上来。如果我花精力改善以上两个程序,我又会沉入不断改程序的死循环的旧毛病中,在我内心深处一直认为自己编的任何程序总感觉不够完美,要不断改善,我曾试过将一个小小的金融期权保证金计算器修改了几十遍,竟然出现了20多个版本,其实任何一个版本都满足我的需求的,但就是觉得它不完美,达不到心中所需,在我心中,它们依然是次品。在此,希望观看过此文的朋友们会帮忙改善下,将你们不同的版本发在评论内,彼此交流学习下。
(代码除了上面显示的外,我也另打包放上去了,有兴趣的朋友下来看看,顺便帮忙改造下。)
|
|