利用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 Nonedef 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 redef 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 Nonedef 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)

# 最基础的实例 做好总结

转载于:https://www.cnblogs.com/liuxiaosong/p/10281432.html

Python3编写网络爬虫04-爬取猫眼电影排行实例相关推荐

  1. python网络爬虫,爬取猫眼电影中复联4上映前南昌市的票房

    额...由于是个新手,爬虫前没做好防护措施,所以导致小编的ip地址被封了,至今还没找到解决办法,所以现在我的电脑已经没法打开猫眼电影的购票窗口了.. 但是数据以前拿到过,所以这里只讲方法,结果大家自己 ...

  2. 【崔庆才教材】《Python3网络爬虫开发实战》3.4爬取猫眼电影排行代码更正(绕过美团验证码)

    前情提要 最近有七八个小伙伴私信问我说崔大神的<Python3网络爬虫开发实战>教材中 "3.4爬取猫眼电影排行" 一节的代码目前不能用. 首先附上崔大神的github ...

  3. Python3爬虫——爬取猫眼电影排行

    一.爬取猫眼电影排行 目标:提取猫眼电影TOP100的电影排名.名称.主演.上映时间.评分.海报链接. URL:https://maoyan.com/board/4 保存:JSON # 版本:Pyth ...

  4. 爬虫,爬取猫眼电影Top100的电影名与评分

    ** 爬虫,爬取猫眼电影Top100的电影名与评分 ** import requests import threading import reclass maoyan_top500(threading ...

  5. python战反爬虫:爬取猫眼电影数据 (一)(Requests, BeautifulSoup, MySQLdb,re等库)

    姓名:隋顺意 博客:Sui_da_xia 微信名:世界上的霸主 本篇文章未涉及猫眼反爬,主要介绍爬取无反爬内容,战反爬内容请去 python战反爬虫:爬取猫眼电影数据 (二)(Requests, Be ...

  6. python战反爬虫:爬取猫眼电影数据 (二)(Requests, BeautifulSoup, MySQLdb,re等库)

    姓名:隋顺意 博客:Sui_da_xia 微信名:世界上的霸主 本文主要介绍破解反爬,可以先去上一篇观看爬取无反爬内容 python战反爬虫:爬取猫眼电影数据 (一)(Requests, Beauti ...

  7. python战反爬虫:爬取猫眼电影数据 (一)

    非常荣幸邀请到 赛迪人工智能大赛(简称AI世青赛)全球总决赛银奖的获得者 隋顺意 小朋友为本公众号投稿,隋小朋友虽然小小年纪,但编程能力已经比大多数大学生强非常多了,欢迎大家关注,捧场. 姓名:隋顺意 ...

  8. python爬虫,爬取猫眼电影1(正则表达式)

    本文用正则.xpath.beautifulsoup.css.pyquery几种不同的方式,爬取猫眼电影.只是记录过程.比较乱. 猫眼电影现在也添加了一些反爬虫机制,如果直接用requests可能会40 ...

  9. 【Python爬虫】爬取猫眼电影排行榜并存放至csv文件

    在进行本节实战之前,希望您对requests库以及正则表达式有所了解. 运行平台:windows **Python版本: Python3.x ** 一.依赖库的安装 在本节实战之前,请确保已经正确安装 ...

  10. 爬虫如何爬取猫眼电影TOP榜数据

    今天爬虫代理就为大家分享一下,爬虫是如何爬取猫眼电影TOP榜数据的.主要抓取的内容有排名.图片.电影名称.主演.上映时间和评分信息.在抓取之前,我们先打开猫眼电影TOP100页面,研究分析页面,查找我 ...

最新文章

  1. selenium:学习资源
  2. Android 侧划菜单
  3. 南洋理工大学科学家研发组装机器人,可以帮助用户组装椅子
  4. C语言再学习 -- printf、scanf占位符
  5. Java基础之String深入解析
  6. 初识 Angularjs1.x ,了解5个W和1个H
  7. iOS中的WiFi与硬件通信
  8. 利用梯度下降法求解一元线性回归和多元线性回归
  9. MySQL数据库与Oracle数据库中建表使用单引号和双引号的效果
  10. 怎么做SWOT分析模型PPT呢?
  11. 个人风景网站模板HTML+CSS+JS(源码)
  12. 什么是BIM,什么是CIM?
  13. 直播网站服务器带宽多少合适,开直播网速要求(开直播要多少兆宽带)
  14. java电子签名_java实现pdf文件电子签名
  15. 免费云存储工具类——七牛云(更改配置信息,直接使用)
  16. linux卸载phpstudy_centos
  17. 设计师都在看的全球设计网站,你居然还不知道!
  18. 迷宫生成算法(二)(C++)
  19. 单细胞拟时分析:基因及通路随拟时表达变化趋势
  20. linux怎么卸载mailx,Linux下mail/mailx命令发送邮件

热门文章

  1. python最简单的爬取邮箱地址_python简单爬虫,抓取邮箱
  2. 澳大利亚科学家开发出可用于脑机接口的新型碳基生物传感器
  3. python 字符串list转为数字list
  4. 在不久的将来,脑控机器人可以给我们喂水、给我们喂食
  5. 19年计算机英语统考,2019年网络教育统考大学英语(B)真题及答案
  6. 人类血液中首次发现微塑料颗粒,饮料瓶塑料袋化妆品都是来源
  7. 贝叶斯神书《统计反思》推出第二版,视频课程同步上线,作者亲自在线答疑...
  8. 看不见的Unicode码让敏感词轻松逃过审核,谷歌IBM都中招
  9. 只用CPU开发自动驾驶轮船,他们居然做到了
  10. 华为计算黄之鹏:AI开源框架已经到“汽车替代马车”的阶段 | MEET2021