如何从aspx页面中抓取图像?

Sha*_*ady 5 html python asp.net web-scraping python-2.7

我正在尝试从 aspx 页面抓取图像 我有这段代码可以从普通网页抓取图像,但无法抓取 aspx 页面,因为我需要将 http post 请求发送到 aspx 页面,我什至不知道如何做到这一点阅读了几个线程后,这是原始代码

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


def thefunc(url, out_folder):

    c = False
Run Code Online (Sandbox Code Playgroud)

我已经为 aspx 页面定义了标头和区分普通页面和 aspx 页面的 if 语句

    select =  raw_input('Is this a .net  aspx page ? y/n : ')
    if select.lower().startswith('y'):
        usin = raw_input('Specify origin of .net page : ')
        usaspx = raw_input('Specify aspx page url : ')
Run Code Online (Sandbox Code Playgroud)

aspx 页面的标题

        headdic = {
            'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Origin': usin,
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.17 (KHTML, like Gecko)  Chrome/24.0.1312.57 Safari/537.17',
            'Content-Type': 'application/x-www-form-urlencoded',
            'Referer': usaspx,
            'Accept-Encoding': 'gzip,deflate,sdch',
            'Accept-Language': 'en-US,en;q=0.8',
            'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3'
        }
        c = True

    if c:
        req = urllib2.Request(url, headers=headic)
    else:
        req = urllib2.Request(url, headers={'User-Agent' : "Magic Browser"})
    resp = urllib2.urlopen(req)
    
    soup = bs(resp, 'lxml')
    
    parsed = list(urlparse.urlparse(url))

    print '\n',len(soup.findAll('img')), 'images are about to be downloaded'

    for image in soup.findAll("img"):
        
        print "Image: %(src)s" % image
        
        filename = image["src"].split("/")[-1]
        
        parsed[2] = image["src"]
        
        outpath = os.path.join(out_folder, filename)

        try:
        
            if image["src"].lower().startswith("http"):
                urlretrieve(image["src"], outpath)
            else:
                urlretrieve(urlparse.urlunparse(parsed), outpath)
        except:
            print 'OOPS missed one for some reason !!'
            pass


try:
    put =  raw_input('Please enter the page url : ')
    reg1 = re.compile('^http*',re.IGNORECASE)
    reg1.match(put)
except:
    print('Type the url carefully !!')
    sys.exit()
fol = raw_input('Enter the foldername to save the images : ')
if os.path.isdir(fol):
    thefunc(put, fol)
else:
    subprocess.call('mkdir', fol)
    thefunc(put, fol)
Run Code Online (Sandbox Code Playgroud)

我对 aspx 检测和为 aspx 页面创建标头做了一些修改,但接下来如何修改我被困在这里

***here is the aspx page link*** http://www.foxrun.com.au/Products/Cylinders_with_Gadgets.aspx

抱歉,如果我不清楚,如您所见,我是编程新手,我要问的问题是,当我单击浏览器中的下一页按钮时,如何获取从 aspx 页面获得的图像,因为如果我只能刮一页,因为网址不会改变,除非我发送一个http帖子以某种方式告诉页面显示带有新图片的下一页,因为网址保持不变我希望我很清楚

Pad*_*ham 2

您可以使用请求来完成此操作,方法是将正确的数据发布到 url,您可以从初始页面解析这些数据:

import requests
from bs4 import BeautifulSoup
from urlparse import urljoin
from itertools import chain

url = "http://www.foxrun.com.au/Products/Cylinders_with_Gadgets.aspx"


def validate(soup):
    return {"__VIEWSTATE": soup.select_one("#__VIEWSTATE")["value"],
            "__VIEWSTATEGENERATOR": soup.select_one("#__VIEWSTATEGENERATOR")["value"],
            "__EVENTVALIDATION": soup.select_one("#__EVENTVALIDATION")["value"]}


def parse(base, url):
    data = {"__ASYNCPOST": "true"
            }
    h = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.17 (KHTML, like Gecko)  Chrome/24.0.1312.57 Safari/537.17'}
    soup = BeautifulSoup(requests.get(url).text)
    data.update(validate(soup))
    # gets links for < 1,2,3,4,5,6>
    pages = [a["id"] for a in soup.select("a[id^=ctl01_ctl00_pbsc1_pbPagerBottom_btnP]")][2:]
    # get images from initial page
    yield [img["src"] for img in soup.select("img")]
    # add token for post 
    data.update(validate(soup))
    for p in pages:
        # we need $ in place of _ for the form data
        data["__EVENTTARGET"] = p.replace("_", "$")
        data["RadScriptManager1"] = "ctl01$ctl00$pbsc1$ctl01$ctl00$pbsc1$ajaxPanel1Panel|{}".format(p.replace("_", "$"))
        r = requests.post(url, data=data, headers=h).text
        soup = BeautifulSoup(r)
        yield [urljoin(base, img["src"]) for img in soup.select("img")]


for url in chain.from_iterable(parse("http://www.foxrun.com.au/", url)):
    print(url)
Run Code Online (Sandbox Code Playgroud)

这将为您提供链接,您只需下载内容并将其写入文件即可。通常我们可以创建一个会话并从一个页面转到下一个页面,但在这种情况下,发布的内容是ctl01$ctl00$pbsc1$pbPagerBottom$btnNext从初始页面到第二个页面可以正常工作,但没有从第二个页面到第三个页面等的概念。因为我们的表单数据中没有页码。