一、要点分析
实现此功能的关键在于每次爬取时能够获取最新发表的文章,知网空间的搜索查询中提供了该功能
使用如下代码点击会返回css查询器找不到对应属性的错误
ul = driver.find_element_by_class_name("rank.left")
trs = ul.find_elements_by_tag_name("a")
for tr in trs:
driver.find_elements_by_tag_name("tr").get_attribute("onclick")
查找后发现是由于该标签栏的style中将display设置为none(即不显示),而使用selenium进行爬虫时不能对隐藏的页面元素进行操作
因此可以先通过css查询器获取隐藏元素的使其style 的display属性改为block来获取列表中的文本信息,
js1 = 'document.querySelectorAll("ul")[0].style.display="block";'
driver.execute_script(js1)
但是实际运行代码时会出现Message:element not interactable的错误
这是由于js执行后可以将html中的display属性改为block,因此可以通过css查询器定位到对应的页面元素,但是selenium不能对隐藏元素操作的问题并没有解决,因此需要通过模拟鼠标悬停来让对应标签显示
ActionChains(driver).move_to_element(ul).perform()
二、修改部分代码
def crawl_page(start, end, content):
lists.clear()
js1 = 'document.querySelectorAll("ul")[0].style.display="block";'
driver.execute_script(js1)
ul = driver.find_element_by_class_name("rank.left")
ActionChains(driver).move_to_element(ul).perform()
trs = ul.find_elements_by_tag_name("a")
for tr in trs:
if tr.get_attribute('textContent') == "按发表时间排序":
tr.click()
print('ok')
for page_no in range(start, end + 1):
driver.execute_script(js)
time.sleep(1)
crawl()
try:
a = driver.find_element_by_class_name("page").find_elements_by_class_name("n")[1]
print(page_no, len(lists))
a.click()
except Exception as err:
print(err)
else:
pass
time.sleep(random.randint(3, 6))
if len(lists) != 0:
today = datetime.date.today()
today = today.strftime("%Y%m%d")
save('./data' + content + today + '.csv')
lists.clear()