vorbei an Selen Antwort-url zu scrapy
Ich Lerne Python und versuche, mich zu kratzen, diese Seite für einen bestimmten Wert auf das dropdown-Menü. Nach, dass ich auf jedes Element, auf das angeführte Tabelle abrufen, die spezifische Informationen. Ich bin in der Lage, um das Element auszuwählen, und rufen Sie die Informationen auf dem webdriver. Aber ich weiß nicht, wie das passieren der Antwort die url zu der crawlspider.
driver = webdriver.Firefox()
driver.get('http://www.cppcc.gov.cn/CMS/icms/project1/cppcc/wylibary/wjWeiYuanList.jsp')
more_btn = WebDriverWait(driver, 20).until(
EC.visibility_of_element_located((By.ID, '_button_select'))
)
more_btn.click()
## select specific value from the dropdown
driver.find_element_by_css_selector("select#tabJcwyxt_jiebie > option[value='teyaoxgrs']").click()
driver.find_element_by_css_selector("select#tabJcwyxt_jieci > option[value='d11jie']").click()
search2 = driver.find_element_by_class_name('input_a2')
search2.click()
time.sleep(5)
## convert html to "nice format"
text_html=driver.page_source.encode('utf-8')
html_str=str(text_html)
## this is a hack that initiates a "TextResponse" object (taken from the Scrapy module)
resp_for_scrapy=TextResponse('none',200,{},html_str,[],None)
## convert html to "nice format"
text_html=driver.page_source.encode('utf-8')
html_str=str(text_html)
resp_for_scrapy=TextResponse('none',200,{},html_str,[],None)
Also das ist, wo ich geblieben bin. Ich war in der Lage, Abfrage mit dem oben genannten code. Aber Wie kann ich pass resp_for_scrapy der crawlspider? Ich legte resp_for_scrapy statt Element aber das hat nicht funktioniert.
## spider
class ProfileSpider(CrawlSpider):
name = 'pccprofile2'
allowed_domains = ['cppcc.gov.cn']
start_urls = ['http://www.cppcc.gov.cn/CMS/icms/project1/cppcc/wylibary/wjWeiYuanList.jsp']
def parse(self, resp_for_scrapy):
hxs = HtmlXPathSelector(resp_for_scrapy)
for post in resp_for_scrapy.xpath('//div[@class="table"]//ul//li'):
items = []
item = Ppcprofile2Item()
item ["name"] = hxs.select("//h1/text()").extract()
item ["title"] = hxs.select("//div[@id='contentbody']//tr//td//text()").extract()
items.append(item)
##click next page
while True:
next = self.driver.findElement(By.linkText("下一页"))
try:
next.click()
except:
break
return(items)
Anregungen würde sehr geschätzt werden!!!!
BEARBEITUNGEN ich Teil einer middleware-Klasse wählen Sie aus der dropdown-bevor die spider Klasse. Aber jetzt gibt es keine Fehlermeldung und kein Ergebnis.
class JSMiddleware(object):
def process_request(self, request, spider):
driver = webdriver.PhantomJS()
driver.get('http://www.cppcc.gov.cn/CMS/icms/project1/cppcc/wylibary/wjWeiYuanList.jsp')
# select from the dropdown
more_btn = WebDriverWait(driver, 20).until(
EC.visibility_of_element_located((By.ID, '_button_select'))
)
more_btn.click()
driver.find_element_by_css_selector("select#tabJcwyxt_jiebie > option[value='teyaoxgrs']").click()
driver.find_element_by_css_selector("select#tabJcwyxt_jieci > option[value='d11jie']").click()
search2 = driver.find_element_by_class_name('input_a2')
search2.click()
time.sleep(5)
#get the response
body = driver.page_source
return HtmlResponse(driver.current_url, body=body, encoding='utf-8', request=request)
class ProfileSpider(CrawlSpider):
name = 'pccprofile2'
rules = [Rule(SgmlLinkExtractor(allow=(),restrict_xpaths=("//div[@class='table']")), callback='parse_item')]
def parse_item(self, response):
hxs = HtmlXPathSelector(response)
items = []
item = Ppcprofile2Item()
item ["name"] = hxs.select("//h1/text()").extract()
item ["title"] = hxs.select("//div[@id='contentbody']//tr//td//text()").extract()
items.append(item)
#click next page
while True:
next = response.findElement(By.linkText("下一页"))
try:
next.click()
except:
break
return(items)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Downloader-Middleware zu fangen Selen-Bedarf Seiten vor Sie Bearbeiten Sie regelmäßig mit Scrapy:
Hier ist ein sehr einfaches Beispiel mit PhantomJS:
Sobald Sie zurückkehren, dass
HtmlResponse
(oder einTextResponse
wenn das, was Sie wirklich wollen), Scrapy aufhören Verarbeitung-Downloader-und-drop in die Spinneparse
Methode:In diesem Fall können Sie weiterhin verwenden Sie Ihre Spinne
parse
- Methode, wie Sie normalerweise würde, mit HTML, außer dass die JS auf der Seite bereits ausgeführt.Tipp: Da der Downloader Middleware ist
process_request
- Methode akzeptiert die Spinne als argument, können Sie eine bedingte in der Spinne zu prüfen, ob Sie brauchen, um zu verarbeiten, JS überhaupt, und dass wir Sie behandeln sowohl JS, als auch non-JS-Seiten mit der exakt selben Spinne. Klasse.return
- Anweisung. Stellen Sie sicher, dass die Rücksendung einer Antwort von der middleware ab.return
- Anweisung. ich erkannte nur jetzt habe ich ein Fehlerfrom scrapy.http import HttpResponse ImportError: cannot import name HttpResponse
ich werde sehen, ob dies das Problem ist...HtmlResponse
, nichtHttpResponse
. Werde ich machen, die Sie Bearbeiten.Hier ist eine middleware für Scrapy und Selen
Müssen auch hinzufügen, in
settings.py
Entscheiden Wetter seine
200
oder etwas anderes basiert auf docs.Update firefox headless Modus mit scrapy und Selen
Wenn Sie möchten, führen Sie firefox im headless-Modus dann installieren xvfb
und PyVirtualDisplay
und nutzen diese middleware
wo
settings.py
enthältDas problem ist, dass einige Versionen von firefox funktionieren nicht mit Selen.
Um dieses problem zu lösen Sie können download-firefox-version 47.0.1 (diese version funktioniert einwandfrei) aus hier dann entpacken Sie es und legte es in Ihre Selen-Projekt. Danach ändern Sie die firefox-Pfad als
from_crawler
Funktion? was bedeutet diecls
parameter darstellen, und was ist es, dass die Anweisungen in der Funktion tun?