总体思路
思路
-
找出所有获奖者的豆瓣id
-
将获奖者豆瓣id顺序排列
-
对于表格内每一个数据逐行读取
-
进行豆瓣电影搜索,进入搜索页面,拉取导演和前三个演员id
-
在获奖者列表中二分法匹配
-
只要能匹配到一个,就标注1,停止匹配,4个id全都匹配过后,没有匹配的,标注0
-
读取下一行进行搜索,重复step4-6
内容
变量
变量名 | 描述 | 来源 |
---|---|---|
mov_name | 电影名 | excel |
mov_name_en | UrlEncode电影名 | quote(name) |
mov_id | 电影豆瓣id | 搜索后在页面处理 |
id_dir | 导演id | 电影页面处理 |
id_act1 | 主演id1 | 电影页面处理 |
id_act2 | 主演id2 | 电影页面处理 |
id_act3 | 主演id3 | 电影页面处理 |
mov_info | 电影数组: mov_name, mov_id, id_dir, id_act1, id_act2, id_act3, ismat | 存储电影名、id,导演和主演、是否匹配的数组 |
pri_id | 获奖影人id数组 | 搜索获得 |
ismat | 是否匹配 | 查看id是否在列表里 |
采集过程
豆瓣电影搜索
https://search.douban.com/movie/subject_search?search_text=[urlEncode:mov_name]
UrlEncode方法:
from urllib.parse import quote,unquote quote('汉字') unquote('百分号编码')
在搜索页面中找到第一个
%E7%83%AD%E5%A4%A9%E5%8D%88%E5%90%8E',subject_id:' [mov_id] '
电影页面
https://movie.douban.com/subject/[mov_id]/
在页面中找到
"director": [ { "@type": "Person", "url": "/celebrity/1320453/", "name": "刘循子墨 Xunzimo Liu" } ]
"actor": [ { "@type": "Person", "url": "/celebrity/1332934/", "name": "尹正 Zheng Yin" } , { "@type": "Person", "url": "/celebrity/1274361/", "name": "邓家佳 Jiajia Deng" } , { "@type": "Person", "url": "/celebrity/1274271/", "name": "喻恩泰 Entai Yu" }
得到4个人物id
电影数组
将4个人物id组成一个电影数组mov_info[mov_name, mov_id, id_dir, id_act1, id_act2, id_act3, ismat=0 ]
分隔以后,存入csv01
比较过程
数据格式
csv01中获取电影,一行为一条电影记录mov_info[mov_name, mov_id, id_dir, id_act1, id_act2, id_act3, ismat=0 ]
csv02中获取获奖影人信息,pri_id
排序
将pri_id顺序排列
比较
对于每一行,读入数组mov_info [mov_name, mov_id, id_dir, id_act1, id_act2, id_act3, ismat=0 ]
for j in range(1,2001): mov_info = line[j] #读入第j行 for i in range(2,5): #4大影人id if (mov_info[i] in pri_id ): #匹配影人id mov_info[6]=1 #ismat=1 break #读入下一行 else: continue #匹配下一个影人id
开始努力
问题1:等待时间
requests包不能进行打开网页并等待的操作,所以决定使用selenium包完成。
from time import sleep
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(url)
sleep(3)
element = driver.find_element_by_xpath("//body")
问题2:路径获得
用find_element_by_xpath获得元素,但是对于xpath的内容获取总有点问题,于是使用chopath插件完成xpath路径获取。