03Request爬取豆瓣电影信息及selenium请求库
昨日回顾
一、爬虫基本原理
-爬虫全过程
1.发送请求
2.接受相应数据
3.解析并提取有价值的消息
4.保存数据
二、Requests请求库
-get
url
headers
cookies
-post
url
headers
cookies
data
三、爬取校花网
1.通过主页解析提取详情页
2.通过详情页提取视频url
3.获取视频的二进制流写入本地
四、自动登陆GitHub
1.分析请求体信息
-用户名
-密码
-token
-杂七杂八
2.token
通过对login页面的解析提取
3.对session页面发送请求
-headers:
-User-Agent
-cookies
-login页面的cookie
-data
-form data
今日内容:
一、Request爬取豆瓣电影信息
-url:https://movie.douban.com/top250
-请求方式:get
-请求头:
user-agent
cookies
爬取的信息:
电影名称、电影url、电影导演、电影主演、电影年份、
电影类型、电影评分、电影评价、电影简介
分析所有主页的url
第一页:
<https://movie.douban.com/top250?start=0&filter=>
第二页:
https://movie.douban.com/top250?start=25&filter=
...
可以看出规律
用代码写出不同页数的url
num = 0
for line in range(10):
url = f'https://movie.douban.com/top250?start={num}&filter='
num += 25
get_page函数发送请求
def get_page(url):
response=requests.get(url)
print(response.text)
return response
先找出豆瓣有关信息的dom
<div class="item">
<div class="pic">
<em class="">1</em>
<a href="https://movie.douban.com/subject/1292052/">
<img width="100" alt="肖申克的救赎" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp" class="">
</a>
</div>
<div class="info">
<div class="hd">
<a href="https://movie.douban.com/subject/1292052/" class="">
<span class="title">肖申克的救赎</span>
<span class="title"> / The Shawshank Redemption</span>
<span class="other"> / 月黑高飞(港) / 刺激1995(台)</span>
<span class="playable">[可播放]</span>
</div>
<div class="bd">
<p class="">
导演: 弗兰克·德拉邦特 Frank Darabont 主演: 蒂姆·罗宾斯 Tim Robbins /...<br>
1994 / 美国 / 犯罪 剧情
</p>
<div class="star">
<span class="rating5-t"></span>
<span class="rating_num" property="v:average">9.6</span>
<span property="v:best" content="10.0"></span>
<span>1468896人评价</span>
</div>
<p class="quote">
<span class="inq">希望让人自由。</span>
</p>
</div>
</div>
</div>
用正则表达式匹配
<div class="item">.*?<em class="">(.*?)</em>.*?<a href="(.*?)">.*?<span class="title">(.*?)</span>.*?导演: (.*?)主演: (.*?)<br>(.*?)</p>.*?<span class="rating_num" .*?>(.*?)</span>.*?<span>(.*?)人评价</span>.*?<span class="inq">(.*?)</span>
pare_index函数解析页面
def pare_index(html):
# 正则表达式
movie_list = re.findall('<div class="item">.*?<em class="">(.*?)</em>.*?<a href="(.*?)">.*?<span class="title">(.*?)</span>.*?导演: (.*?)主演: (.*?)<br>(.*?)</p>.*?<span class="rating_num" .*?>(.*?)</span>.*?<span>(.*?)人评价</span>.*?<span class="inq">(.*?)</span>',
html,
re.S)
return movie_list
save_data函数保存数据
# 3、保存数据
def save_data(movie):
# 电影排名、电影url、电影名称、电影导演、电影主演
# 电影年份 / 电影类型、电影评分、电影评论、电影简介
top, m_url, name, daoyan, actor, year_type, \
point, commit, desc = movie
year_type = year_type.strip('\n')
data = f'''
======== 欢迎尊敬官人观赏 ========
电影排名:{top}
电影url:{m_url}
电影名称:{name}
电影导演:{daoyan}
电影主演:{actor}
年份类型:{year_type}
电影评分:{point}
电影评论:{commit}
电影简介:{desc}
======== 请官人下次再来哟 ========
\n
\n
'''
print(data)
with open('douban_top250.txt', 'a', encoding='utf-8') as f:
f.write(data)
print(f'电影: {name} 写入成功...')
二、selenium请求库
1、selenium是什么?
selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法执行javaScript代码的问题。原理是驱动浏览器执行一些一定好的操作。爬虫本质上就是模拟浏览器,所以可以用它来做爬虫
2.为什么要使用selenium
优点:
-执行js代码
-不需要分析复杂的通信流程
-对浏览器做弹窗、下拉操作
-******获取动态数据
-*****破解登陆验证
缺点:
-执行效率低
3.安装与使用
3.1安装selenium请求库
pip3 install selenium
3.2必须安装chrome浏览器
3.3安装浏览器驱动
3.4示例:搜索京东商品
from selenium import webdriver
from selenium.webdriver.common.by import By #按照什么方式查找,By.Id,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #键盘按键操作
from selenium.webdriver.support import expected_conditions as EC #和下面WebDriverWait一起用的
from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素
import time
#方式一:通过驱动打开浏览器
driver = webdriver.Chrome(r'C:\Program Files (x86)\chromedriver.exe')
# 方式二:把webdriver.exe驱动放到python解释器安装目录/Scripts文件夹中
#python解释器安装目录/Scripts配置环境变量
#python解释器安装目录 配置环境变量
try:
driver.get("https://www.jd.com/")
# 获取显式等待对象10秒
# 可以等待某个标签加载10秒
wait = WebDriverWait(driver,10)
# 查找元素id为key
input_tag = wait.until(EC.presence_of_element_located(
(By.ID, 'key')
))
time.sleep(5)
#在输入框输入商品名称
input_tag.send_keys('苹果')
#按下回车
input_tag.send_keys(Keys.ENTER)
time.sleep(20)
finally:
# 关闭浏览器
driver.close()
3.5示例二:自动登入百度
''''''
from selenium import webdriver # web驱动
from selenium.webdriver.common.keys import Keys # 键盘按键操作
import time
driver = webdriver.Chrome()
try:
# 隐式等待: 需要在get之前调用
# 等待任意元素加载10秒
driver.implicitly_wait(10)
driver.get('https://www.baidu.com/')
# 显式等待: 需要在get之后调用
time.sleep(5)
'''
===============所有方法===================
element是查找一个标签
elements是查找所有标签
'''
# 自动登录百度 start
# 1、find_element_by_link_text # 通过链接文本去找
login_link = driver.find_element_by_link_text('登录')
login_link.click() # 点击登录
time.sleep(1)
# 2、find_element_by_id # 通过id去找
user_login = driver.find_element_by_id('TANGRAM__PSP_10__footerULoginBtn')
user_login.click()
time.sleep(1)
# 3、find_element_by_class_name
user = driver.find_element_by_class_name('pass-text-input-userName')
user.send_keys('*****')
# 4、find_element_by_name
pwd = driver.find_element_by_name('password')
pwd.send_keys('*****')
submit = driver.find_element_by_id('TANGRAM__PSP_10__submit')
submit.click()
# end
# 5、find_element_by_partial_link_text
# 局部链接文本查找
login_link = driver.find_element_by_partial_link_text('登')
login_link.click()
# 6、find_element_by_css_selector
# 根据属性选择器查找元素
# .: class
# #: id
login2_link = driver.find_element_by_css_selector('.tang-pass-footerBarULogin')
login2_link.click()
# 7、find_element_by_tag_name
div = driver.find_elements_by_tag_name('div')
print(div)
time.sleep(20)
finally:
# 关闭浏览器释放操作系统资源
driver.close()