学习目标:
学习Selenium+Chrome实现爬取豆瓣电影信息
学习内容:
为毕设准备数据
目录:
1、 简介、安装Chromedriver
2、 简单爬取数据
3、 学习自动登录操作
4、 配合自动登录爬取已关注用户观影评分
学习产出:
1、 简介、安装Chromedriver
以下代码全部基于Jupyter运行。
首先,先去下载一个Chrome浏览器,然后在网址栏输入Chrome://version,查看以下浏览器的版本,例如我的:
然后,移步这个作者总结的浏览器版本和驱动版本对应的博文下载对应的驱动(如果版本对应不上的话就只能打开空白网页,不能打开具体网页):https://blog.csdn.net/BinGISer/article/details/88559532
解压好驱动后,我是放到了和Jupyter同一个目录下的。
之后,pip一个selenium模块,具体安装方法还请自行百度,安装成功会有selenium successfully installed 字样提示。
准备工作做好之后开始尝试打开一个页面。
2、 简单爬取数据
(1)打开一个空白页
from selenium import webdriver
from bs4 import BeautifulSoup
import re
import xlwt
chromedriver='./chromedriver'#找到驱动目录
browser=webdriver.Chrome(chromedriver)#运行驱动
(2)打开豆瓣电影页面
target_url='https://movie.douban.com/top250'#目标url
#print(target_url)
browser.get(target_url)
page_source=browser.page_source
soup=BeautifulSoup(page_source,'html.parser')#利用beautifulSoup库对页面进行解析
print(soup)
(3)查找所需元素的标签进行获取
先在网页审查元素看一下所需信息都包含在哪些标签里面,像剥洋葱一样一层一层剥开最后得到自己想要的内容,演示只爬取了top250的第一页的电影名称,爬取其他字段方法相同。
div_1=soup.find('div',{"class":"article"})#查找class为article的div标签
#print(div_1)
div_info=div_1.find_all('div',{"class":"info"})#查找所有class为info的div标签,电影信息包含在其中
#print(li_info)
for item in div_info:#遍历每个div获取每部电影信息
name=item.find('span',{"class":"title"}).get_text()#获取电影名称
print(name)
需要注意到find_all()方法有下划线,然后得到的数据是每个div标签内所有数据,想要再继续剥下去需要用for循环进入每个div标签里找到所需元素。
3、 学习自动登录操作
需要定位输入框所在位置,用xpath进行绝对位置定位,然后自动输入手机号和密码,中间需要休眠一定时间模仿人类活动,比较不方便就是多次登陆后会出现滑动验证码。
from selenium import webdriver
import time
import sys
import pickle
import csv
from selenium.webdriver import ActionChains
def login():
#profile=webdriver.FirefoxOptions()
#profile.add_argument('-headless') #设置无头模式
chromedriver='./chromedriver'#找到驱动目录
driver = webdriver.Chrome(chromedriver) #运行驱动
driver.get("https://www.douban.com")
#豆瓣页面登录默认手机号验证码,需要切换到账号密码位置
driver.switch_to.frame(driver.find_elements_by_tag_name('iframe')[0])
#利用豆瓣页面框架对账号密码登录进行定位
action = driver.find_element_by_xpath("/html/body/div[1]/div[1]/ul[1]/li[2]")
ActionChains(driver).move_to_element(action).click(action).perform()
#定位账号输入位置
driver.find_element_by_xpath("//*[@id='username']").send_keys("手机号")
time.sleep(1)
#定位密码输入位置
driver.find_element_by_xpath("//*[@id='password']").send_keys("密码")
time.sleep(1)
#定位登录按钮位置
driver.find_element_by_xpath("/html/body/div[1]/div[2]/div[1]/div[5]/a").click()
time.sleep(5)
if __name__ == '__main__':
login()
4、 配合自动登录爬取已关注用户观影评分
登录之后就可以根据之前所学爬取已关注的用户的历史观影评分了
from selenium import webdriver
import time
import sys
import pickle
import csv
from selenium.webdriver import ActionChains
def login():
#profile=webdriver.FirefoxOptions()
#profile.add_argument('-headless') #设置无头模式
chromedriver='./chromedriver'#找到驱动目录
driver = webdriver.Chrome(chromedriver) #运行驱动
driver.get("https://www.douban.com")
#豆瓣页面登录默认手机号验证码,需要切换到账号密码位置
driver.switch_to.frame(driver.find_elements_by_tag_name('iframe')[0])
#利用豆瓣页面框架对账号密码登录进行定位
action = driver.find_element_by_xpath("/html/body/div[1]/div[1]/ul[1]/li[2]")
ActionChains(driver).move_to_element(action).click(action).perform()
#定位账号输入位置
driver.find_element_by_xpath("//*[@id='username']").send_keys("手机号")
time.sleep(1)
#定位密码输入位置
driver.find_element_by_xpath("//*[@id='password']").send_keys("密码")
time.sleep(1)
#定位登录按钮位置
driver.find_element_by_xpath("/html/body/div[1]/div[2]/div[1]/div[5]/a").click()
time.sleep(5)
movieid=26752088#电影id
start=0#翻页,该值从0开始,每一页增加20
#movieid=35051512#更改电影id即可
#评论翻页#打开指定界面,好友影评
for start in range(0,41,20):
target_url= 'https://movie.douban.com/subject/{}/reviews?sort=follow&start={}'.format(movieid,start)#插入函数
driver.get(target_url)
time.sleep(3)#休眠3秒
#获得好友影评页面html代码
page_source=driver.page_source
soup=BeautifulSoup(page_source,'html.parser')
#抓取电影名称
title=soup.find('h1').get_text()
movietitle=title.split()[0]
lenth=len(movietitle)
movie=movietitle[0:lenth-3]
print(movie)
div_info=soup.find('div',{"id":"info"})
#print(div_info)
#daoname=div_info.find('a')
#元素抓取页面评论整体div
div_review=soup.find('div',{"class":"review-list"})
#print(div_content)
#查找每个评论div
div_list=div_review.find_all('div',{"class":"main review-item"})
#print(len(div_list))
#循环每个评论div
for item in div_list:
#用户id
userid=item.get('id')
#用户名,要用find查找class为name的再取text
name=item.find('a',{"class":"name"}).get_text()
#得到用户评分所在字符串
span_list=item.find_all('span')[0].get('class')[0]
#利用正则表达式得到字符串中数字 每一位0-9最多两位
rating=re.findall(r"[0-9]{1,2}",span_list)
print(userid)
print(name)
print(rating)
if __name__ == '__main__':
login()
最终得到了电影名,我所关注用户对该电影的评分,如需其他字段可以自行添加。
学习总结:
如果需要爬取用户对多部电影的评分,可以将电影id存入txt文件之后用for循环依次读取然后用format函数插入url中跳转到不同电影页面即可。
浅显之谈如有帮助还请一键三连