版权声明:可以转载奥 https://blog.csdn.net/Jiajikang_jjk/article/details/82777246
爬去猫眼电影前100名具体信息
准备工作
1:requests,json,time,re库
2:python3.x
3:pycharm
4:在线正则表达式测试网址
http://tool.oschina.net/regex/
说明:
博主使用的是python3.6,windows10操作系统
正文
1.目的
爬去猫眼电影前100的具体信息
2. 思路分析
此次使用requests和正则表达式
1:爬起的目标
http://maoyan.com/board/4
2:安装request库
3:对于每页的分析:每页具有十个电影:n-->n+1-->n+10
4: 爬去首页
a: 定义一个函数--获取响应头
b: 定义一个主函数---获取请求链接
c: 获取主页面源代码
5:正则表达式---提取电影信息
a:通过查看网页月源代码获取每一个电影信息都在<dd></dd>中
b: 在class 为board-index的i节点内: <i class="board-index board-index-2">2</i>
所以得到的正则表达式:<dd>.*?board-index.*?>(.*?)</i>
c:提取电影的图片
<a href="/films/1203" title="霸王别姬" class="image-link" data-act="boarditem-click" data-val="{movieId:1203}">
<img src="//ms0.meituan.net/mywww/image/loading_2.e3d934bf.png" alt="" class="poster-default" />
<img data-src="http://p1.meituan.net/movie/20803f59291c47e1e116c11963ce019e68711.jpg@160w_220h_1e_1c" alt="霸王别姬" class="board-img" />
</a>
分析:a节点--->图片2-->data-src属性
更新正则表达式:<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)"
d:提取电影的名称
<p class="name"><a href="/films/1203" title="霸王别姬" data-act="boarditem-click" data-val="{movieId:1203}">霸王别姬</a></p>
在p节点内,class=name-->name作为标志位-->a节点的正文内容
更新正则表达式:<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>
e:提取主演,发布时间,评分等内容时,同样的原理
主演:
<p class="star">主演:张国荣,张丰毅,巩俐 </p>
上映时间:
<p class="releasetime">上映时间:1993-01-01</p> </div>
评分:
<div class="movie-item-number score-num">
<p class="score"><i class="integer">9.</i><i class="fraction">6</i></p>
</div>
更新正则表达式:
<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'
+ '.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'
+ '.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>
f: 调用findall()方法提取所以的内容
定义一个函数:解析获取的页面
生成的结果以字典的形式输出
6:写入文件
1:对于第5步已经获取到了以字典形成
2:进行写一个写入文件的函数
7:获取前n排名
在第6步中已经实现了首页的爬去,现在要获取前n(100)名,需要进行遍历
在主函数中进行一个for i range(n):
main(offset=i*10)
8: 为防止反爬虫,增加一个演示等待
3.具体代码
"""
author:jjk
datetime:2018/9/19
coding:utf-8
project name:Pycharm_workstation
Program function: 爬去猫眼电影排行榜
"""
import requests
import re # 正则表达式
from requests.exceptions import RequestException # 抛出异常
import json
import time
# 获取响应头(获取首页)
def get_one_page(url):
try:
# 响应头
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36'
}
# get()请求获取
response = requests.get(url, headers=headers)
# 进行一个判断是否请求成功
if response.status_code == 200:
return response.text
return None
except RequestException:
return None
# 第二步:解析页面
def parse_one_page(html):
# 使用compile()方法选取需要的内容,re.S是包含换行在内的所有字符
pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'
+ '.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'
+ '.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>', re.S)
# findall()使用正则表达式进行对获取的源代码进行筛选需要的部分
items = re.findall(pattern,html)
# 获取筛选的信息,输出结果是一个列表的形式
# print(items)
# 遍历列表以字典的形式输出
for item in items:
yield{
'index': item[0],
'image': item[1],
'title': item[2],
'actor': item[3].strip()[3:],
'time': item[4].strip()[5:],
'score': item[5] + item[6]
}
# 第三步:进行写入文件-保存
def write_to_file(content):
# 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
with open('content.txt', 'a', encoding='utf-8') as f:
# 以json库中的dumps()实现字典的序列化,ensure_ascii=False确保为中文形式而不是Unicode编码
f.write(json.dumps(content,ensure_ascii=False) + '\n')
# 主函数
def main(offset):
# 需要爬去的链接
url = 'http://maoyan.com/board/4?offset=' +str(offset)
# 调用get_one_page()方法进行请求响应
html = get_one_page(url)
# 获取html页面源代码
# print(html)
# 调用parse_onepage()方法进行解析页面
# parse_one_page(html)
# 遍历parse_one_page(html)方法以字典形式输出
for item in parse_one_page(html):
print(item)
write_to_file(item)
# 执行主函数
if __name__ == '__main__':
for i in range(10):
main(offset=i*10)
# 延时等待
time.sleep(1)