回顾
http://blog.csdn.net/github_26672553/article/details/78589068
前面我们已经完成了 利用phantomjs
和selenium
2个包 抓取到了基金网站第二页的html内容。
我们后面认为只要循环就可以抓第三页、第四页、。。。。,但其实这有个坑。
看见没有,其实我们只能循环到第五页。
这个就尴尬了!!!!
抓取任意页
仔细看上图,在获取到总页面的情况下,我们利用去第xx页
就可以实现循环抓取了。
# 去第几页 输入框
tonum = driver.find_element_by_id("tonum")
# 去第几页 提交按钮
jumpBtn = driver.find_element_by_id("btn_jump")
tonum.clear() # 情况输入框
tonum.send_keys(6) # 去第6页
jumpBtn.click() # 点击按钮
WebDriverWait(driver,20).until(lambda driver:driver.find_element_by_id("pager")\
.find_element_by_xpath("span[@value=6 and @class!='end page']")\
.get_attribute("class").find("at") != -1)
print(driver.page_source) # 打印网页源代码
最后打印网页源代码确实是第6页的内容,说明代码没有问题。
稍作说明:WebDriverWait().until()
里我们前面不一样(之前传递了一个函数名),现在这种是lambda语法
,我们线简单理解成python中的”回调函数”。
until()
方法就是判断 是否是第6页。
2、我们定义一个函数:获取第start页
到第end页
,并且保存抓取到的html内容。
def getData(start, end):
for x in range(start, end+1):
# 去第几页 输入框
tonum = driver.find_element_by_id("tonum")
# 去第几页 提交按钮
jumpBtn = driver.find_element_by_id("btn_jump")
tonum.clear() # 第x页 输入框
tonum.send_keys(str(x)) # 去第x页
jumpBtn.click() # 点击按钮
WebDriverWait(driver, 20).until(lambda driver: driver.find_element_by_id("pager") \
.find_element_by_xpath("span[@value={0} and @class!='end page']".format(x)) \
.get_attribute("class").find("at") != -1)
# 保存抓取到的html内容
# 保存到html目录下
with open("./htmls/{0}.txt".format(x),"wb") as f:
f.write(driver.find_element_by_id("tableDiv").get_attribute("innerHTML").encode("utf8"))
f.close()
上面代码最后我们没有保存所有html内容,只是保存了基金网站表格部分(tableDiv
)
3、调用函数,测试抓取5~7页的内容:
# 调用函数 抓取5~7页的内容
getData(5,7)