實戰:如何通過python requests庫寫一個抓取小網站圖片的小爬蟲

船長_wang發表於2020-01-25

有點愛好的你,偶爾應該會看點圖片文字,最近小網站經常崩潰消失,不如想一個辦法本地化吧,把小照片珍藏起來!
首先,準備一個珍藏的小網站,然後就可以開始啦!

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()))

看完文章覺得不錯就點贊加個關注吧
。。。。。

相關文章