J'essaie de ramper les données de la table de http://www.sse.com.cn/assortment/stock/list/share/ qui est AJAX code pages.My suit:les données d'exploration à l'aide Scrapy + Sélénium + PhantopJS données perdues
import scrapy
class GovSpider(scrapy.Spider):
name = 'gov'
url = "http://www.sse.com.cn/assortment/stock/list/share/"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
}
driver = webdriver.PhantomJS('/Users/luozhongjin/ScrapyDemo/ScrapyDemo/phantomjs')
driver.implicitly_wait(15)
def start_requests(self):
yield scrapy.Request(url = self.url, headers = self.headers,callback = self.parse);
def parse(self, response):
self.driver.get(response.url)
self.driver.set_window_size(1124, 850)
i = 1
while True:
soup = BeautifulSoup(self.driver.page_source, 'lxml')
trs = soup.findAll("tr")
for tr in trs:
try:
tds = tr.findAll("td")
print tds
item = GovSpiderItem()
item["name"] = tds[1].string
print ("ok")
yield item
except:
pass
try:
next_page = self.driver.find_element_by_class_name("glyphicon-menu-right").click()
i = i + 1
if i >= 55:
break
except:
break
Mais quand il a terminé, je vérifie la JSON fichier et a constaté qu'il a perdu des données, c'est-à-dire, j'ai besoin de toutes les données de 54 pages, mais il sauve parfois 53 pages de données, parfois 52 pages de données ou même beaucoup moins. Mais j'ajoute la ligne
time.sleep(3)
à la fin de la boucle while de la fonction Parse, cela fonctionne. Mais je ne sais pas pourquoi ça marche. Je suppose que cela pourrait être la requête ajax n'a pas fini sans délai, ce qui conduit à la perte de données. Donc, j'ajoute la ligne suivante à tester
WebDriverWait(self.driver, 10).until(lambda driver: self.driver.execute_script("return jQuery.active == 0"))
Cette ligne est utilisée pour l'attente de la requête ajax terminée. Mais ça n'a pas marché. Quelqu'un peut-il me dire pourquoi j'ai perdu des données? Et existe-t-il un moyen simple d'explorer les pages ajax avec Scrapy.