2017-03-27 3 views
1

Ich übte den Crawler mit Python.Python-Crawler kann Element nicht finden

Mein Ziel ist es, das Testdatum auf GRE website zu finden.

Hier ist was ich jetzt getan habe.

import urllib2 
from bs4 import BeautifulSoup 
from urllib2 import urlopen, Request 

gre_url = 'https://ereg.ets.org/ereg/public/testcenter/availability/seats?testId=30&testName=GRE+General+Test&location=Taipei+City%2C+Taiwan&latitude=25.0329636&longitude=121.56542680000007&testStartDate=April-01-2017&testEndDate=May-31-2017&currentTestCenterCount=0&sourceTestCenterCount=0&adminCode=&rescheduleFlow=false&isWorkflow=true&oldTestId=30&oldTestTime=&oldTestCenterId=&isUserLoggedIn=true&oldTestTitle=&oldTestCenter=&oldTestType=&oldTestDate=&oldTestTimeInfo=&peviewTestSummaryURL=%2Fresch%2Ftestpreview%2Fpreviewtestsummary&rescheduleURL=' 
data = urllib2.urlopen(gre_url).read() 
soup = BeautifulSoup(data, "html.parser") 
print soup.select('div.panel-heading.accordion-heading') # return [] 

Allerdings scheint es, dass es nicht das Element div.panel-heading.accordion-heading aus data extrahieren kann. Wie repariere ich es?

+0

Wenn ich versuche, zu der URL zu gelangen, von der Sie Daten abrufen, wird auf die Hauptseite umgeleitet. –

+0

Basierend auf der URL, die Sie scrappen, sehe ich die Option 'isUserLoggedIn = true'. Setzen Sie dies auf false - 'isUserLoggedIn = false '- ruft keine Umleitung auf die Hauptseite auf. Dann sollten Sie in der Lage sein, auf das gewünschte Element zuzugreifen. –

+0

@ MD.KhairulBasar Ja, Sie haben Recht, ich kann auch nicht mit Inkognito-Modus zugreifen. –

Antwort

2

Sie müssen es in mehrere Schritte, die nachfolgende URLs besuchen, bevor Sie die letzten Anfragen erhalten, um die Verfügbarkeit zu überprüfen. Hier ist etwas, das für mich arbeitet requests.Session() mit:

import json 

import requests 
from bs4 import BeautifulSoup 


start_url = "https://www.ets.org/gre/revised_general/register/centers_dates/" 
workflow_url = "https://ereg.ets.org/ereg/public/workflowmanager/schlWorkflow?_p=GRI" 
seats_url = "https://ereg.ets.org/ereg/public/testcenter/availability/seats" 
with requests.Session() as session: 
    session.headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'} 

    session.get(start_url) 
    session.get(workflow_url) 
    response = session.get("https://ereg.ets.org/ereg/public/testcenter/availability/seats?testId=30&testName=GRE+General+Test&location=New+York%2C+NY%2C+United+States&latitude=40.7127837&longitude=-74.00594130000002&testStartDate=March-27-2017&testEndDate=April-30-2017&currentTestCenterCount=0&sourceTestCenterCount=0&adminCode=&rescheduleFlow=false&isWorkflow=true&oldTestId=30&oldTestTime=&oldTestCenterId=&isUserLoggedIn=true&oldTestTitle=&oldTestCenter=&oldTestType=&oldTestDate=&oldTestTimeInfo=&peviewTestSummaryURL=%2Fresch%2Ftestpreview%2Fpreviewtestsummary&rescheduleURL=")# 

    soup = BeautifulSoup(response.content, "html.parser") 
    result = json.loads(soup.select_one('#findSeatResponse')['value']) 
    for date in result['sortedDates']: 
     print(date['displayDate']) 

Natürlich ändern die letzte URL zum gewünschten Satz aus.

+0

Das ist großartig! Vielen Dank. Du warst eine große Hilfe! –

Verwandte Themen