实战:如何通过python requests库写一个抓取小网站图片的小爬虫

有点爱好的你,偶尔应该会看点图片文字,最近小网站经常崩溃消失,不如想一个办法本地化吧,把小照片珍藏起来!
首先,准备一个珍藏的小网站,然后就可以开始啦!

vx:13237066568
QQ:672377334

进群口令1(添加好友时填写或通过后回复):爬虫
进群口令2(添加好友时填写或通过后回复):csdn

好了,正题开始

第一步

我们先写一个获取网站的url的链接,因为url常常是由page或者,其他元素构成,我们就把他分离出来,我找到的网站主页下有图片栏目,图片栏目内有标题页,一个标题里有10张照片大概
所以步骤是:
第一步:进入图片栏目的标题页,图片栏目的标题页
规律为第一页:www.xxxx…/tp.html
第二页:www.xxxx…/tp-2.html
第三页:www.xxxx…/tp-3.html

def  getHTML(pages):
    for i in range(1,pages+1):
        url = 'https://'
        if i>1:
            url=url+'-'+str(i)+'.html'
            print('------正在下载第%d页的图片!------'%(i))
            htmlTex(url)
        else:
            url=url+'.html'
            print('------正在下载第%d页的图片!------'%(i))
            htmlTex(url)

第二步

上面我们已经拿到我们的链接了,这个链接是每一个换页面的链接,我们要从换页链接里头获取进入标题的链接,标题里有各种图片,我们用xpath 获取标题链接路径待会

所以我们给url 伪装一下header,我这里选择伪装的手机浏览

headers = {
        'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Mobile Safari/537.36'
    }

,然后requests.get(url, headers=headers)获取页面 text内容
传给下一个函数用来抓取进入标题的链接

def htmlTex(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Mobile Safari/537.36'
    }
    r = requests.get(url, headers=headers)
    r.encoding = 'utf8'
    htmlTXT = r.text
    getLinks(htmlTXT)

第三步

getLinks函数拿到解析代码,根据xpath路径获取指定的标题链接,
再次requests该标题链接,就可以获取标题里头的图片所在页面的text文本传给 getPicLINK 函数

def getLinks(txt):
    global name
    content = txt
    content = content.replace('<!--', '').replace('-->', '')
    LISTtree = html.etree.HTML(content)
    links=LISTtree.xpath('//div[@class="text-list-html"]/div/ul/li/a/@href')
    for link in links:
        name=link[link.rfind('/')+1:link.rfind('.')]
        url='https:'+link
        try:
            headers = {
                'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Mobile Safari/537.36'
            }
            r = requests.get(url, headers=headers)
            r.encoding = 'utf8'
            # print(r.text)
            htmlTXT = r.text
            getPicLINK(htmlTXT)

getPicLINK 收到图片地址文本,用xpath获取图片地址,然后下载

def getPicLINK(txt):

    global url
    content=txt
    content=content.replace('<!--','').replace('-->','')
    LISTtree=html.etree.HTML(content)
    link_list1=LISTtree.xpath('//main/div[@class="content"]/img[@class="videopic lazy"]/@data-original')
    for link in link_list1:
        try:
         history(link)

        except Exception as e:
            with open("errorLog.txt", "a+", encoding="utf8") as f1:
                f1.write(getNowTime() + "-- " + traceback.format_exc() + '\n')
                print(getNowTime() + "-- " + traceback.format_exc() + '\n')
            print("piclink出错正在跳过")
            continue

其中 history函数用于判断图片是否已存在,原理是在每次下载时存入图片名字到txt中,下载前读取txt内图片名字判断图片是否存在

def history(link):
    global picnamelist
    global name
    link=link
    pic_name = name + link[link.rfind('/') + 1:]
    path_name = 'pics2/' + pic_name
    with open('pics2/history.txt','a+',encoding='utf8') as f:
        f.seek(0,0)
        picnamelist=f.readlines()
        if pic_name+'\n' not in picnamelist:
            f.writelines(pic_name+'\n')
            download_img(link,path_name)
            return
        else:
            print('图片%s已存在,已跳过!'%(pic_name))
            pass

下载函数:

picCount=0
def download_img(link,picName):
    global picCount
    global  picnamelist
    pic_name=picName
    headers = {
        'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Mobile Safari/537.36'
    }

    r = requests.get(link, headers=headers)
    print("正在下载:%s" % (pic_name[pic_name.rfind('/')+1:]))
    with open(pic_name,'wb',) as f:
        f.write(r.content)
        picCount=picCount+1
        print("第%d张图片下载完成! %s" % (picCount,getNowTime()))

看完文章觉得不错就点赞加个关注吧
。。。。。

发布了70 篇原创文章 · 获赞 14 · 访问量 2639

猜你喜欢

转载自blog.csdn.net/Captain_DUDU/article/details/103047499