如何爬虫豆瓣网站的电影信息

作者:坤坤大神2016 何谓爬虫,源自某百科:

网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。

爬虫怎么实现,这是一个好问题,N多年前,google的spider机器人就是一个超级的爬虫程序,这个爬虫机器人游走于全世界的网页之中,分析并归纳这些网页的关联,并且拥有自我学习能力,能够自动更新爬虫策略,以最优方式进行爬虫。

爬虫语言选取,目前主流的爬虫语言是ruby、perl、python以及全世界最好的语言php。

我个人比较喜欢用的语言就是python,第三方库特别多,支持多线程,代码少(人生苦短,我选python)

今天我们实现的代码是爬虫豆瓣的电影数据库,有点难度,非常具有挑战性,编程小白可以忽略此贴

材料需求:

环境搭建:python3语言环境(然而我为什么选择3,参见此教程http://www.runoob.com/python/python-2x-3x.html)

第三方库支持:re、request、bs4、time、pymysql

数据库支持:mysql数据库社区版

代码如下+++++++++++++++++++++++++++++++++++++++

# -*- coding:utf8 -*-

#首先用于确定编码,加上这句

import pymysql

import requests

import re

from time import sleep

from bs4 import BeautifulSoup

global tagname

tagname="1961"

baseUrl = "https://movie.douban.com/tag/"+tagname+"?start=%d&type=T"

def get_movies(start):

   url = baseUrl % start

   lists = []

   proxies = {

       "http": "127.0.0.1:1086",

       "https": "127.0.0.1:1086",

   }

   html = requests.get(url,proxies=proxies)

   soup = BeautifulSoup(html.content, "html.parser")

   items = soup.find_all("tr","item")

   for i in items:

       movie = {}

       movie["rank"] = "0"

       movie["link"] = i.find("a","nbg").get("href")

       movie["mdirecter"]=str(i.find("p", "pl").text)

       movie["poster"] = i.find("a","nbg").find("img").get("src")

       movie["name"] = i.find("a","nbg").find("img").get("alt")

       movie["score"] = i.find("span", "rating_nums").text if(i.find("span", "rating_nums")) else "(暂无评分)"

       movie["quote"] = i.find("span", "inq").text if(i.find("span", "inq")) else "(暂无简介)"

       # print(movie)

       lists.append(movie)

   return lists


if __name__ == "__main__":

   db = pymysql.connect(host="localhost",user="root",password="123456",db="app_movie",charset="utf8")

#兄台,此处要替换成你自己安装mysql设置的用户名、密码

   cursor = db.cursor()

   # cursor.execute("DROP TABLE IF EXISTS MyBlog_dbmovie")

   # createTab = """CREATE TABLE MyBlog_dbmovie(

   #      id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,

   #      mname VARCHAR(20) NOT NULL,

   #      myear VARCHAR(8),

   #      mlist VARCHAR(4),

   #      mlink VARCHAR(50) NOT NULL,

   #      mimage VARCHAR(100) NOT NULL,

   #      mrnum VARCHAR(4),

   #      mdescr VARCHAR(50),

   #      mnp VARCHAR(4),

   #      mdirecter VARCHAR(500),

   #      timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP

   #  )"""

   # cursor.execute(createTab)

   start = 0

   while (start < 1020):

       lists = get_movies(start)

       for i in lists:

           sql = "INSERT INTO `MyBlog_dbmovie` (`mname`, `myear`, `mdirecter`, `mimage`, `mlink`, `mrnum`, `mlist`, `mnp`, `mdescr`) VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s)"

           try:

               cursor.execute(sql, (i["name"], tagname, i["mdirecter"],i["poster"],i["link"] , i["score"], i["rank"],'', i["quote"]))

               db.commit()

               print("标签为"+tagname+",电影名为《"+i["name"]+"》信息...成功插入到数据库中")

           except:

               db.rollback()

       start += 20

       sleep(1)

   db.close()

关于代码的若干解释说明:+++++++++++++++++++++++++++

a,这里设置了一个全局变量tagname,但是更好的做法是将它变成一个list,这样你批量遍历从1888年~2017年的电影只需要6个小时(亲测);

b,代理,这里有条件一定要上代理(proxies可以是代理池),毕竟裸奔,呵呵,你懂的,

c,数据规模,以我的经验,目前全世界电影总的数量不超过5w部,所以成本不是很高。

一些有趣的数据,

统计了这些电影数据,告诉你们一些冷门的知识,

全世界拍的最多的电影是《黄飞鸿系列》,以黄飞鸿命名的84部,另外44部,黄飞鸿是主角,主演黄飞鸿最多的是关德兴老爷子,不是赵文卓也不是李连杰。

世界第一部电影诞生于1888年,然后十年后在法国流行起了小黄片生意(第八艺术源于基层);

香港从1926年开始电影工业起步,电影总量在2010年时候才被大陆超越。最经典的电影系列当属邵逸夫出品;

反思朝鲜战争的电影《猪排山》诞生于中国最困难的1958年,那时候绝大数人填不饱肚子;

可能你对以下的内容也感兴趣:

决战刹马镇——诙谐的生活(决战刹马镇影评)

日本电影音乐的代表人物——久石让

世界各国被禁的第一部电影

韩国电影中那些铁血柔肠的硬汉们

影评《我的唐朝兄弟》

火热榜

发表评论

    微笑 大笑 拽 大哭 奸笑 流汗 喷血 生气 囧 不爽 晕 示爱 卖萌 吃惊 迷离 爱你 吓死了 呵呵