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数据库中进行存储。
目录
相关文章
|
27天前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从基础到实战
【10月更文挑战第36天】本文将带你走进Python的世界,从基础语法出发,逐步深入到实际项目应用。我们将一起探索Python的简洁与强大,通过实例学习如何运用Python解决问题。无论你是编程新手还是希望扩展技能的老手,这篇文章都将为你提供有价值的指导和灵感。让我们一起开启Python编程之旅,用代码书写想法,创造可能。
|
29天前
|
数据库 Python
异步编程不再难!Python asyncio库实战,让你的代码流畅如丝!
在编程中,随着应用复杂度的提升,对并发和异步处理的需求日益增长。Python的asyncio库通过async和await关键字,简化了异步编程,使其变得流畅高效。本文将通过实战示例,介绍异步编程的基本概念、如何使用asyncio编写异步代码以及处理多个异步任务的方法,帮助你掌握异步编程技巧,提高代码性能。
59 4
|
27天前
|
机器学习/深度学习 数据可视化 数据处理
Python数据科学:从基础到实战
Python数据科学:从基础到实战
28 1
|
28天前
|
机器学习/深度学习 JSON API
Python编程实战:构建一个简单的天气预报应用
Python编程实战:构建一个简单的天气预报应用
42 1
|
28天前
|
机器学习/深度学习 数据采集 搜索推荐
利用Python和机器学习构建电影推荐系统
利用Python和机器学习构建电影推荐系统
52 1
|
29天前
|
图形学 Python
SciPy 空间数据2
凸包(Convex Hull)是计算几何中的概念,指包含给定点集的所有凸集的交集。可以通过 `ConvexHull()` 方法创建凸包。示例代码展示了如何使用 `scipy` 库和 `matplotlib` 绘制给定点集的凸包。
27 1
|
24天前
|
数据采集 存储 数据处理
探索Python中的异步编程:从基础到实战
【10月更文挑战第39天】在编程世界中,时间就是效率的代名词。Python的异步编程特性,如同给程序穿上了一双翅膀,让它们在执行任务时飞得更高、更快。本文将带你领略Python异步编程的魅力,从理解其背后的原理到掌握实际应用的技巧,我们不仅会讨论理论基础,还会通过实际代码示例,展示如何利用这些知识来提升你的程序性能。准备好让你的Python代码“起飞”了吗?让我们开始这场异步编程的旅程!
35 0
|
27天前
|
并行计算 数据挖掘 大数据
Python数据分析实战:利用Pandas处理大数据集
Python数据分析实战:利用Pandas处理大数据集
|
29天前
|
索引 Python
SciPy 空间数据1
SciPy 通过 `scipy.spatial` 模块处理空间数据,如判断点是否在边界内、计算最近点等。三角测量是通过测量角度来确定目标距离的方法。多边形的三角测量可将其分解为多个三角形,用于计算面积。Delaunay 三角剖分是一种常用方法,可以对一系列点进行三角剖分。示例代码展示了如何使用 `Delaunay()` 函数创建三角形并绘制。
31 0
|
18天前
|
存储 数据挖掘 开发者
Python编程入门:从零到英雄
在这篇文章中,我们将一起踏上Python编程的奇幻之旅。无论你是编程新手,还是希望拓展技能的开发者,本教程都将为你提供一条清晰的道路,引导你从基础语法走向实际应用。通过精心设计的代码示例和练习,你将学会如何用Python解决实际问题,并准备好迎接更复杂的编程挑战。让我们一起探索这个强大的语言,开启你的编程生涯吧!