python爬取电影和美食数据实战

简介: 本文使用的是requests+正则来匹配网页内容,对于数据量较多的采用了多线程抓取的方法,共3个案例,分别是抓取猫眼电影TOP100榜单和淘票票正在热映的电影信息、以及美团的美食数据。这几个案例采用的方法大同小异。 1、首先选择想要爬取的网站 2、确定要用的模块,requests,json,...
本文使用的是requests+正则来匹配网页内容,对于数据量较多的采用了多线程抓取的方法,共3个案例,分别是抓取猫眼电影TOP100榜单和淘票票正在热映的电影信息、以及美团的美食数据。这几个案例采用的方法大同小异。

   1、首先选择想要爬取的网站
   2、确定要用的模块,requests,json,re三个模块,如果想加快爬取速度可以加一个Pool
   3、 网页请求,先得到整个页面,需要加一个headers来进行请求,否则会被网站拦截
   4、格式化整个页面,通过patter的正则来匹配,找出我们需要的内容,
   5、   获取数据,findall,然后通过yield将数据返回,yield 是一个类似 return 的关键字,迭代一次遇到yield时就返回yield后面(右边)的值
   6、遍历获取到的数据
   7、保存到相应的文档中
   8、关闭文档,
   9、提示数据保存成功。


一、爬取猫眼电影Top100榜单的数据
4b481a8b06d0cb199a85ff95b6b340cce5e1c2eb
import requests
from multiprocessing  import Pool
from requests.exceptions  import RequestException
import re
import json

def  get_one_page(url):
try:
headers = {
"user-agent"'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'}
11
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):
pattern = re.compile( '<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'
'.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'
'.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>' , re.S)

items =re.findall(pattern ,html)
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( 'result.txt' ,  'a' ,  encoding= 'utf-8'as f:
f.write(json.dumps(content ,  ensure_ascii= False) +  ' \n ')
f.close()


def  main(offset):
url = 'http://maoyan.com/board/4?offset='+ str(offset)
html = get_one_page(url)
for item  in parse_one_page(html):
#print(item)
write_to_file(item)

if __name__ ==  '__main__':
#for i in range(10):
# main(i*10)
pool = Pool()
pool.map(main ,[i* 10  for i  in  range( 10)])


结果:将爬取的数据存放到文本文件中,
因为我这边采用的是线程池爬取的,所以有时候是不按顺序进行存储的,如果采用非多线程方式,就会按照顺序进行存储。

2f93b76a44a7a37d8643afa3308dd20b8e60e957



二、爬取淘票票正在热映的电影

09312c3acc4fd4721f2ecc9d0f823f8cab28a11a
可以看到网页结构如下,我这边使用了正则匹配的方法进行查找:

54a5bc36a9ccfe0eab00f53fefa0cd3211663879
代码如下:

import requests
from requests.exceptions  import RequestException
import re
import json

def  get_one_page(url):
     try:
        headers = {
             "user-agent"'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'}
         11
        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):

    pattern = re.compile( '<div class="movie-card-poster">.*?data-src="(.*?)".*?<span class="bt-l">(.*?)</span>.*?<span class="bt-r">(.*?)</span>.*?<div class="movie-card-list">.*?<span>(.*?)</span>'
    + '.*?<span>(.*?)</span>.*?<span>(.*?)</span>.*?<span>(.*?)</span>.*?<span>(.*?)</span>.*?<span>(.*?)</span>' ,re.S)

    items = re.findall(pattern html)
     for item  in items:
         yield {
             'image': item[ 0] ,
             'title': item[ 1] ,
             'score': item[ 2] ,
             'director': item[ 3].strip()[ 3:] ,
             'actor': item[ 4].strip()[ 3:] ,
             'type': item[ 5].strip()[ 3:] ,
             'area': item[ 6].strip()[ 3:] ,
             'language': item[ 7].strip()[ 3:] ,
             'time': item[ 8].strip()[ 3:]
        }


