Error message here!

Hide Error message here!

忘记密码?

Error message here!

请输入正确邮箱

Hide Error message here!

密码丢失?请输入您的电子邮件地址。您将收到一个重设密码链接。

Error message here!

返回登录

Close

python 爬取猫眼电影top100数据

yocichen 2019-11-07 16:04:00 阅读数:19 评论数:0 点赞数:0 收藏数:0

最近有爬虫相关的需求,所以上B站找了个视频(链接在文末)看了一下,做了一个小程序出来,大体上没有修改,只是在最后的存储上,由txt换成了excel。

  • 简要需求:爬虫爬取 猫眼电影TOP100榜单 数据
  • 使用语言:python
  • 工具:PyCharm
  • 涉及库:requests、re、openpyxl(高版本excel操作库)

实现代码

猫眼电影Robots

 # -*- coding: utf-8 -*-
 # @Author  : yocichen
 # @Email   : yocichen@126.com
 # @File    : MaoyanTop100.py
 # @Software: PyCharm
 # @Time    : 2019/11/6 9:52
 
 import requests
 from requests import RequestException
 import re
 import openpyxl
 
 # Get page's html by requests module
 def get_one_page(url):
     try:
         headers = {
             'user-agent':'Mozilla/5.0'
         }
         # use headers to avoid 403 Forbidden Error(reject spider)
         response = requests.get(url, headers=headers)
         if response.status_code == 200 :
             return response.text
         return None
     except RequestException:
         return None
 
 # Get useful info from html of a page by re module
 def parse_one_page(html):
     pattern = re.compile('<dd>.*?board-index.*?>(\d+)<.*?<a.*?title="(.*?)"'
                          +'.*?data-src="(.*?)".*?</a>.*?star">[\\s]*(.*?)[\\n][\\s]*</p>.*?'
                          +'releasetime">(.*?)</p>.*?integer">(.*?)</i>.*?'
                          +'fraction">(.*?)</i>.*?</dd>', re.S)
     items = re.findall(pattern, html)
     return items
 
 # Main call function
 def main(url):
     page_html = get_one_page(url)
     parse_res = parse_one_page(page_html)
     return parse_res
 
 # Write the useful info in excel(*.xlsx file)
 def write_excel_xlsx(items):
     wb = openpyxl.Workbook()
     ws = wb.active
     rows = len(items)
     cols = len(items[0])
     # First, write col's title.
     ws.cell(1, 1).value = '编号'
     ws.cell(1, 2).value = '片名'
     ws.cell(1, 3).value = '宣传图片'
     ws.cell(1, 4).value = '主演'
     ws.cell(1, 5).value = '上映时间'
     ws.cell(1, 6).value = '评分'
     # Write film's info
     for i in range(0, rows):
         for j in range(0, cols):
             # print(items[i-1][j-1])
             if j != 5:
                 ws.cell(i+2, j+1).value = items[i][j]
             else:
                 ws.cell(i+2, j+1).value = items[i][j]+items[i][j+1]
                 break
     # Save the work book as *.xlsx
     wb.save('maoyan_top100.xlsx')
 
 if __name__ == '__main__':
     res = []
     url = 'https://maoyan.com/board/4?'
     for i in range(0, 10):
         if i == 0:
             res = main(url)
         else:
             newUrl = url+'offset='+str(i*10)
             res.extend(main(newUrl))
     # test spider
     # for item in res:
     #     print(item)
     # test wirte to excel
     # res = [
     #     [1, 2, 3, 4, 9],
     #     [2, 3, 4, 5, 9],
     #     [4, 5, 6, 7, 9]
     # ]
 
     write_excel_xlsx(res)

目前的效果

后记

入门了一点后发现,如果使用正则表达式和requests库来实行进行数据爬取的话,分析HTML页面结构和正则表达式的构造是关键,剩下的工作不过是替换url罢了。


补充一个分析HTML构造正则的例子

猫眼经典科幻按照评价排序

审查元素我们会发现每一项都是<dd>****</dd>格式

 我想要获取电影名称和评分,先拿出HTML代码看一看

试着构造正则

'.*?<dd>.*?movie-item-title.*?title="(.*?)">.*?integer">(.*?)<.*?fraction">(.*?)<.*?</dd>' (随手写的,未经验证)


 

参考资料

【B站视频 2018年最新Python3.6网络爬虫实战】https://www.bilibili.com/video/av19057145/?p=14

【猫眼电影robots】https://maoyan.com/robots.txt (最好爬之前去看一下,那些可爬那些不允许爬)

版权声明
本文为[yocichen]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/yocichen/p/11812637.html