原以为知网还挺好爬的,毕竟在八爪鱼里面都是免费的模板。没想到,爬的时候还真是坑点满满啊!
坑点一:
一开始想都没想,直接css_selector定位,发现数据居然是空的!后来想了一下可能是需要转iframe,试了一下,没想到还真是!如下图所示,数据都是在iframe下的。
需要先用switch_to.frame转一下
driver.switch_to.frame('iframeResult')
注意:只要转一次就可以了,一开始以为翻页后需要重新转,后来想了想iframe应该只是一个固定框架,翻页只是里面的内容发生变化!
坑点二:
解决上述问题后,爬到第17页的时候,需要输验证码。而且每隔16页都要输一次,图片识别加进去太麻烦了,偷个懒还是让它睡个10秒,自己输入吧
坑点三:
没用开发者模式,大概到二十多页的时候,数据已经为空了!
全部代码:
from selenium import webdriver
import pandas as pd
from itertools import zip_longest
import time
import random
import os
os.chdir('C:/Users/dell/Desktop')
def crawler_paper():
opt=webdriver.ChromeOptions()
opt.add_experimental_option('excludeSwitches', ['enable-automation'])
driver=webdriver.Chrome(options=opt)
driver.get('https://www.cnki.net/')
time.sleep(2)
search=driver.find_element_by_id('txt_SearchText')
search.send_keys('大数据')
submit=driver.find_element_by_class_name('search-btn')
submit.click()
time.sleep(3)
df=[]
driver.switch_to.frame('iframeResult')
for page in range(1,50):
try:
driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
paper_name=driver.find_elements_by_css_selector('a.fz14')
author=driver.find_elements_by_css_selector('td.author_flag')
source=driver.find_elements_by_css_selector('td.author_flag+td')
datetime=driver.find_elements_by_css_selector('td.author_flag+td+td')
database=driver.find_elements_by_css_selector('td.author_flag+td+td+td')
download=driver.find_elements_by_css_selector('span.downloadCount')
for k,v,m,n,q,w in zip_longest(paper_name,author,source,datetime,database,download,fillvalue=0):
if w==0:
df.append([k.text,v.text,m.text,n.text,q.text,w])
else:
df.append([k.text,v.text,m.text,n.text,q.text,w.text])
print('第{}页爬取完毕'.format(page))
driver.find_element_by_link_text('下一页').click()
time.sleep(random.randint(2,5))
except:
print('未爬到数据')
time.sleep(10)
return df
def save_data(data:list):
inf=pd.DataFrame(data,columns=['论文名','作者','来源','发表日期','数据库','下载次数'])
inf.to_csv('paper_information.csv',index=False,encoding='gb18030')
if __name__=='__main__':
data=crawler_paper()
save_data(data)
最终爬取结果如下: