0 前言
我们打算构建一个有关ssci中收录的期刊信息的数据库,但是官网上并没有提供可以直接下载的目录信息,所以着手对其目录网页(http://mjl.clarivate.com/cgi-bin/jrnlst/jlsubcatg.cgi?PC=SS)进行爬取。页面调研发现,检索框内的类别url可以通过定位li标签直接获取,但是进入到每个页面之后,需要通过动态点击进行翻页,所以本次程序使用了PhantomJS插件实现了动态翻页的操作。
1 准备工作
1)PhantomJS插件(http://phantomjs.org/download.html);
2)selenium包 (pip install selenium);
3)操作系统、硬件及环境配置:win10 x64, AMD10, 8GB,Python3.5.2。
2 爬取方案
1)调用PhantomJS插件
phantomjs_path='./lib/phantomjs_119912/bin/phantomjs.exe' # 定位到插件的exe文件位置
driver = webdriver.PhantomJS(executable_path=phantomjs_path) # 配置插件路径
driver.get(url) # 访问网页
2)首先不难发现,进入目录以后是一个动态页面,通过input标签进行翻页。如图:

此处我们就不能像平时一样使用 “标签.click()”方法进行提交,而是调用send_keys(self)方法进行,具体代码如下:
global p_num
p_num = 1
def main():
... # 配置的配置与获取标签的过程省略,以下主要展示翻页原理。
get_ssci_issn(driver, filed[0]) # 第一页不需要翻页,所以直接调用函数即可
while True:
have_next_page = next_page(driver) # 判断是否有下一页
if have_next_page is None:
break # 没有就退出
get_ssci_issn(driver, filed[0]) # 没退出继续进行爬取
def get_ssci_issn(driver,filed_name):
'获取页面下所有的期刊的issn号,写入数据库,此处具体代码省略'
...
def next_page(driver):
'判断是否有下一页的标签'
global p_num
p_num += 1
print('下一页, 第' + str(p_num) + '页') # 页码计数
page = driver.find_element_by_id('results')
pager = page.find_element_by_xpath("//div[@class='pager']") # 定位标签位置
try:
if pager.find_elements_by_name('NEXT') is not None: # 判断是否是最后一页(只有最后一页是没有name='NEXT'标签的)
next = pager.find_elements_by_name('NEXT')[0] # 获取下一页的标签,by name返回列表格式
next.send_keys('next arrow') # 提交元素 alt
time.sleep(3)
else:
return None # 没有下一页,返回none,停止循环
except Exception as e:
print('there is no next page.')
return None
return True
利用next.set_keys('next arrow')的方法,直接让页面进行跳转,完成翻页动作,然后再main()中,由于是动态页面,页面的内容变了,但是之前所配置的driver信息还是没有改变的,所以这里可以直接传入driver参数进行爬取。
3)设置休眠时间,防止过于频繁的点击而引起反爬机制。如:time.sleep(3)
3 总结
采用PhantomJS插件对内存的大小有一定的要求,如果内存满了,就会停止爬取,所以,要对爬虫断点重连有一定的要求,增强程序的鲁棒性。
对于本实验中所爬取的网页,数据量并不是很大,所以可以较为方便的进行动态网页的操作。可以作为以后解决动态页面的方法之一。