Python爬虫日记5:使用Selenium爬取一点资讯动态数据

一:前言

这几天哈尔滨天气天天刮风下雨的挺烦的,抱个电脑去学校图书馆学编程回来还要被雨淋,马上专业课也要考试了,Python集中学习要等到几门课考完了。
今天使用Selenium来处理JS一点资讯文章动态加载问题,本来是想配合PhantomJS无界面浏览器来实现的,但是一直出问题等有空在找找原因吧,所以我就Firefox()了。

目标:获取一点资讯动态文章信息并以csv格式保存

二:运行环境

  • Python3.6,Anaconda集成版本,方便管理各种模块。

  • Selenium 3.4.0

三:实例分析

1.先看看网站一点资讯,的分析,红色部分是文章标题,文章作者,还有评价数目,这几个是我需要提取的数据,右边的按钮是用来刷新新文章的一会儿要用到。
一点资讯1.png
2.进入开发者模式后找到相应位置可以看到文章链接,标题,文章作者,评论数目。
一点资讯2.png
3.但是从下面看到首页的这样的新闻可以爬取的只有几个而已,我们如果想爬取多一点怎么办呢?当我们打开这个页面的时候,鼠标滚轮向下滚动的时候发现这些数据就变多了,说明这是一个JS动态加载数据的方式。我这次就要用到Selenium来模拟浏览器从而获取更多文章信息。
一点资讯3.png

四:实战代码

1.首先把全部的模块导入一下,这次用到了好几个。selenium.webdriver用来模拟浏览器用到的;BeautifulSoup用来解析网页结构;csv模块用来把数据保存为csv格式;time用来延时的,不然网页没有加载完就解析数据,那么保存的数据不完整,不够多。

1
2
3
4
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
from bs4 import BeautifulSoup
import csv,time

2.首先webdriver.Firefox()模拟一个火狐浏览器,之后请求这个一点资讯地址延时2秒,保证加载完成。这里本打算用PhantomJS无界面浏览器来爬取的,但是结果不够好,暂时就用火狐吧。

1
2
3
4
driver = webdriver.Firefox()
first_url = 'http://www.yidianzixun.com/channel/c6'
driver.get(first_url)
time.sleep(2)

3.接下来模拟鼠标点击那个刷新按钮可以加载更多数据,次数可以自己在加,我这里就用一次,icon-refresh是在开发者模式中按照我图中步骤找到那个按钮的相应位置,使用快捷键Ctrl+Shift+c,然后点击那个刷新按钮就可以跳转到相应代码位置。

Paste_Image.png
4.

1
find_element_by_class_name().click()

来模拟点击按钮,之前导入的模块

1
from selenium.webdriver.common.keys import Keys

这个是模拟键盘的操作的模块

1
driver.find_element_by_class_name('icon-refresh').send_keys(Keys.DOWN)

用来模拟键盘的方向键,这样就可以使侧边的滚动条往下滚动,从而实现动态加载文章数据。然后也需要延迟一下让网页加载完全。这里的for语句执行多次是为了按下↓键更多。

1
2
3
4
driver.find_element_by_class_name('icon-refresh').click()
for i in range(1,90):
driver.find_element_by_class_name('icon-refresh').send_keys(Keys.DOWN)
time.sleep(3)

5.到现在网页已经加载完全了,我们想要的文章数据也加载很多了,那么就开始解析网页来爬取数据吧!通过上面实例分析的第二步可以知道文章标题,作者,评论数目,文章链接等信息位置,最后解析完就把这个模拟的浏览器关闭。

1
2
3
4
5
6
7
8
9
soup = BeautifulSoup(driver.page_source, 'lxml')
articles = []
for article in soup.find_all(class_='item doc style-small-image style-content-middle'):
title = article.find(class_='doc-title').get_text()
source = article.find(class_='source').get_text()
comment = article.find(class_='comment-count').get_text()
link = 'http://www.yidianzixun.com' + article.get('href')
articles.append([title, source, comment, link])
driver.quit()

6.数据也获取了那么我们现在使用csv格式来保存这些数据就行了。

1
2
3
4
5
with open('yidian.csv', 'w') as f:
writer = csv.writer(f)
writer.writerow(['文章标题', '作者', '评论数', '文章地址'])
for row in articles:
writer.writerow(row)

五:总结

这次爬虫练习了selenium模拟浏览器的各种操作,继续加油!
贴出我的github地址,我的爬虫代码和学习的基础部分都放进去了,有喜欢的朋友一起学习交流吧!github.com/rieuse/learnPython