用Python爬取图片网站——基于BS4+多线程的处理
admin
2023-07-31 00:44:23
0

我有一个朋友,喜欢在一个图站看图(xie)片(zhen),光看就算了,他还有收集癖,想把网站的所有图片都下载下来,于是找我帮忙。
本业余玩家经过【好久的】研究,终于实现,写成本教程。本人经济学专业,编程纯属玩票,不足之处请指出,勿喷,谢谢。
本文分两部分:第一部分是基础方法,也就是单线程下爬图片的流程;第二部分是使用了多线程的功能,大大提高了爬取的效率。

前言

本次爬取基于的是BeautifulSoup+urllib/urllib2模块,Python另一个高效的爬虫模块叫Scrapy,但是我至今没研究懂,因此暂时不用。

基础流程

说明

此次爬取,在输入端仅需要一个初始网址(为避免彼网站找我麻烦,就以URL代替),以及文件保存路径(为保护我隐私,以PATH代替),大家在阅读代码时敬请注意。
从该网站下载图片以及文件处理有如下几步:【我要是会画流程图就好了】
1.打开网站首页,获得总页数,获得每个专辑的链接;
2.点进某专辑,获得专辑的标题作为保存的文件夹名,并获得该专辑的页数;
3.获取每个图片的链接
4.下载图片,以网站上图片的文件名保存至本地,同时对应第2步的文件夹。

代码和解释

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 # -*- coding: utf-8 -*-\”\”\”@author: Adam\”\”\” import urllib2, urllib, osfrom bs4 import BeautifulSoup root = PATHurl = URLreq = urllib2.Request(url)content = urllib2.urlopen(req).read()soup = BeautifulSoup(content, \”lxml\”)page = soup.find_all(\’a\’)pagenum1 = page[3].get_text()  #注1 for i in range(0, int(pagenum1) + 1):    if i == 0:        url1 = URL    else:        url1 = URL + str(i+1) + \”.html\”  #注2    req1 = urllib2.Request(url1)    #    #print url    content1 = urllib2.urlopen(req1).read()    soup1 = BeautifulSoup(content1, \”lxml\”)    table = soup1.find_all(\’td\’)    title = soup1.find_all(\’div\’, class_ = \’title\’)  #注3     #print title    for j in range(1, 19):        folder = title[j1].get_text()        folder = folder.replace(\’\\\\\\\\n\’, \’\’) #注4        curl=table[j].a[\’href\’]  #注5        purl = URL+curl        #Second Page        preq = urllib2.Request(purl)        pcontent = urllib2.urlopen(preq).read()        psoup = BeautifulSoup(pcontent, \”lxml\”)        page2 = psoup.find_all(\’a\’)        pagenum2 = page2[4].get_text()        if not os.path.exists(root + folder):            os.mkdir(root + folder)        else:            os.chdir(root + folder)            #print folder        for t in range(1, int(pagenum2) + 1):            if t == 1:                purl1 = purl            else:                purl1 = purl[:5] + \’-\’ + str(t) + \’.html\’            preq2 = urllib2.Request(purl1)            pcontent2 = urllib2.urlopen(preq2).read()            psoup2 = BeautifulSoup(pcontent2, \”lxml\”)            picbox = psoup2.find_all(\’div\’, class_ = \’pic_box\’)  #注6            for k in rangeass=\”crayon-h\”>  #注6            for k in range法,也就是单线程下爬图片的流程;第二部分是使用了多线程的功能,大大提高了爬取的效率。

前言

本次爬取基于的是BeautifulSoup+urllib/urllib2模块,Python另一个高效的爬虫模块叫Scrapy,但是我至今没研究懂,因此暂时不用。

基础流程

说明

此次爬取,在输入端仅需要一个初始网址(为避免彼网站找我麻烦,就以URL代替),以及文件保存路径(为保护我隐私,以PATH代替),大家在阅读代码时敬请注意。
从该网站下载图片以及文件处理有如下几步:【我要是会画流程图就好了】
1.打开网站首页,获得总页数,获得每个专辑的链接;
2.点进某专辑,获得专辑的标题作为保存的文件夹名,并获得该专辑的页数;
3.获取每个图片的链接
4.下载图片,以网站上图片的文件名保存至本地,同时对应第2步的文件夹。

代码和解释

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 # -*- coding: utf-8 -*-\”\”\”@author: Adam\”\”\” import urllib2, urllib, osfrom bs4 import BeautifulSoup root = PATHurl = URLreq = urllib2.Request(url)content = urllib2.urlopen(req).read()soup = BeautifulSoup(content, \”lxml\”)page = soup.find_all(\’a\’)pagenum1 = page[3].get_text()  #注1 for i in range(0, int(pagenum1) + 1):    if i == 0:        url1 = URL    else:        url1 = URL + str(i+1) + \”.html\”  #注2    req1 = urllib2.Request(url1)    #    #print url    content1 = urllib2.urlopen(req1).read()    soup1 = BeautifulSoup(content1, \”lxml\”)    table = soup1.find_all(\’td\’)    title = soup1.find_all(\’div\’, class_ = \’title\’)  #注3     #print title    for j in range(1, 19):        folder = title[j1].get_text()        folder = folder.replace(\’\\\\\\\\n\’, \’\’) #注4        curl=table[j].a[\’href\’]  #注5        purl = URL+curl        #Second Page        preq = urllib2.Request(purl)        pcontent = urllib2.urlopen(preq).read()        psoup = BeautifulSoup(pcontent, \”lxml\”)        page2 = psoup.find_all(\’a\’)        pagenum2 = page2[4].get_text()        if not os.path.exists(root + folder):            os.mkdir(root + folder)        else:            os.chdir(root + folder)            #print folder        for t in range(1, int(pagenum2) + 1):            if t == 1:                purl1 = purl            else:                purl1 = purl[:5] + \’-\’ + str(t) + \’.html\’            preq2 = urllib2.Request(purl1)            pcontent2 = urllib2.urlopen(preq2).read()            psoup2 = BeautifulSoup(pcontent2, \”lxml\”)            picbox = psoup2.find_all(\’div\’, class_ = \’pic_box\’)  #注6            for k

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...