【python爬虫简单案例】通过接口爬取猫眼全国电影院信息

之前一直想了解一下python的爬虫功能,决定从github上开始学习。一个非常好的库来自于小帅比的python教程。然后决定先做一个小例子,爬取全国的电影院信息。
之后在贴吧一个帖子中看到有个方便的api接口:【求助】想爬虫获取猫眼网全国的影院信息,不会切换城市。基本思路就是很明确了,爬取城市JSON信息解析→爬取各城市JSON电影院信息解析→存储到sqlite数据库中。因为我本身做qt开发,决定再做个qt界面显示和添加删除信息,也算是练下数据库操作。
全部源码: MartinChan3/CinemasData
爬虫源码:

import requests
import json
import sqlite3

conn = sqlite3.connect('f:/cinemas.db')
c = conn.cursor()
c.execute('create table if not exists cinemas(id int, name text, mark int, address text, sellPrice float, regionId int, regionName text)')
print(u'数据库已打开')

class Cinema: 
    def __init__(self, name, id, mark, address, sellPrice):
        self.name = name
        self.id = id 
        self.mark = mark
        self.address = address
        self.sellPrice = sellPrice

class RegionCinema:
    def __init__(self, regionId, regionName, regionPinyin):
        self.id = regionId
        self.name = regionName
        self.pinyin = regionPinyin
        self.cinemas = []
    def append(self, cinema):
        self.cinemas.append(cinema)

def main():
    list = get_city_list()
    fill_cinemas_info(list)
    
def get_city_list():
    jsondata = requests.get("https://maoyan.com/ajax/cities")
    j = json.loads(jsondata.content)

    domesticCinemas = []
    for key in j.keys():
        if ('letterMap' == key):
            letterMapInfo = j.get(key)
            if isinstance(letterMapInfo,dict):
                for key2 in letterMapInfo.keys():  #获取各字母开头
                    letterVal = letterMapInfo.get(key2)
                    if isinstance(letterVal, list): #获取各cities
                        for info in letterVal:
                            print(info["id"], info["nm"], info["py"] )
                            sRegionCinema = RegionCinema(info["id"], info["nm"], info["py"])
                            domesticCinemas.append(sRegionCinema)
    return domesticCinemas
                            
def fill_cinemas_info(list):
    for sItem in list: 
        tUrl = "https://m.maoyan.com/ajax/cinemaList?day=2018-09-21&offset=0&limit=2000&cityId=" + str(sItem.id)
        print('目前尝试爬取城市:'+ sItem.name)
        fill_single_city_info(tUrl, sItem)
        print('爬取完毕:' + sItem.name)
    return
        
def fill_single_city_info(url, sItem):
    jsondata = requests.get(url)
    jsonInfo = jsondata.json()
    for key in jsonInfo.keys():
        if ("cinemas" == key):
            cinemasInfo = jsonInfo.get(key)
            for item2 in cinemasInfo:
                sellPricep = 0
                if item2.__contains__('sellPrice'):
                    sellPricep = item2['sellPrice']
                sCinema = Cinema(item2["nm"], item2["id"], item2["mark"], item2["addr"], sellPricep)
                sItem.append(sCinema)
                # 写入数据库
                sellPricesql = 0.0
                if (sCinema.sellPrice != ''):
                    sellPricesql = float(sCinema.sellPrice)
                singleSqlData = [int(sCinema.id), sCinema.name, int(sCinema.mark), sCinema.address, sellPricesql, int(sItem.id), sItem.name]
                c.execute('insert into cinemas VALUES(?,?,?,?,?,?,?)', singleSqlData)
    conn.commit()            
    return
                                          
if __name__ == "__main__":
    main()

conn.close()

从代码看就是很简单的例子。之后基于Qt的QSqlTableModel做了一个简单的查询系统,如下:
【python爬虫简单案例】通过接口爬取猫眼全国电影院信息_第1张图片本来想更进一步做一个有趣的全国县电影院数量排行榜的,还有利用现有的python绘图插件绘制一个全国电影院热力图,结果……Emmm有时间再做吧。

你可能感兴趣的:(爬虫,qt)