Я пытаюсь просканировать данные таблицы с http://www.sse.com.cn/assortment/stock/list/share/, который является страницами AJAX. Мой код следующий:
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
Но когда он закончился, я проверил файл json и обнаружил, что он потерял данные, то есть мне нужны все данные из 54 страниц, но иногда он просто сохраняет данные 53 страниц, иногда данные 52 страницы или даже меньше. другой тест. Но я добавляю строчку
time.sleep(3)
в конце цикла while функции синтаксического анализа он работает. Но я не знаю, почему это работает. Я предполагаю, что запрос ajax не завершился без задержки, что привело к потере данных. Поэтому я добавляю следующую строку для проверки
WebDriverWait(self.driver, 10).until(lambda driver: self.driver.execute_script("return jQuery.active == 0"))
Эта строка используется для ожидания завершения запроса ajax. Но это не сработало. Может кто подскажет, почему я потерял данные? И есть ли простые способы сканирования страниц ajax с помощью Scrapy.