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数据库中进行存储。
目录
相关文章
|
22小时前
|
SQL 关系型数据库 MySQL
Python与MySQL数据库交互:面试实战
【4月更文挑战第16天】本文介绍了Python与MySQL交互的面试重点,包括使用`mysql-connector-python`或`pymysql`连接数据库、执行SQL查询、异常处理、防止SQL注入、事务管理和ORM框架。易错点包括忘记关闭连接、忽视异常处理、硬编码SQL、忽略事务及过度依赖低效查询。通过理解这些问题和提供策略,可提升面试表现。
15 6
|
1天前
|
索引 Python
如何使用Python的Pandas库进行数据透视表(pivot table)操作?
使用Pandas在Python中创建数据透视表的步骤包括:安装Pandas库,导入它,创建或读取数据(如DataFrame),使用`pd.pivot_table()`指定数据框、行索引、列索引和值,计算聚合函数(如平均分),并可打印或保存结果到文件。这允许对数据进行高效汇总和分析。
7 2
|
2天前
|
JSON 关系型数据库 数据库
《Python 简易速速上手小册》第6章:Python 文件和数据持久化(2024 最新版)
《Python 简易速速上手小册》第6章:Python 文件和数据持久化(2024 最新版)
28 0
|
2天前
|
机器学习/深度学习 Python 数据处理
Python中利用长短期记忆模型LSTM进行时间序列预测分析 - 预测电力负荷数据
Python中利用长短期记忆模型LSTM进行时间序列预测分析 - 预测电力负荷数据
23 0
Python中利用长短期记忆模型LSTM进行时间序列预测分析 - 预测电力负荷数据
|
2天前
|
存储 机器学习/深度学习 数据可视化
Python面板时间序列数据预测:格兰杰因果关系检验Granger causality test药品销售实例与可视化
Python面板时间序列数据预测:格兰杰因果关系检验Granger causality test药品销售实例与可视化
43 6
|
3天前
|
机器学习/深度学习 数据采集 供应链
从数据到决策:scikit-learn在业务分析中的应用
【4月更文挑战第17天】本文探讨了scikit-learn在业务分析中的应用,包括数据预处理、分类、回归和聚类模型的构建,以及模型评估与优化。通过使用scikit-learn,企业能有效处理数据、预测趋势、客户细分并制定决策,从而提升经营效率和市场策略。随着机器学习的发展,scikit-learn在业务分析领域的潜力将持续释放,创造更多价值。
|
3天前
|
算法 数据可视化 Python
Python中LARS和Lasso回归之最小角算法Lars分析波士顿住房数据实例
Python中LARS和Lasso回归之最小角算法Lars分析波士顿住房数据实例
11 0
|
10月前
|
数据采集 Python
python使用aiohttp通过设置代理爬取基金数据
python使用aiohttp通过设置代理爬取基金数据
|
10月前
|
数据安全/隐私保护 数据格式 Python
python爬取快手商品数据
python爬取快手商品数据
466 1
|
10月前
|
数据采集 Web App开发 JSON
python爬取共享单车悄然涨价大众的评论数据
python爬取共享单车悄然涨价大众的评论数据