一、内容更新
修改了crawl_page的部分逻辑,增加了对预先设定的关键词列表(content)的自动爬取,减少了由于反爬机制导致爬虫失败的概率
同时修改了文件保存路径和保存数量,按照每爬取250页网站(约5000条)保存至本地csv一次
共爬取约12w条数据
def crawl_page(start, end, content):
i = 0
t = 0
lists.clear()
for page_no in range(start, end + 1):
driver.execute_script(js)
time.sleep(3)
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
#每250页爬取结果自动存储(约5000条)
if i == 249:
i = 0
save('./data' + content + str(t) + '.csv')
t += 1
lists.clear()
else:
i += 1
time.sleep(random.randint(3, 6))
if len(lists) != 0:
save('./data' + content + str(t) + '.csv')
lists.clear()
def crawler(contents):
for content in contents:
link = conf_set(content)
driver.get(link)
crawl_page(1, 500, content)
driver.quit()
content_list = ['数据库', '机器学习', '计算机图形学']
# '人工智能', ,
# '算法设计', '数据结构', '大数据', '程序语言代码', '计算复杂性理论', '密码学', '软件工程', '操作系统'
crawler(content_list)
二、出现的问题以及解决方案
1.由于翻页速度过快导致的页面不能完全显示
翻页元素可以通过class=page属性进行定位,当爬虫翻页速度过快时可能会导致"div class=page"标签下的页面元素失效从而返回cannot get elements的错误,同时包含有item-lists的文章也存在无法爬取的可能
知网空间的翻页只能通过多次点击之后跳转到后面的页面,当页面数量>300时,爬虫失效后,通过点击页面跳转的方式比较繁琐,因此解决方案主要在避免爬虫失效
time.sleep(random.randint(3, 6))
让进程随机等待3至6秒再进行翻页和爬取操作
try:
a = driver.find_element_by_class_name("page").find_elements_by_class_name("n")[1]
a.click()
except Exception as err:
print(err)
对翻页操作使用try-except语句,捕获错误,当出现无法继续翻页时,使爬虫正常停止而非运行错误
2.在切换关键词时导致的MaxRetryError:HTTPConnectionPool:
在使用webdriver时,向浏览器发送请求可能会失败,导致该错误,在排除网络原因后发现,如果在一个关键词爬取之后webdiver进程已经结束,因此后续的关键词爬取不能正常进行,解决方案为在爬取完所有关键词后再结束webdriver
最终爬取的数据量
共24个csv每个包含约5000条数据约120000条