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数据库中进行存储。
目录
相关文章
|
30天前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
|
27天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
7天前
|
数据采集 Web App开发 监控
Python爬虫:爱奇艺榜单数据的实时监控
Python爬虫:爱奇艺榜单数据的实时监控
|
28天前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
46 10
|
29天前
|
数据采集 分布式计算 大数据
构建高效的数据管道:使用Python进行ETL任务
在数据驱动的世界中,高效地处理和移动数据是至关重要的。本文将引导你通过一个实际的Python ETL(提取、转换、加载)项目,从概念到实现。我们将探索如何设计一个灵活且可扩展的数据管道,确保数据的准确性和完整性。无论你是数据工程师、分析师还是任何对数据处理感兴趣的人,这篇文章都将成为你工具箱中的宝贵资源。
|
2月前
|
算法 Unix 数据库
Python编程入门:从基础到实战
本篇文章将带你进入Python编程的奇妙世界。我们将从最基础的概念开始,逐步深入,最后通过一个实际的项目案例,让你真正体验到Python编程的乐趣和实用性。无论你是编程新手,还是有一定基础的开发者,这篇文章都将为你提供有价值的信息和知识。让我们一起探索Python的世界吧!
|
29天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
16天前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
102 80
|
2月前
|
存储 索引 Python
Python编程数据结构的深入理解
深入理解 Python 中的数据结构是提高编程能力的重要途径。通过合理选择和使用数据结构,可以提高程序的效率和质量
150 59
|
5天前
|
Python
[oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
本文介绍了Python编程中容易出现的问题,特别是函数名、类名和模块名的重新赋值。通过具体示例展示了将内建函数(如`print`、`int`、`max`)或模块名(如`os`)重新赋值为其他类型后,会导致原有功能失效。例如,将`print`赋值为整数后,无法再用其输出内容;将`int`赋值为整数后,无法再进行类型转换。重新赋值后,这些名称失去了原有的功能,可能导致程序错误。总结指出,已有的函数名、类名和模块名不适合覆盖赋新值,否则会失去原有功能。如果需要使用类似的变量名,建议采用其他命名方式以避免冲突。
27 14