如何从aspx页面中删除图像?

时间:2016-05-23 14:03:46

标签: python html asp.net python-2.7 web-scraping

我正在尝试从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

我已经为aspx页面定义了标题,并且在if语句中区分了普通页面和aspx页面

    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 : ')

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)

我对aspx检测进行了一些修改,并为aspx页面创建了标题但是如何修改下一个我被困在这里

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

抱歉,如果我不清楚,因为你可以看到我是编程的新手,我问的问题是当我点击下一页时,如何从aspx页面获取图像浏览器中的按钮导致如果我只能刮一页导致网址没有改变,除非我以某种方式发送一个http帖子告诉页面显示下一页有新图片,因为网址保持不变我希望我很清楚< / EM>

2 个答案:

答案 0 :(得分:2)

您可以使用请求通过使用您可以从初始页面解析的正确数据发布到网址来执行此操作:

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)

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

答案 1 :(得分:1)

我的互联网非常糟糕,所以我不能保证100%这样可行,但你想要执行的是在这些行之间。

这适用于任何类型的页面。如果我解释错误,请不要再发表评论。

import urllib2
from urlparse import urljoin
from urllib import urlretrieve
from bs4 import BeautifulSoup

url = "http://www.foxrun.com.au/Products/Cylinders_with_Gadgets.aspx"
html = urllib2.urlopen(url)
soup = BeautifulSoup(html)
imgs = soup.findAll("img")
image=0
for img in imgs:
    link=urljoin(url,img['src']) #Join relative paths
    urlretrieve(link, "image"+str(image)) #saves image in the folder you execute this
    image+=1 #increments name

这将创建

image1 image2 ... imageN

根据需要更改目标路径

编辑:

这与aspx无关。

页面链接是javascript生成的,因此您无法从中提取网址。 urrlib无法处理动态生成的内容,因此在这种情况下,您必须使用浏览器模拟器,例如Selenium + Firefox() / PhantomJS或者您可以使用Splash。还有CasperJS + PhantomJS。可能性是无穷无尽的,但我会选择Selenium:)

使用这些工具,您可以像在浏览器中一样与页面进行交互(单击,滚动,输入文本到框等)