0

我正在修改这个脚本来为书页图像抓取这样的页面。直接从stackoverflow使用脚本,它会正确返回所有图像,除了我想要的一张图像。该页面作为空文件返回,其标题如下:img.php?dir=39d761947ad84e71e51e3c300f7af8ff&file=1.png。

在我下面的修改版本中,我只拉书页图像。

这是我的脚本:

from bs4 import BeautifulSoup as bs
import urlparse
from urllib2 import urlopen
from urllib import urlretrieve
import os
import sys

out_folder = '/Users/Craig/Desktop/img'

def main(url, out_folder):
    soup = bs(urlopen(url))
    parsed = list(urlparse.urlparse(url))

    for image in soup.findAll('img', id='page_image'):
        print "Image: %(src)s" % image
        filename = image["src"].split("/")[-1]
        parsed[2] = image["src"]
        outpath = os.path.join(out_folder, filename)
        if image["src"].lower().startswith("http"):
            urlretrieve(image["src"], outpath)
        else:
            urlretrieve(urlparse.urlunparse(parsed), outpath)

def _usage():
    print "usage: python dumpimages.py http://example.com [outpath]"

if __name__ == "__main__":
    url = sys.argv[-1]
    if not url.lower().startswith("http"):
        out_folder = sys.argv[-1]
        url = sys.argv[-2]
        if not url.lower().startswith("http"):
            _usage()
            sys.exit(-1)
    main(url, out_folder)

有任何想法吗?

4

3 回答 3

3

这里的问题是您用于检索图像的 url 是:

http://bookre.org/loader/img.php?dir=39d761947ad84e71e51e3c300f7af8ff&file=1.png?file=1077091&pg=1

当你真正想要它时:

http://bookre.org/loader/img.php?dir=39d761947ad84e71e51e3c300f7af8ff&file=1.png

这是我在 2 分钟内一起破解的内容,以从您列出的网站下载您所需的图像:

import urllib
import urllib2
import urlparse
from bs4 import BeautifulSoup

def main(url):
    html = urllib2.urlopen(url)
    soup = BeautifulSoup(html.read())

    parsed = list(urlparse.urlparse(url))

    for image in soup.find_all(id="page_image"):
        if image["src"].lower().startswith("http"):
            urllib.urlretrieve(image["src"], "image.png")
        else:
            new = (parsed[0], parsed[1], image["src"], "", "", "")
            urllib.urlretrieve(urlparse.urlunparse(new), "image.png")


if __name__ == '__main__':
    main("http://bookre.org/reader?file=1077091&pg=1")

该脚本将图像保存在"image.png"脚本所在的目录中。希望这是您所追求的;如果您遇到任何困难,请告诉我们。

于 2013-07-27T19:07:41.140 回答
0

在你的:

else:
    urlretrieve(urlparse.urlunparse(parsed), outpath)

您需要将 parsed 中的一些元素替换为 image["src"] 中的元素

于 2013-07-27T18:35:34.070 回答
0

使用pyquery容易得多:

from pyquery import PyQuery as pq
image, = [img.attrib['src'] for img in pq(url=url)('img#page_image')]
...

(注意名称的时髦用法,= ['string'] 展开单元素列表)。

于 2013-07-27T18:46:57.633 回答