【发布时间】:2017-10-02 10:34:14
【问题描述】:
我尝试从 AJAX 页面的http://www.sse.com.cn/assortment/stock/list/share/ 抓取表格数据。我的代码如下:
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 请求完成。但它没有用。有人能告诉我为什么我丢失了数据吗?有没有简单的方法用 Scrapy 抓取 ajax 页面。
【问题讨论】:
标签: python ajax scrapy web-crawler scrapy-spider