使用xpath解析web上的图像

2024-10-05 12:27:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了一些代码试图从网站上提取照片。我想让它找到照片,然后下载它们用于推特:

import urllib2
from lxml.html import fromstring
import sys
import time

url = "http://www.phillyhistory.org/PhotoArchive/Search.aspx"

response = urllib2.urlopen(url)
html = response.read()
dom = fromstring(html)

sels = dom.xpath('//*[(@id = "large_media")]')

for pic in sels[:1]:

    output = open("file01.jpg","w")
    output.write(pic.read())
    output.close()




#twapi = tweepy.API(auth)
#twapi.update_with_media(imagefilename, status=xxx)

我在这方面是个新手,所以我不太清楚为什么这不起作用。未创建文件,也未创建“sels”。在


Tags: 代码importurlreadoutputresponsehtmlurllib2
1条回答
网友
1楼 · 发布于 2024-10-05 12:27:47

您的问题是图像搜索(Search.aspx)不仅仅返回一个包含所有内容的HTML页面,而是交付一个JavaScript应用程序,该应用程序随后发出几个请求(请参见AJAX)来获取有关资产的原始信息,然后动态构建包含所有搜索结果的HTML页面。在

您可以通过查看浏览器在加载页面时发出的HTTP请求来观察这种行为。使用Firefox的Firebug extension或内置的Chrome developer tools并打开网络选项卡。查找在初始页面加载之后发生的请求,尤其是POST请求。在

在本例中,有趣的请求是Thumbnails.ashxDetails.ashx,最后是MediaStream.ashx。一旦确定了这些请求,就可以查看浏览器发送的头和表单数据,并用Python的纯HTTP请求来模拟这种行为。在

来自Thumbnails.ashx的响应实际上是JSON,因此它比HTML更容易解析。在

在这个例子中,我使用^{}模块,因为它比urllib(2)好得多,也更容易使用。如果没有,请使用pip install requests安装它。在

试试这个:

import requests
import urllib


BASE_URL = 'http://www.phillyhistory.org/PhotoArchive/'
QUERY_URL = BASE_URL + 'Thumbnails.ashx'
DETAILS_URL = BASE_URL + 'Details.ashx'


def get_media_url(asset_id):
    response = requests.post(DETAILS_URL, data={'assetId': asset_id})
    image_details = response.json()
    media_id = image_details['assets'][0]['medialist'][0]['mediaId']
    return '{}/MediaStream.ashx?mediaId={}'.format(BASE_URL, media_id)


def save_image(asset_id):
    filename = '{}.jpg'.format(asset_id)
    url = get_media_url(asset_id)

    with open(filename, 'wb') as f:
        response = requests.get(url)
        f.write(response.content)
    return filename


urlqs = {
    'maxx': '-8321310.550067',
    'maxy': '4912533.794965',
    'minx': '-8413034.983992',
    'miny': '4805521.955385',
    'onlyWithoutLoc': 'false',
    'sortOrderM': 'DISTANCE',
    'sortOrderP': 'DISTANCE',
    'type': 'area',
    'updateDays': '0',
    'withoutLoc': 'false',
    'withoutMedia': 'false'
}

data = {
    'start': 0,
    'limit': 12,
    'noStore': 'false',
    'request': 'Images',
    'urlqs': urllib.urlencode(urlqs)
}

response = requests.post(QUERY_URL, data=data)
result = response.json()

print '{} images found'.format(result['totalImages'])

for image in result['images']:
    asset_id = image['assetId']
    print 'Name: {}'.format(image['name'])
    print 'Asset ID: {}'.format(asset_id)

    filename = save_image(asset_id)
    print "Saved image to '{}'.\n".format(filename)

注意:我没有检查http://www.phillyhistory.org/的服务条款对自动爬网有何规定。你需要检查自己,确保你做的任何事都没有违反他们的规定。在

相关问题 更多 >

    热门问题