2016-07-24 6 views
2

Für die letzten paar Tage versuche ich die folgende Website (Link unten eingefügt), die ein paar Excel und PDFs in einer Tabelle zur Verfügung hat. Ich kann es für die Homepage erfolgreich machen. Es gibt insgesamt 59 Seiten, von denen diese Excel/PDFs verschrottet werden müssen. In den meisten Webseiten, die ich bis jetzt gesehen habe, gibt es einen Abfrageparameter, der in der Site-URL verfügbar ist, der sich ändert, wenn Sie von einer Seite zu einer anderen wechseln. In diesem Fall haben wir eine _doPostBack-Funktion, wahrscheinlich weil die URL auf jeder Seite, auf die Sie zugreifen, gleich bleibt. Ich sah mehrere Lösungen und Beiträge, die vorschlagen, die Parameter von post aufrufen und verwenden sie, aber ich bin nicht in der Lage, einen Sinn der Parameter, die in post Aufruf (das ist das erste Mal, dass ich eine Website Verschrottung) sind.Scraping Excel von der Website mit Python mit _doPostBack Link URL versteckt

Kann jemand bitte eine Ressource vorschlagen, die mir helfen kann, einen Code zu schreiben, der mir hilft, mit Python von einer Seite zur anderen zu gelangen. Die Details sind wie folgt:

Link zur Website - http://accord.fairfactories.org/ffcweb/Web/ManageSuppliers/InspectionReportsEnglish.aspx

Mein aktueller Code, der die CAP Excel-Tabelle auf der Homepage extrahiert (das perfekt funktioniert und ist nur als Referenz zur Verfügung gestellt)

from urllib.request import urlopen 
from urllib.request import urlretrieve 
from bs4 import BeautifulSoup 
import re 
import urllib 

Base = "http://accord.fairfactories.org/ffcweb/Web" 
html = urlopen("http://accord.fairfactories.org/ffcweb/Web/ManageSuppliers/InspectionReportsEnglish.aspx") 
bs = BeautifulSoup(html) 
name = bs.findAll("td", {"class":"column_style_right column_style_left"}) 
i = 1 
for link in bs.findAll("a", {"id":re.compile("CAP(?!\w)")}): 
    if 'href' in link.attrs: 
     name = str(i)+".xlsx" 
     a = link.attrs['href'] 
     b = a.strip("..") 
     c = Base+b 
     urlretrieve(c, name) 
     i = i+1 

Bitte lassen Sie mich wissen, wenn ich etwas während der Bereitstellung der Informationen verpasst habe und bitte bewerten Sie mich nicht - sonst kann ich keine weiteren Fragen stellen

Antwort

0

Für aspx-Sites müssen Sie nach Dingen wiesuchen, __EVENTVALIDATION etc .. und diese Parameter mit jeder Anforderung senden, wird dies alle Seiten erhalten und mit requests mit BS4:

import requests 
from bs4 import BeautifulSoup 
from urlparse import urljoin # python 3 use from urllib.parse import urljoin 



# All the keys need values set bar __EVENTTARGET, that stays the same. 
data = { 
    "__EVENTTARGET": "gvFlex", 
    "__VIEWSTATE": "", 
    "__VIEWSTATEGENERATOR": "", 
    "__VIEWSTATEENCRYPTED": "", 
    "__EVENTVALIDATION": ""} 


def validate(soup, data): 
    for k in data: 
     # update post values in data. 
     if k != "__EVENTTARGET": 
      data[k] = soup.select_one("#{}".format(k))["value"] 


def get_all_excel(): 
    base = "http://accord.fairfactories.org/ffcweb/Web" 
    url = "http://accord.fairfactories.org/ffcweb/Web/ManageSuppliers/InspectionReportsEnglish.aspx" 
    with requests.Session() as s: 
     # Add a user agent for each subsequent request. 
     s.headers.update({"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0"}) 
     r = s.get(url) 
     bs = BeautifulSoup(r.content, "lxml") 
     # get links from initial page. 
     for xcl in bs.select("a[id*=CAP]"): 
      yield urljoin(base, xcl["href"]) 
     # need to re-validate the post data in our dict for each request. 
     validate(bs, data) 
     last = bs.select_one("a[href*=Page$Last]") 
     i = 2 
     # keep going until the last page button is not visible 
     while last: 
      # Increase the counter to set the target to the next page 
      data["__EVENTARGUMENT"] = "Page${}".format(i) 
      r = s.post(url, data=data) 
      bs = BeautifulSoup(r.content, "lxml") 
      for xcl in bs.select("a[id*=CAP]"): 
       yield urljoin(base, xcl["href"]) 
      last = bs.select_one("a[href*=Page$Last]") 
      # again re-validate for next request 
      validate(bs, data) 
      i += 1 


for x in (get_all_excel()): 
    print(x) 

Wenn wir es auf den ersten drei Seiten ausführen, können Sie sehen, wir bekommen die gewünschten Daten:

http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9965 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9552 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=10650 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=11969 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=10086 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=10905 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=10840 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9229 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=11310 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9178 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9614 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9734 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=10063 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=10871 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9468 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9799 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9278 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=12252 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9342 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9966 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=11595 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9652 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=10271 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=10365 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=10087 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9967 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=11740 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=12375 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=11643 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=10952 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=12013 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9810 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=10953 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=10038 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9664 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=12256 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9262 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9210 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9968 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9811 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=11610 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9455 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=11899 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=10273 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9766 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9969 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=10088 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=10366 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9393 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9813 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=11795 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9814 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=11273 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=12187 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=10954 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9556 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=11709 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9676 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=10251 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=10602 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=10089 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9908 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=10358 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9469 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=11333 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9238 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9816 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9817 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=10736 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=10622 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9394 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9818 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=10592 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=9395 
http://accord.fairfactories.org/Utilities/DownloadFile.aspx?id=11271 
+0

Vielen Dank Padraic. Du bist ein Star :) –

+0

@ujjwaldalmia, keine Sorgen, du bist willkommen. –

+0

Lieber Padraic Ich bekomme den folgenden Fehler, wenn ich versuche, den Code auszuführen. Kannst du bitte nochmal helfen: –