Python3编写网络爬虫04-爬取猫眼电影排行实例
利用requests库和正则表达式 抓取猫眼电影TOP100 (requests比urllib使用更方便,由于没有学习HTML系统解析库 选用re)
1.目标 抓取电影名称 时间 评分 图片等
url http://maoyan.com/board/4 结果以文件形式保存
2.分析
offset 代表偏移量 如果为n 电影序号为n+1~n+10 每页显示10个
获取100 分开请求10次 offset 分别为0 10 20...90 利用正则提取相关信息
3.抓取页面
import requests
#爬取第一页 页面信息
def get_one_page(url):
header = {
"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16",
}
response = requests.get(url,headers=header)
if response.status_code == 200:#判断是否请求成功
return response.text
return None
# 定义一个main函数 调用get_one_page 发送请求 打印结果
def main():
url = 'http://maoyan.com/board/4'
html = get_one_page(url)#调用请求函数
print(html)
main()
分析页面
电影信息对应节点为<dd>
提取排名 class 为 board-index i节点内 正则 <dd>.*?board-index.*?>(.*?)</i>
电影图片 查看为第二个img链接 <dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)"
电影名字 p节点 class 为name <dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>
主演 <dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>
发布时间 <dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>
评分 <dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>
定义分析页面的方法 parse_one_page()
import requests
import re
def get_one_page(url):
header = {
"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16",
}
response = requests.get(url,headers=header)
if response.status_code == 200:
return response.text
return None def parse_one_page(html):
pattern = re.compile(
'<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>',re.S
)
items = re.findall(pattern,html)
print(items)
# 定义一个main函数 调用get_one_page 发送请求 打印结果
def main():
url = 'http://maoyan.com/board/4'
html = get_one_page(url)
# print(html)
parse_one_page(html)
main()
将匹配结果遍历 生成字典
import requests
import re def get_one_page(url):
header = {
"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16",
}
response = requests.get(url,headers=header)
if response.status_code == 200:
return response.text
return None def parse_one_page(html):# html为网页源码
pattern = re.compile(
'<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>',re.S
)#定义规则
items = re.findall(pattern,html)#查找整个页面
# print(items)
#遍历结果生成字典
for item in items:
yield {
'index':item[0],
'image': item[1],
'title': item[2].strip(),
'actor': item[3].strip()[3:] if len(item[3]) > 3 else'',
'time': item[4].strip()[5:] if len(item[4]) > 5 else '',
'score': item[5].strip()+item[6].strip()
}
#返回一个生成器 yield # 定义一个main函数 调用get_one_page 发送请求 打印结果
def main():
url = 'http://maoyan.com/board/4'
html = get_one_page(url)
# print(html)
for item in parse_one_page(html):#遍历生成器
print(item)
main() 写入文件 将提取结果 写入文件 通过json库 的dumps() 实现字典的序列化 指定ensure_ascii 参数为 False
#写入文件
def write_to_file(content):
with open('result.txt','a',encoding='utf-8') as f:
print(type(json.dumps(content)))
f.write(json.dumps(content,ensure_ascii=False)+'\n')
整合代码 单页面电影提取
import requests
import re
import json
# 请求页面
def get_one_page(url):
header = {
"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16",
}
response = requests.get(url,headers=header)
if response.status_code == 200:
return response.text
return None #解析页面
def parse_one_page(html):# html为网页源码
pattern = re.compile(
'<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>',re.S
)#定义规则
items = re.findall(pattern,html)#查找整个页面
# print(items)
#遍历结果生成字典
for item in items:
yield {
'index':item[0],
'image': item[1],
'title': item[2].strip(),
'actor': item[3].strip()[3:] if len(item[3]) > 3 else'',
'time': item[4].strip()[5:] if len(item[4]) > 5 else '',
'score': item[5].strip()+item[6].strip()
}
#返回一个生成器 yield #写入文件
def write_to_file(content):
with open('result.txt','a',encoding='utf-8') as f:
print(type(json.dumps(content)))
f.write(json.dumps(content,ensure_ascii=False)+'\n') # 定义一个main函数 调用get_one_page 发送请求 打印结果
def main():
url = 'http://maoyan.com/board/4'
html = get_one_page(url)
# print(html)
for item in parse_one_page(html):#遍历生成器
write_to_file(item)
main()
分页爬取
# 定义一个main函数 调用get_one_page 发送请求 打印结果
def main(offset):
url = 'http://maoyan.com/board/4?offset=' + str(offset)
html = get_one_page(url)
# print(html)
for item in parse_one_page(html):#遍历生成器
write_to_file(item) if __name__ == '__main__':
for i in range(10):
main(offset = i *10)
整理代码
#-*-coding:utf-8-*- import requests #请求库
import re #正则模块
import json #json模块
import time #时间模块
from requests.exceptions import RequestException#捕获异常模块
# 请求页面
def get_one_page(url):
#异常处理
try:
header = {
"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16",
}
response = requests.get(url,headers=header)
# 判断状态码是否为200
if response.status_code == 200:
return response.text
return None
except RequestException:
return None #解析页面
def parse_one_page(html):# html为网页源码
#定义爬取规则
pattern = re.compile(
'<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>',re.S
)
# 查找整个页面
items = re.findall(pattern,html)
# print(items)
#遍历结果生成字典
for item in items:
yield {
'index':item[0],
'image': item[1],
'title': item[2].strip(),
'actor': item[3].strip()[3:] if len(item[3]) > 3 else'',
'time': item[4].strip()[5:] if len(item[4]) > 5 else '',
'score': item[5].strip()+item[6].strip()
}
#返回一个生成器 yield #写入文件
def write_to_file(content):
with open('result.txt','a',encoding='utf-8') as f:
# print(type(json.dumps(content)))
# ensure_ascii=False 保证输出结果为中文
f.write(json.dumps(content,ensure_ascii=False)+'\n') # 定义一个main函数 调用get_one_page 发送请求 参数offset 网页偏移量
def main(offset):
#拼接url地址
url = 'http://maoyan.com/board/4?offset=' + str(offset)
# 请求函数
html = get_one_page(url)
# print(html)
# 解析函数 和 文件保存函数
for item in parse_one_page(html):#遍历生成器
write_to_file(item) if __name__ == '__main__':
for i in range(10):
main(offset = i *10)
#延时处理
time.sleep(3)
# 最基础的实例 做好总结
Python3编写网络爬虫04-爬取猫眼电影排行实例的更多相关文章
- python3编写网络爬虫19-app爬取
一.app爬取 前面都是介绍爬取Web网页的内容,随着移动互联网的发展,越来越多的企业并没有提供Web页面端的服务,而是直接开发了App,更多信息都是通过App展示的 App爬取相比Web端更加容易 ...
- 爬虫--requests爬取猫眼电影排行榜
'''目标:使用requests分页爬取猫眼电影中榜单栏目中TOP100榜的所有电影信息,并将信息写入文件URL地址:http://maoyan.com/board/4 其中参数offset表示其实条 ...
- Python爬虫项目--爬取猫眼电影Top100榜
本次抓取猫眼电影Top100榜所用到的知识点: 1. python requests库 2. 正则表达式 3. csv模块 4. 多进程 正文 目标站点分析 通过对目标站点的分析, 来确定网页结构, ...
- python学习(23)requests库爬取猫眼电影排行信息
本文介绍如何结合前面讲解的基本知识,采用requests,正则表达式,cookies结合起来,做一次实战,抓取猫眼电影排名信息. 用requests写一个基本的爬虫 排行信息大致如下图 网址链接为ht ...
- 零基础Python爬虫实现(爬取最新电影排行)
提示:本学习来自Ehco前辈的文章, 经过实现得出的笔记. 目标网站 http://dianying.2345.com/top/ 网站结构 要爬的部分,在ul标签下(包括li标签), 大致来说迭代li ...
- Python爬取猫眼电影排行
import requests import pyquery def crawl_page(url: str) -> None: headers = { 'user-agent': 'Mozil ...
- 爬虫系列(1)-----python爬取猫眼电影top100榜
对于Python初学者来说,爬虫技能是应该是最好入门,也是最能够有让自己有成就感的,今天在整理代码时,整理了一下之前自己学习爬虫的一些代码,今天先上一个简单的例子,手把手教你入门Python爬虫,爬取 ...
- 50 行代码教你爬取猫眼电影 TOP100 榜所有信息
对于Python初学者来说,爬虫技能是应该是最好入门,也是最能够有让自己有成就感的,今天,恋习Python的手把手系列,手把手教你入门Python爬虫,爬取猫眼电影TOP100榜信息,将涉及到基础爬虫 ...
- PYTHON 爬虫笔记八:利用Requests+正则表达式爬取猫眼电影top100(实战项目一)
利用Requests+正则表达式爬取猫眼电影top100 目标站点分析 流程框架 爬虫实战 使用requests库获取top100首页: import requests def get_one_pag ...
随机推荐
- PostgreSQL 数据类型
数值类型 数值类型由两个字节,4字节和8字节的整数,4字节和8字节的浮点数和可选精度的小数.下表列出了可用的类型. www.yiibai.com Name Storage Size Descripti ...
- 常见HTTP状态码及URL编码表
常见HTTP状态码 1xx: 信息 (用于表示临时响应并需要请求者执行操作才能继续的状态代码) 消息: 描述: 100 Continue 服务器仅接收到部分请求,但是一旦服务器并没有 ...
- Canvas画空心正五角星-扩展DEMO为五星红旗
马上就要国庆了,在这个举国欢庆的日子里面,让我来画一个五角星表表我的爱国之情,啊?那你不是要画一个五星红旗?是的,你猜对了,其实我的最初想法只是画一个空心的正五角星,为了满足你,我拼一拼.在这个过程中 ...
- netty源码解解析(4.0)-15 Channel NIO实现:写数据
写数据是NIO Channel实现的另一个比较复杂的功能.每一个channel都有一个outboundBuffer,这是一个输出缓冲区.当调用channel的write方法写数据时,这个数据被一系列C ...
- Linux进程间通信(System V) --- 信号量
信号量 IPC 原理 信号量通信机制主要用来实现进程间同步,避免并发访问共享资源.信号量可以标识系统可用资源的个数.最简单的信号量为二元信号量 下图为 Linux 信号量通信机制的概念图.在实际应用中 ...
- What is The Rule of Three?
Question: What does copying an object mean? What are the copy constructor and the copy assignment op ...
- Android线程
1.引言 在Android中,几乎完全采用了Java的线程机制,由于Android的特性,主线程只处理和界面相关的事情,子线程处理耗时操作.Android中扮演线程角色的有Thread.AsyncTa ...
- JavaScript的值传递和引用传递
译者按: 程序员应该知道递归,但是你真的知道是怎么回事么? 原文: All About Recursion, PTC, TCO and STC in JavaScript 译者: Fundebug 为 ...
- react的生命周期需要知道的。
有关React生命周期: 1.组件生命周期的执行次数是什么样子的??? 只执行一次: constructor.componentWillMount.componentDidMount 执行多次:ren ...
- HTML5的DeviceOrientation实现微信摇一摇功能
在HTML5中,DeviceOrientation特性所提供的DeviceMotion事件封装了设备的运动传感器时间,通过改时间可以获取设备的运动状态.加速度等数据(另还有deviceOrientat ...