2016-07-16 10 views
1

Ich versuche, Inhalt von this page zu kratzen, siehe Code unten. Ich bin jedoch neugierig, als ob ich den Code wiederholt ausführen würde, bekomme ich eine andere Liste von Job-Standorten (und damit, Bewertungen), obwohl die angezeigte Seite in meinem Browser identisch ist. Zum Beispiel Die erste Iteration ist korrekt, aber das Skript ein zweites Mal mit der gleichen Start-URL laufen, die Standorte "University Village" und "Remote Telework" verschwinden von der Liste (und "San Salvador" und "Atlanta" eingeben, so dass die Liste ist gleich lang).Kratzen mit Beautifulsoup - Inhalt unterscheidet sich von der angezeigten Seite

Soweit ich sehen kann, gibt es keinen "versteckten" Text, dh. Alle diese sollten sichtbar sein (und sind in der ersten Iteration). Was ist los? Wie kann ich sicherstellen, alle Inhalte zu erfassen (ich muss für ein paar tausend Seiten wiederholen, damit ich die verschrotteten Daten nicht manuell durchgehen möchte).

This question ist verwandt, aber ich glaube nicht, dass es ein IP-Problem hier ist, da ich den angezeigten Inhalt in der ersten Iteration erhalten kann.

Bearbeitet um hinzuzufügen: Der Code überspringt tatsächlich einige Bewertungen, obwohl diese, soweit ich sehen kann, genau wie die, die der Code aufnimmt, identifiziert werden. Hier

ist der Code (vereinfacht):

list_url= ["http://www.indeed.com/cmp/Microsoft/reviews?fcountry=ALL"] 

for url in list_url: 
base_url_parts = urllib.parse.urlparse(url) 
while True: 
    raw_html = urllib.request.urlopen(url).read() 
    soup = BeautifulSoup(raw_html,"lxml") 

    review_tag={'class':re.compile("cmp-review-container")} 
    reviews=soup.find_all(attrs=review_tag) 

    job_locations=[] 

    for r in reviews: 
     if r.find(attrs={'class':"cmp-reviewer-job-location"}) != None: 
      job_location=r.find(attrs={'class':"cmp-reviewer-job-location"}).get_text().strip().encode('utf-8') 
     else: 
      job_location = "." 
     job_locations.append(job_location) 

#Zip the data and write the observations to the CSV file 

    try: 
     last_link = soup.find('div', id='company_reviews_pagination').find_all('a')[-1] 
     if last_link.text.startswith('Next'): 
      next_url_parts = urllib.parse.urlparse(last_link['href']) 
      url = urllib.parse.urlunparse((base_url_parts.scheme, base_url_parts.netloc, 
      next_url_parts.path, next_url_parts.params, next_url_parts.query, 
      next_url_parts.fragment)) 
      print(url) 
     else: 
      break 
    except: 
     break 

csvfile.close() 

PS. Entschuldigung, wenn dies nicht der richtige Ort ist, um diese Frage zu posten; lassen Sie mich in diesem Fall von einem geeigneteren Ort wissen.

Antwort

0

Meiner Meinung nach ist es mit Ajax Anfrage in your target url verwandt, ich könnte einige XHR-Typ-Anfragen finden, wenn ich es besuche.

Für Ajax verwandte Website, "What the user sees, what the crawler sees" ist ganz anders. Urlib oder Anfragen werden Daten nur beim ersten Laden der Seite besuchen, während einige Inhalte hier verloren gehen können.

Wenn Sie eine Website mit Ajax-Anfrage durchsuchen wollen, empfehle ich CasperJS zu verwenden, die auf PhantomJS basiert, spottet es, was die Leute Website besuchen, und wird, bis alle Daten, die Sie geladen weitere Arbeit tun müssen warten, ist es auch mit python, überprüfen sie bitte here :)

====== ====== UPDATE

ich füge einen anderen Link scraping-with-python-selenium-and-phantomjs, es mit PhantomJS und BeautifulSoup zusammen in engem Zusammenhang steht, und kann für einige nützlich sein Fälle.

+0

Danke. Gibt es eine Möglichkeit, CasperJS zu verwenden, um die URL zu öffnen und zu lesen, aber den Bearbeitungsteil schön auf Basis zu halten? Oder würde ich die gleichen Ergebnisse erzielen, wenn ich ghost.py verwenden würde (wobei der Hauptteil des Codes unverändert bleibt)? Ich bin ein Anfänger und alles beginnt ist, mmm, einschüchternd? :) –

+0

Hi anne_t, meiner Meinung nach ist der allgemeine Weg, bs und casperjs zusammen zu verwenden, einen einzigen Prozess (wie Popen) zu verwenden, um Casperjs Skript in Ihrem Py zu nennen, und verwenden Sie bs, um HTML von Casperjs heruntergeladen zu behandeln. Außerdem bearbeite ich meine Antwort und schließe einen Link mit PhantomJS und bs zusammen. Ich bin mir nicht sicher über ghost.py Teil, ich habe es nicht vorher behandelt :) – linpingta

+0

Vielen Dank! Ich werde definitiv nachsehen! –

Verwandte Themen