python爬取小草网站,根据关键字,下载所需图片至本地。根据关键字分类,命名。记录多个实用的爬虫通用方法

1 篇文章 0 订阅
1 篇文章 0 订阅

python爬取小草网站,根据关键字,下载所需图片至本地。根据关键字分类,命名。

  1. 先爬取所需栏目下全部标题,和对应的路径,根据所需关键字进行筛选。
  2. 满足筛选条件的,则根据对应的路径,去爬取路径下的图片。
  • 根据路径,下载图片的方法.[通用]
def download_img(self, img_url, src, fileName):
        try:
            if not os.path.exists(src):
                os.makedirs(src)
            if not os.path.exists(src + fileName):
                header = {'user-agent': 'Mozilla/5.0'}
                r = requests.get(img_url, headers=header, stream=True)
                if r.status_code == 200:
                    open(src + fileName, 'wb').write(r.content)  # 将内容写入图片
                    print(src + fileName + "下载成功")
                    self.info_list.append(src + fileName)
                del r
        except Exception:
            print("下载出错:" + str(Exception))
            print("url" + img_url + ",file:" + src + fileName)
  • 获取页面内容[通用]
	# 获取url网页内容
    def getHTMLText(self, url):
        try:
            kv = {'user-agent': 'Mozilla/5.0'}
            r = requests.get(url, timeout=30, headers=kv)
            r.raise_for_status()
            r.encoding = r.apparent_encoding
            # print(r.encoding)
            return r.text
        except Exception as e:
            print(url + '页面获取出错:' + str(e))
            return ''
  • 解析栏目页面,获取标题和其对应的url,存入数组
	def parseHTML(self, html):
        ls = []
        try:
            soup = BeautifulSoup(html, 'html.parser')
            alltr = soup.find_all('tr', 'tr3 t_one tac')
            for tr in alltr:
                h3 = tr.find('h3')
                pageUrl = h3.find('a').get('href')
                name = h3.string.strip()
                if("P]" in name):
                    ls.append([name, pageUrl])
            return ls
        except Exception as e:
            print('页面解析出错:' + str(e))
            pass
  • 获取页面详情中的全部图片。
	def formatHTMLInfo(self, html, src):
        try:
            soup = BeautifulSoup(html, 'html.parser')
            div = soup.find('div', 'tpc_content do_not_catch')
            # div = soup.find('div', 'tpc_cont')
            imgs = div.find_all('img')
            i = 1
            if not os.path.exists(src):
                os.makedirs(src)
            for img in imgs:
                # tail = img.get('ess-data')[-4:]		# 最开始想用切片,获取后四位,但某些高清图片后缀为.webp,还是老老实实分割好了
                tail = os.path.splitext(img.get('ess-data'))[-1]	# 获取文件后缀名 如:.jpg .gif
                idx = ''	# 生成文件计数,并根据计数生成文件名
                if i < 10:
                    idx += '00' + str(i)
                elif i < 100:
                    idx += '0' + str(i)
                else:
                    idx += str(i)
                self.download_img(img.get('ess-data'), src + '\\', idx + tail)
                i += 1
        except Exception as e:
            print('页面解析出错:' + str(e))
            pass
  • 主函数主要逻辑
	depth = 100
	dict = {}	# dict,key为分类,val为属于该分类下所需的关键词
	dict['颜色'] = ['红','橙', '黄', '绿']
	dict['学生'] = ['小学', '初中', '高中', '大学', '学生']
	### 全局搜索
    for i in range(depth):
        url = basic_url + str(i+1)
        html = Spyder.getHTMLText(url)
        temp_list = Spyder.formatHTML(html)
        prefix = 'https://分享你我光圈下的最美'
        # print(temp_list)
        for page in temp_list:	# 遍历当前页下全部的标题
            for key in dict:	# 获取分类
                vList = dict[key]
                for v in vList:			# 获取需要匹配的关键词
                    if v in page[0]:	# 用标题和关键字做匹配
                        flag = 2		# 获取两遍,避免网络问题,导致页面获取/图片获取失败,导致漏跑
                        while flag > 0:
                            InfoUrl = prefix + page[1]	# 拼接生成详情页url
                            print('当前页码:' + str(i) + ',分类:' + v + ',' + page[0] + InfoUrl)
                            htmlInfo = Spyder.getHTMLText(InfoUrl)	# 获取详情页信息
                            Spyder.formatHTMLInfo(htmlInfo, Spyder.src + key + '\\' + page[0])
                            time.sleep(3)				# sleep,避免访问过于频繁,导致拒绝访问
                            flag -= 1
  • 捎带记录几个常用的爬虫方法
  1. 存储获取到的页面信息至本地
	def writeHTML(path, txt):	# path为本地路径,txt为获取到的页面文本
        f = open(path, 'w+', encoding='utf-8')
        f.write(txt)
        f.close()
  1. 读取路径下的页面为文本 [一读一写,便于前期分析要爬取的目标页面]
	def readHTML(path):
        f = open(path, 'r', encoding='utf-8')
        txt = f.read()
        f.close()
        return txt
  1. 将新增的文件存入数组,根据数组,讲新增的文件自动拷贝一份到目标路径。
  • 好比每天爬取一次,之前爬到的东西存到了a,第二天再爬,本地有a就不下载了,但新增了b
  • 这样本地会先下载下来b,然后将b的本地路径加入info_list
  • 跑批完成后,会将info_list中的文件,拷贝一份到to_url的路径下
# 根据info_list中的图片,拷贝出新增图片
    def bk_newImg(self):
        for img_url in self.info_list:
            to_url = self.newimg_src + img_url[len(self.src):]
            to_parUrl = os.path.dirname(to_url)
            if not os.path.exists(to_parUrl):
                os.makedirs(to_parUrl)
            shutil.copyfile(img_url,to_url)
            print('新下载图片:' + to_url)
        self.info_list.clear()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值