def  write_to_file(content):
     with  open( 'movie-hot.txt' 'a' encoding= 'utf-8'as f:
        f.write(json.dumps(content ensure_ascii= False) +  ' \n ')
        f.close()


def  main():
    url = 'https://www.taopiaopiao.com/showList.htm'
    html = get_one_page(url)
     for item  in parse_one_page(html):
         print(item)
        write_to_file(item)

if __name__ ==  '__main__':
       main()


结果:
f09314f5878a685c3256130bc49a0674502b6f53

三、爬取美团(深圳)美食店铺信息,评分大于4.0分的店铺

做为一名吃货,想知道我所在是城市的美食店,所以爬取评分较高的店铺信息:

eff3fd8f412f77c7ec54dd9d957e4ad206728d09



美团的这个网页的不同之处在于,全部是通过js渲染生成的,所以我这边是拿到页面后,在js里面查找到的数据,然后用正则来匹配。

import requests
from multiprocessing  import Pool
from requests.exceptions  import RequestException
import re
import json
"""
author  朱培
title   爬取美团(深圳)美食店铺信息,评分大于4.0分的店铺

"""
def  get_one_page(url):
     try:
        headers = {
             "user-agent"'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'}

        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):

    pattern = re.compile( '"poiId":(.*?),"frontImg":"(.*?)","title":"(.*?)","avgScore":(.*?),"allCommentNum":(.*?)'
    + ',"address":"(.*?)","avgPrice":(.*?),' re.S)

    items = re.findall(pattern html)
     for item  in items:
         if  float(item[ 3]) >=  4.0:
             yield {
                 'poiId': item[ 0] ,
                 'frontImg': item[ 1] ,
                 'title': item[ 2] ,
                 'avgScore': item[ 3] ,
                 'allCommentNum':item[ 4] ,
                 'address': item[ 5] ,
                 'avgPrice': item[ 6]
            }


def  write_to_file(content):
     with  open( 'food-meituan.txt' 'a' encoding= 'utf-8'as f:
        f.write(json.dumps(content ensure_ascii= False) +  ' \n ')
        f.close()


def  main(n):
    url = 'http://sz.meituan.com/meishi/pn'+ str(n)+ '/'
    html = get_one_page(url)

     for item  in parse_one_page(html):
         print(item)
        write_to_file(item)

if __name__ ==  '__main__':
     #for i in range(32):
    #     main(i)
    pool = Pool()
    pool.map(main for in  range( 32)])


结果如下:

391899ec09b2dd677c0a9e8d3c7f13fa0ddd3d97

对于后期,可以选择把这个数据落库,常用的可以放在mongodb或者mysql数据库中进行存储。
目录
相关文章
|
24天前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
221 7
|
28天前
|
数据采集 Web App开发 数据安全/隐私保护
实战:Python爬虫如何模拟登录与维持会话状态
实战:Python爬虫如何模拟登录与维持会话状态
|
1月前
|
JSON 算法 API
Python采集淘宝商品评论API接口及JSON数据返回全程指南
Python采集淘宝商品评论API接口及JSON数据返回全程指南
|
1月前
|
存储 分布式计算 测试技术
Python学习之旅:从基础到实战第三章
总体来说,第三章是Python学习路程中的一个重要里程碑,它不仅加深了对基础概念的理解,还引入了更多高级特性,为后续的深入学习和实际应用打下坚实的基础。通过这一章的学习,读者应该能够更好地理解Python编程的核心概念,并准备好应对更复杂的编程挑战。
94 12
|
1月前
|
存储 数据采集 监控
Python文件操作全攻略:从基础到高级实战
本文系统讲解Python文件操作核心技巧,涵盖基础读写、指针控制、异常处理及大文件分块处理等实战场景。结合日志分析、CSV清洗等案例,助你高效掌握文本与二进制文件处理,提升程序健壮性与开发效率。(238字)
234 1
|
25天前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
197 0
|
1月前
|
机器学习/深度学习 监控 数据挖掘
Python 高效清理 Excel 空白行列:从原理到实战
本文介绍如何使用Python的openpyxl库自动清理Excel中的空白行列。通过代码实现高效识别并删除无数据的行与列,解决文件臃肿、读取错误等问题,提升数据处理效率与准确性,适用于各类批量Excel清理任务。
315 0
|
2月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
258 102
|
2月前
|
数据采集 机器学习/深度学习 算法框架/工具
Python:现代编程的瑞士军刀
Python:现代编程的瑞士军刀
292 104
|
2月前
|
人工智能 自然语言处理 算法框架/工具
Python:现代编程的首选语言
Python:现代编程的首选语言
247 103

推荐镜像

更多