为图像刮取页面但文件返回为空

时间:2013-07-27 17:47:58

标签: python parsing scripting web-scraping

我正在修改this script以抓取书页{}的页面like this。直接从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)

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

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

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"。 希望这是你所追求的;如果您遇到任何困难,请告诉我们。

答案 1 :(得分:0)

在你的:

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

您需要将一些已解析的元素替换为来自image [“src”]

的元素

答案 2 :(得分:0)

pyquery更容易:

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

(请注意使用name,= ['string']来展开单元素列表。