Web爬虫|入门实战之猫眼电影

序言:“得数据者得天下”这句话如今已变为事实,能够把自己想要的数据通过一定技术获取下来是件很有成就感的事!数据是当今大数据、数据分析等的基础,而网络爬虫作为一种自动获取数据的脚本技术而日益流行!掌握爬虫无论在技术上还是生活上都很有用哦!

原创不易,本文禁止抄袭、转载,多年爬虫实战开发经验总结,违权必究!

网络爬虫开发实战源码:https://github.com/MakerChen66/Python3Spider

一、爬虫任务

任务背景:爬取猫眼电影Top100数据,包括电影排名,图片地 址,演员,电影名,上映时间以及电影评分

任务目标:运用正则表达式去解析网页源码获得所需数据并保存至本地TXT文件以及MongoDB数据库中

二、解析

任务URL:https://maoyan.com/board/4?offset=0

下图为猫眼电影的第一页:
在这里插入图片描述

再看看第二页:
在这里插入图片描述

最后看看第三页:
在这里插入图片描述

我们把这三页的URL复制下来,看一下URL规律:

https://maoyan.com/board/4?offset=0
https://maoyan.com/board/4?offset=10
https://maoyan.com/board/4?offset=20

从上面的URL可以看出,只有offset变化,offset意为偏移量,从中可以看出每一页的偏移量为10,可以把该参数定义为自变量,然后用循环爬取前10页的数据,也就是top100的数据

解析网页源代码
在这里插入图片描述

点击箭头打开dd标签块,看看具体的信息:
在这里插入图片描述

再看看network中的真实数据:
在这里插入图片描述
从以上的图中可以看出猫眼电影的数据都保存在dd标签块中,接下来就要用正则表达式去匹配所需的数据,再把这些数据以json格式保存到文本文件中以及MongoDB数据库中

三、编码

获取网页源码
定义一个去获取HTML源码的方法

import requests
from requests import exceptions

def get_one_page(url):
  '''
  headers表示要传递的头信息,'User-Agent'表示伪装浏览器
  '''
  try:
    headers = {'User-Agent':'Mozilla/5.0'}
    response = requests.get(url,headers=headers)
    if response.status_code == 200:
      return response.text
    else:
      return None
 except exceptions.RequestException:
    return None


解析源码并获得数据

import re

def parse_one_page(html):
  '''
  re.compile()方法会将正则表达式字符串转换为正则表达式对象,方便以后的复用
  re.S表示修饰符,可以忽略换行符
  re.findall()方法会将所有符合匹配模式的数据返回,并且以列表形式返回
  yield是Python中的关键字,表示生成器,类似于return
  strip()方法可以把空的部分去掉,包括空格,换行符等,但它的操作对象必须是字符串
  .*?表示非贪婪匹配
  '''
  pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'
                         + '.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'
                         + '.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>',re.S)
  movies_information = re.findall(pattern,html)
  for movie_information in movies_information:
    yield {
      '电影排名':movie_information[0],
      '图片地址':movie_information[1],
      '电影名':movie_information[2].strip(),
      '演员':movie_information[3].strip()[3:] if len(movie_information) > 3 else '',
      '上映时间':movie_information[4].strip()[5:] if len(movie_information) > 5 else '',
      '评分':movie_information[5].strip() + movie_information[6].strip()
    }


保存数据到文本文件

import json

def write_movies_data_to_file(movie_information):
  '''
  'a'表示以追加方式把数据写入文件中,这样就不会覆盖之前写入的数据
  json.dumps()方法可将json文本字符串序列化为json对象
  ensure_ascii=False表示忽略ASCII码,默认也为False
  indent表示json格式的缩进
  '''
  with open('../txt_file/maoyan_movies_information.txt','a',encoding='utf-8') as f:
    f.write(json.dumps(movie_information,indent=2,ensure_ascii=False) + '\n')


保存数据到MongoDB数据库

import pymongo

def insert_to_mongodb(content):
  '''
  client表示操作MongoDB数据库的对象
  db表示数据库对象
  collection表示集合对象,类似于MySQL中的table
  '''
  client = pymongo.MongoClient(host='localhost',port=27017)
  db = client['spiders']
  collection = db['maoyan_movies_data']
  try:
    if content:
      collection.insert(content)
      print('Success to insert!')
  except:
    print('Failed to insert!')


定义main()方法控制程序的运行

def main(offset):
  '''
  offset={offset}表示页数偏移量,这里用f-string函数把它设置为自变量,从而可以循环爬取
  '''
  url = f'https://maoyan.com/board/4?offset={offset}'
  html = get_one_page(url)
  for movie_information in parse_one_page(html):
    print(movie_information)
    write_movies_data_to_file(movie_information)
    insert_to_mongodb(movie_information)


主程序运行

import time

if __name__ == '__main__':
  '''
  time模块延迟爬取时间,猫眼已经加了反爬
  '''
  for i in range(10):
    main(offset=i*10)
    time.sleep(1)


运行效果
控制台输出:
在这里插入图片描述
json格式的txt文本结果:
在这里插入图片描述
MongoDB输出结果:
在这里插入图片描述

四、源码下载

完整源码下载:阅读原文,最下面有惊喜哦!
GitHub下载链接:https://github.com/MakerChen66/Python3Spider

五、总结

  • 请求库requests及exceptions模块
  • 标准库re
  • time模块
  • json模块
  • Python与MongoDB数据库对接的pymongo库

五、作者Info

作者:小鸿的摸鱼日常,Goal:让编程更有趣!

原创微信公众号:『小鸿星空科技』,专注于算法、爬虫,网站,游戏开发等,期待你的关注,让我们一起成长、一起Coding!

转载说明:本文禁止抄袭、转载,侵权必究!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鸿的摸鱼日常

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值