Pythonでネット画像をキャプチャした経験を共有します


最近Python言語の基礎文法を勉強して、それから牛刀を試して、ネットのピクチャーをつかんで以下が今回のコードです.まず、このコードはまだ粗雑で、もし相手のものが多すぎると自分のパソコンが弱すぎると、メモリが漏れて崩壊するに違いありません.解決策は、ネットワーク接続をつかむ方法をジェネレータ関数に書くことです.そうすれば、そんなにメモリを消費しませんが、今日は遅すぎて、今も代理されているものを加えると、逆に最適化する気持ちがありません.ちなみに、弱い質問ですが、エージェントを設定するには自分でサーバーを買うしかありませんか?
import requests,os
from bs4 import BeautifulSoup
url='http://588ku.com/?h=bd&sem=1'
localdir='E:/book_test/imgs2'
time_out=100
def get_response(url):
    '''      '''
    global links
    req = requests.get(url,timeout=time_out)

    req.close()
    return req.text

def get_tags(text,ta):
    '''       '''
    soup = BeautifulSoup(text, 'lxml')
    tags = soup.select(ta)
    return tags

def find_href(tags,bz):
    '''          '''
    links = []
    for tag in tags:
        link = str(tag[bz])
        if link.startswith('http'):
            links.append(link)
    return list_helper(links)

def list_helper(myli):
    return list(set(myli))
# def printhelp(lists):
#     for l in lists:
#         print(l)
def find_img_links(tex):
    img_tag = get_tags(tex, 'img')
    img_links = []
    for img in img_tag:
        try:
            if img['data-original']:
                img_link = img['data-original']
                if str(img_link).startswith('http'):
                    img_links.append(img_link)
            if img['src']:
                img_link=img['src']
                if str(img_link).startswith('http'):
                    img_links.append(img_link)
        except KeyError:
            print('img link error!',img_link)
    return  list_helper(img_links)

def get_name(lll):
    lists =str(lll).split('/')
    for i in lists:
        if i is None:break
        if str(i).endswith('.jpg!'): return i[:-1]
        if str(i).endswith('.jpg'):return i
        if str(i).endswith('png'):return i


res=get_response(url)
mytag=get_tags(res,'a[href]')
mylinks=find_href(mytag,'href')#         


def circle(mylinks):
    for url in mylinks:
        text = get_response(url)
        new_tag_a = get_tags(text, 'a[href]')
        imglinks = find_img_links(text)
        for imglink in imglinks:
            download(imglink)
        new_a_link = find_href(new_tag_a, 'href')  #                 
        # if new_a_link:circle(new_a_link)#                      ,       ,              GG      。          ,          

def download(imglink):
    content = requests.get(imglink,timeout=time_out)
    name = get_name(imglink)
    try:
        if not os.path.exists(localdir): os.mkdir(localdir)
        os.chdir(localdir)
        if os.path.exists(name):return
        open(name, 'wb').write(content.content)
    except TypeError:print('download error')
    finally:content.close()


# [tests.append(get_response(url))for url in mylinks]

circle(mylinks)


そしてそれを代行して、ゆっくり研究しなければなりません..ところで、出会った問題は...どうせ一度実行すればわかるから、リモートホストが既存の接続を強制的に閉じた.のそして、ダウンロード中にいくつかのエラーが発生し、2つのtryで印刷されました.2,3日してから検討しましょう.思い出してrequestsを更新するのは本当に使いやすくて、bs 4ページは使いやすいです.ただし、サードパーティ製ライブラリを使用したくない場合はxmlを考慮することができる.parsersまたはxml.domがrequestを使いたくなければurllibeを使うことも考えられます
次の目標は、指定された画像を簡単にダウンロードできるツールを作り、この2つの機能を組み合わせてパッケージ化することです.ええと、希望の画像をクリックすればダウンロードできると思います.しかし、ブラウザの画像からアドレスを取得する方法はしばらく不明ですが、ダウンロードは簡単で、簡単にアドレスを取得できれば他に問題はありません.