总结:过程还是可以的,成就感还是稍微有些的。耗时一个上午
准备:
selenium 相对应的可执行文件的下载与安装
解压放在:
就是这两部,如果官网慢的话,可以去csdn上进行下载 。
下面是python代码中的模块
导包模块:
# encoding=utf8
from selenium import webdriver
import re
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import time
import os
from bs4 import BeautifulSoup
在selenium中得到网页信息的主要是:
we_data = driver.page_source # 一定要有,因为要抓很多页数
数据都在we_data里面了
评论文本的re,要有\n 上次已经吃亏过一次了。
reg2 = r'"comment-text">.*?<p>(.*?)\n</p>'# 评论的文本所在区域
下面看具体代码:运行环境pycharm2017,py35,
# encoding=utf8
from selenium import webdriver
import re
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import time
import os
from bs4 import BeautifulSoup
# 先建一个空列表,用于接收爬取的文字
all_comments = []
# 之前用的Chrome 会默认打开Chrome,需要把下载的chromedriver.exe 放在python的文件路径下
driver = webdriver.PhantomJS()
# browser = webdriver.Chrome()
# browser.get('https://www.baidu.com/')
# 调用get方法
driver.get('http://v.youku.com/v_show/id_XMTgxODg5NzM0MA==.htm')
# 进入网页
driver.execute_script("window.scrollBy(0,3000)") # 这是下拉操作,进入网页后悔自己滚动到页面下面,这样评论才会加载出来
time.sleep(3) # 睡眠
driver.execute_script("window.scrollBy(0,5000)") # 下拉操作,具体下拉得看自己的屏幕
time.sleep(3)
#这里搞了我很久,一直找不到评论的所在,查了很久文档,对先抓大后抓先深感为然,不然你直接匹配评论内容是找不到的,这个是先匹配到最新评论的div,找到所有评论的框架先,这样动态数据才能加载出来,如图,所有最新评论都在一个class=commens的div中,为了剔除第一页的最热评论,又折腾了好久...
# data = driver.find_element_by_class_name('comment-list-body')
data = driver.find_element_by_id('videoCommentlist')
we_data = driver.page_source # 一定要有,因为要抓很多页数
# print(we_data)
print(data)
reg = r'"comment-list-main comment-list-box">(.*?)\n</div>'# 最新评论所在的区域
reg2 = r'"comment-text">.*?<p>(.*?)\n</p>'# 评论的文本所在区域
comments1 = str(re.findall(reg,we_data,re.S))
print('comments1 '+comments1)
# 第一页数据包含热门数据供40条(其中热门数据10,最新数据30)
comments2 = re.findall(reg2,we_data,re.S) # 匹配文字内容
print('comments2 '+str(comments2))
for i in comments2:
print('coment'+str(i))
# 把找到的文字评论内容添加进去
all_comments.extend(comments2)
print(len(comments2))
# 接下来是重复这个步骤就好了。不然要添加一句click(),让selenium模拟人工点击第二页,然后复制以上抓取第二页评论就好了
# 第二页数据(只有三十条)
time.sleep(2)
# 直接在浏览器中复制的
driver.find_element_by_xpath('//*[@id="videoCommentlist"]/div[4]/div/ul[1]/li[2]/a').click()
time.sleep(2)
driver.execute_script("window.scrollBy(0,2000)")
time.sleep(3)
driver.execute_script("window.scrollBy(0,4000)")
time.sleep(3)
data = driver.find_element_by_id('videoCommentlist')
we_data = driver.page_source # 一定要有,因为要抓很多页数
# print(we_data)
print(data)
reg = r'"comment-list-main comment-list-box">(.*?)\n</div>'# 最新评论所在的区域
reg2 = r'"comment-text">.*?<p>(.*?)\n</p>'# 评论的文本所在区域
comments1 = str(re.findall(reg,we_data,re.S))
print('comments3 '+comments1)
comments2 = re.findall(reg2,we_data,re.S) # 匹配文字内容
print('comments4 '+str(comments2))
for i in comments2:
print('coment'+str(i))
print(len(comments2))
以上代码是爬取了两页内容,如果需要下一页的需要找到id,然后调用click()方法就可以
爬取结果
初次使用:竟然不用cookie,头文件信息之类的,懵逼了已经
代码量不是很多,但是注释里面很清楚,都在里面,以后可以进行扩展。
下次进行好友qq空间说说or留言的爬取。采用selenium工具