python爬虫获取下一页_[python爬虫] Selenium爬取CSDN博客摘要及问题

本文主要是采用Selenium来爬取CSDN的博文摘要,为后面对CSDN的热点技术、近几年专家发表的博客作数据分析。由于采用BeautifulSoup爬取该网站会报错"HTTPError: Forbidden",所以作者采用Selenium爬取。同时,在爬取过程中遇到了局部动态更新的问题,无法定位换页的问题,作者采用Firebug进行分析,也希望读者提出更好的方法。

代码下载地址:

一. CSDN博客网站分析及问题

本文主要爬取CSDN专家的博客,因为专家的论文水平相对高点,同时专栏较多,更具有代表性。网址:http://blog.csdn.net/experts.html

通过浏览器审查元素可以获取专家博客的URL链接,如下图所示:

20170222111208886

比如想访问我的所有博客,地址为:http://blog.csdn.net/eastmount/

通过分析,专家的信息位于节点下,通过下面的代码可以进行爬取:

urls = driver.find_elements_by_xpath("//div[@class=‘experts_list_wrap clearfix‘]/dl")

for u in urls:

print u.text然后需要执行的是翻页操作,同样的方法审查元素。但是难点是其页码是动态加载的,始终显示为:

下一页

20170222121735928

而且点击任何一页或下一页,顶部网址始终为:http://blog.csdn.net/experts.html#list

问题:

在写网络爬虫过程中,通常需要获取下一页,传统的方法是通过URL进行分析的,比如:

http://www.medlive.cn/pubmed/pubmed_search.do?q=protein&page=1

但是有的网站会出现两种情况。

1.一种是下拉菜单刷新新页面,这种参考下面这篇文章。

Python爬虫爬取动态页面思路+实例(二) - 孔天逸

核心代码,在线笔记记录:

# 下拉滚动条,使浏览器加载出动态加载的内容,可能像这样要拉很多次,中间要适当的延时(跟网速也有关系)。

# 如果说说内容都很长,就增大下拉的长度。

driver.execute_script("window.scrollBy(0,10000)")

time.sleep(3)

# 很多时候网页由多个或组成,webdriver默认定位的是最外层的frame,

# 所以这里需要选中一下说说所在的frame,否则找不到下面需要的网页元素

driver.switch_to.frame("app_canvas_frame")

soup = BeautifulSoup(driver.page_source, ‘xml‘)

contents = soup.find_all(‘pre‘, {‘class‘: ‘content‘}) # 内容

times = soup.find_all(‘a‘, {‘class‘: ‘c_tx c_tx3 goDetail‘}) # 发表时间

for content, _time in zip(contents, times): # 这里_time的下划线是为了与time模块区分开

print content.get_text(), _time.get_text()

# 当已经到了尾页,“下一页”这个按钮就没有id了,可以结束了

if driver.page_source.find(‘pager_next_‘ + str(next_num)) == -1:

break

# 找到“下一页”的按钮

elem = driver.find_element_by_id(‘pager_next_‘ + str(next_num))

# 点击“下一页”

elem.click()

# 下一次的“下一页”的id

next_num += 1

# 因为在下一个循环里首先还要把页面下拉,所以要跳到外层的frame上

driver.switch_to.parent_frame()2.第二种是动态加载,URL使用不便却能够翻页,如CSDN。

同时下一页的位置是不断变换的,可能是第5个,点击后"首页"、"上一页"出来,又变成第7个。

20170222125354622如果是上面这张图,可以采用获取class="next",但是如果像CSDN页码那样,怎么解决呢?目前我想获取"下一页"文字或者模拟http吗?还是获取js呢?头疼。

20170222125511949

下图是跳转一次下页的Python代码,其中:

nextPage = driver.find_element_by_xpath("//div[@class=‘page_nav‘]/a[6]")

获取第6个,但是跳转后"下一页"的位置变换了。

# coding=utf-8

from selenium import webdriver

from selenium.webdriver.common.keys import Keys

import selenium.webdriver.support.ui as ui

import re

import os

#打开Firefox浏览器 设定等待加载时间 访问URL

driver = webdriver.Firefox()

wait = ui.WebDriverWait(driver,10)

driver.get("http://blog.csdn.net/experts.html")

#获取列表页数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值