我正在尝试从表here中的所有79072条记录中获取列,问号,部,成员和主题字段。但是我从该表中抓取数据的代码返回的结果不完整。
在网页中,显示所有记录的按钮已损坏,因此我要让脚本单击“下一步”按钮并循环进行直到检索到所有记录,以检索记录。但是,每次我运行该脚本时,它都会在检索随机数量的记录后中途退出。我认为这可能是因为页面有时需要花费更长的时间加载,所以,我尝试增加脚本在尝试抓取数据之前必须等待的秒数,但这根本没有帮助。
这是我的剧本。
url = "http://loksabhaph.nic.in/Questions/qsearch15.aspx?lsno=16"
chrome_options = Options()
chrome_options.add_argument("--headless")
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.implicitly_wait(3)
driver.get(url)
while True:
try:
qno = driver.find_elements_by_xpath('//*[@id="ContentPlaceHolder1_tblMember"]/tbody/tr/td/table/tbody/*/td[1]/a[2]')
qty = driver.find_elements_by_xpath('//*[@id="ContentPlaceHolder1_tblMember"]/tbody/tr/td/table/tbody/*/td[2]/a[2]')
min = driver.find_elements_by_xpath('//*[@id="ContentPlaceHolder1_tblMember"]/tbody/tr/td/table/tbody/*/td[4]/a[2]')
mem = driver.find_elements_by_xpath('//*[@id="ContentPlaceHolder1_tblMember"]/tbody/tr/td/table/tbody/*/td[5]/a[2]')
sub = driver.find_elements_by_xpath('//*[@id="ContentPlaceHolder1_tblMember"]/tbody/tr/td/table/tbody/*/td[6]/a[2]')
for i in range(4):
print(qno[i].text + "\t" + qty[i].text + "\t" + min[i].text + "\t" + mem[i].text + "\t" + sub[i].text)
driver.find_element_by_id("ContentPlaceHolder1_cmdNext").click()
time.sleep(5)
except:
break
driver.quit()
如何确保我的脚本检索所有数据?
也请告知我是否还有另一种方法来检索此数据,或者您对代码本身有任何一般性的评论。我正在教自己如何编码,希望您能提供反馈。
编辑:基于来自pcalkins和supputuri的指针,我添加了“元素的存在”并捕获了异常。这是更新的脚本。
while True:
try:
qno = driver.find_elements_by_xpath('//*[@id="ContentPlaceHolder1_tblMember"]/tbody/tr/td/table/tbody/*/td[1]/a[2]')
qty = driver.find_elements_by_xpath('//*[@id="ContentPlaceHolder1_tblMember"]/tbody/tr/td/table/tbody/*/td[2]/a[2]')
min = driver.find_elements_by_xpath('//*[@id="ContentPlaceHolder1_tblMember"]/tbody/tr/td/table/tbody/*/td[4]/a[2]')
mem = driver.find_elements_by_xpath('//*[@id="ContentPlaceHolder1_tblMember"]/tbody/tr/td/table/tbody/*/td[5]/a[2]')
sub = driver.find_elements_by_xpath('//*[@id="ContentPlaceHolder1_tblMember"]/tbody/tr/td/table/tbody/*/td[6]/a[2]')
for i in range(len(qno)):
print(qno[i].text + "\t" + qty[i].text + "\t" + min[i].text + "\t" + mem[i].text + "\t" + sub[i].text)
driver.find_element_by_id("ContentPlaceHolder1_cmdNext").click()
myElem = WebDriverWait(driver, 300).until(EC.presence_of_element_located((By.ID, 'ContentPlaceHolder1_tblMember')))
# time.sleep(5)
except Exception as e:
print(e)
当我运行这个更新的脚本时,我设法检索了大约27000条记录,之后我得到了它,
消息:超时
(会话信息:headless chrome = 74.0.3729.157)
(驱动程序信息:chromedriver = 74.0.3729.6(255758eccf3d244491b8a1317aa76e1ce10d57e9-refs / branch-heads / 3729 @ {#29}),platform = Linux 4.13.0-36-generic x86_64)