python爬虫爬取豆瓣电影TOP250


前言

这几天在学python,跟着B站做了一个爬取豆瓣Top250电影的项目,我这里数据库用的是Mysql。


一、什么是爬虫?

模拟客户端发送网络请求,接收请求响应,按照一定的规则自动地抓取互联网信息的程序。

二、使用步骤

1.抓取网页,并返回从网页中获取到的源码

通过url向服务器发起request请求,请求可以包含额外的header信息。
代码如下(示例):

#得到指定一个URL的网页内容
def askURL(url):
    head = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36"}
    request = urllib.request.Request(url,headers=head)
    html = ""
    try:
        response = urllib.request.urlopen(request)
        html = response.read().decode("utf-8")
        #print(html)
    except urllib.error.URLError as e:
        if hasattr(e,"code"):
            print(e.code)
        if hasattr(e,"reason"):
            print(e.reason)
    return html

2.解析数据

这里用了正则表达式进行解析
代码如下(示例):

def getData(baseurl):
    datalist = []
    for i in range(0,10):
        url = baseurl + str(i*25)
        html = askURL(url)  #保存从网页中获取到的源码

        #逐个解析数据
        soup = BeautifulSoup(html,"html.parser")
        for item in soup.find_all('div',class_="item"):    #查找符合要求的字符串,形成列表
            #print(item)
            data = [] #保存一部电影的所有信息
            item = str(item)

            #正则表达式查找指定的字符
            link = re.findall(findLink,item)[0]
            data.append(link)

            imgSrc = re.findall(findImgSrc,item)[0]
            data.append(imgSrc)

            titles = re.findall(findTitle, item)
            if len(titles)==2:
                ctitle = titles[0]
                otitle = titles[1].replace("/","")  #替换符号
                data.append(ctitle)
                data.append(otitle)
            else:
                data.append(titles[0])
                data.append('') #占位留空

            rating = re.findall(findRating, item)[0]
            data.append(rating)

            judgeNum = re.findall(findJudge, item)[0]
            data.append(judgeNum)

            inq = re.findall(findInq,item)
            if len(inq) != 0:
               inq = inq[0].replace("。","")
               data.append(inq)
            else:
                data.append('')

            bd = re.findall(findBd,item)[0]
            bd = re.sub('<br(\s+)?/>(\s+)?',"",bd)
            bd = re.sub('/',"",bd)
            data.append(bd.strip()) #去空格

            datalist.append(data)
    print(datalist)
    return datalist

3.保存数据

首先我们要连接Mysql并创建一个表
代码如下(示例):

#创建一个数据表
def createTest():
    DBHOST = 'localhost'
    DBUSER = 'root'
    DBPASS = 'admin123-'  #密码
    DBNAME = 'test'  #数据库名字
    try:
        db = pymysql.connect(host=DBHOST, user=DBUSER, password=DBPASS, database=DBNAME)
        cur = db.cursor()  # 声明游标
        cur.execute('DROP TABLE IF EXISTS doubanTest')
        sql = '''
            CREATE TABLE doubanTest
            (
            id INT PRIMARY KEY AUTO_INCREMENT,
            info_link TEXT,
            pic_link TEXT,
            cname VARCHAR(255),
            oname VARCHAR(255),
            score FLOAT,
            rated INT,
            instroduction TEXT,
            info text
            );
              '''
        cur.execute(sql)
        print("数据表创建成功!")
    except pymysql.Error as e:
        print("数据表创建失败!" + str(e))

然后我们要把解析完的数据塞进表里
代码如下(示例):

#保存数据
def saveData(datalist):
    createTest()
    DBHOST = 'localhost'
    DBUSER = 'root'
    DBPASS = 'admin123-'  # 密码
    DBNAME = 'test'  # 数据库名字
    try:
        db = pymysql.connect(host=DBHOST, user=DBUSER, password=DBPASS, database=DBNAME)
        cur = db.cursor()  # 声明游标
        for data in datalist:
            for index in range(len(data)):
                if index == 4 or index == 5:
                    continue
                data[index] = '"'+data[index]+'"'
            sql = '''
                  INSERT INTO doubantest(
                  info_link,
                  pic_link,
                  cname,
                  oname,
                  score,
                  rated,
                  instroduction,
                  info
                  ) VALUE(%s)
                  '''%",".join(data)  # 表名  字段名 插入的值
            print(sql)
            cur.execute(sql)  # 将数据进行提交
            db.commit()  # 数据库关闭
        print("数据插入成功!")
    except pymysql.Error as e:
        print("数据插入失败" + str(e))
        db.rollback()  # 数据插入失败返回原先状态

4.完成

在这里插入图片描述

完整代码如下:

# -*- coding = utf-8 -*-
# @Time : 2021/4/26 20:48
# @Author : chen
# @File : douban.py
# @Software : PyCharm

from bs4 import BeautifulSoup    #网页解析,获取数据
import re       #正则表达式,进行文字匹配
import urllib.request,urllib.error      #指定URL,获取网页数据
import xlwt  #进行Excel操作
import pymysql  #进行mysql数据库操作
#创建正则表达式对象
findLink = re.compile(r'<a href="(.*?)">') #影片链接的规则
findImgSrc = re.compile(r'<img.*src="(.*?)"',re.S)  #影片图片的规则 re.s换行符包括在字符中
findTitle = re.compile(r'<span class="title">(.*)</span>')  #影片名的规则
findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')  #影片评分的规则
findJudge = re.compile(r'<span>(\d*)人评价</span>')    #影片评价人数的规则
findInq = re.compile(r'<span class="inq">(.*)</span>')  #影片概况的规则
findBd = re.compile(r'<p class="">(.*?)</p>',re.S)   #影片导演的规则

def main():
    baseurl = "https://movie.douban.com/top250?start="
    # 爬取网页
    datalist = getData(baseurl)
    # 保存数据
    saveData(datalist)


#爬取网页
def getData(baseurl):
    datalist = []
    for i in range(0,10):
        url = baseurl + str(i*25)
        html = askURL(url)  #保存从网页中获取到的源码

        #逐个解析数据
        soup = BeautifulSoup(html,"html.parser")
        for item in soup.find_all('div',class_="item"):    #查找符合要求的字符串,形成列表
            #print(item)
            data = [] #保存一部电影的所有信息
            item = str(item)

            #正则表达式查找指定的字符
            link = re.findall(findLink,item)[0]
            data.append(link)

            imgSrc = re.findall(findImgSrc,item)[0]
            data.append(imgSrc)

            titles = re.findall(findTitle, item)
            if len(titles)==2:
                ctitle = titles[0]
                otitle = titles[1].replace("/","")  #替换符号
                data.append(ctitle)
                data.append(otitle)
            else:
                data.append(titles[0])
                data.append('') #占位留空

            rating = re.findall(findRating, item)[0]
            data.append(rating)

            judgeNum = re.findall(findJudge, item)[0]
            data.append(judgeNum)

            inq = re.findall(findInq,item)
            if len(inq) != 0:
               inq = inq[0].replace("。","")
               data.append(inq)
            else:
                data.append('')

            bd = re.findall(findBd,item)[0]
            bd = re.sub('<br(\s+)?/>(\s+)?',"",bd)
            bd = re.sub('/',"",bd)
            data.append(bd.strip()) #去空格

            datalist.append(data)
    print(datalist)
    return datalist

#得到指定一个URL的网页内容
def askURL(url):
    head = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36"}
    request = urllib.request.Request(url,headers=head)
    html = ""
    try:
        response = urllib.request.urlopen(request)
        html = response.read().decode("utf-8")
        #print(html)
    except urllib.error.URLError as e:
        if hasattr(e,"code"):
            print(e.code)
        if hasattr(e,"reason"):
            print(e.reason)
    return html

#创建一个数据表
def createTest():
    DBHOST = 'localhost'
    DBUSER = 'root'
    DBPASS = 'admin123-'  #密码
    DBNAME = 'test'  #数据库名字
    try:
        db = pymysql.connect(host=DBHOST, user=DBUSER, password=DBPASS, database=DBNAME)
        cur = db.cursor()  # 声明游标
        cur.execute('DROP TABLE IF EXISTS doubanTest')
        sql = '''
            CREATE TABLE doubanTest
            (
            id INT PRIMARY KEY AUTO_INCREMENT,
            info_link TEXT,
            pic_link TEXT,
            cname VARCHAR(255),
            oname VARCHAR(255),
            score FLOAT,
            rated NUMERIC,
            instroduction TEXT,
            info text
            );
              '''
        cur.execute(sql)
        print("数据表创建成功!")
    except pymysql.Error as e:
        print("数据表创建失败!" + str(e))

#保存数据
def saveData(datalist):
    createTest()
    DBHOST = 'localhost'
    DBUSER = 'root'
    DBPASS = 'admin123-'  # 密码
    DBNAME = 'test'  # 数据库名字
    try:
        db = pymysql.connect(host=DBHOST, user=DBUSER, password=DBPASS, database=DBNAME)
        cur = db.cursor()  # 声明游标
        for data in datalist:
            for index in range(len(data)):
                if index == 4 or index == 5:
                    continue
                data[index] = '"'+data[index]+'"'
            sql = '''
                  INSERT INTO doubantest(
                  info_link,
                  pic_link,
                  cname,
                  oname,
                  score,
                  rated,
                  instroduction,
                  info
                  ) VALUE(%s)
                  '''%",".join(data)  # 表名  字段名 插入的值
            print(sql)
            cur.execute(sql)  # 将数据进行提交
            db.commit()  # 数据库关闭
        print("数据插入成功!")
    except pymysql.Error as e:
        print("数据插入失败" + str(e))
        db.rollback()  # 数据插入失败返回原先状态

#入口
if __name__ == '__main__':
    main()

总结

1、发起请求2、获取响应内容 3、解析内容 4、保存数据

### 回答1: 可以使用Python编写爬虫程序,通过豆瓣电影的网站结构和API接口,获取电影的相关信息,包括电影名称、导演、演员、评分、评论等。可以使用Python的第三方库,如requests、BeautifulSoup、Scrapy等,来实现爬取和解析网页的功能。同时,需要注意遵守网站的爬虫规则和法律法规,避免对网站造成不必要的影响和风险。 ### 回答2: 豆瓣电影是一个非常受欢迎的电影社区,积累了大量用户贡献的电影数据,而top250更是公认的经典代表。使用爬虫技术,我们可以轻松地获取这些珍贵的数据并进行分析。 Python作为一种简单易用的编程语言,非常适合用于爬虫开发。我们可以借助Python中的一些爬虫库来进行电影数据的爬取。下面,我将结合具体的代码段来介绍如何使用Python爬虫获取豆瓣电影top250的数据。 首先,你需要安装Python,并下载一些常用的爬虫库,如requests、beautifulsoup等。更进一步地,你可以通过使用Scrapy等框架来进行更加高效的开发。 在开始具体编写代码前,我们需要先确定爬取的目标和需求。豆瓣电影top250的页面由25个页面构成,每个页面都展示了10个电影信息。因此,我们需要先定义一个爬取页面的函数: ```python def getPages(start, num): url = 'https://movie.douban.com/top250?start=' + str(start) + '&filter=' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'} response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') items = soup.select('.item') movies = [] for item in items: movie = [] movie.append(item.select('.title')[0].text.replace(' ', '').replace('\n', '')) movie.append(item.select('.rating_num')[0].text) movie.append(item.select('.quote')[0].text.replace('。', '')) movies.append(movie) return movies ``` 这个函数使用了requests和beautifulsoup库,在请求之后对页面进行解析,最终将所需的电影信息打包成一个嵌套列表返回。getPages()函数需要传入两个参数,分别对应每个页面的起始位置和需要获取多少个电影信息。 接下来,我们可以通过这个函数来获取所有的电影信息了。我们可以定义一个爬取全部数据的函数: ```python def getAllMovies(num): movies = [] for start in range(0, num + 1, 25): pages = getPages(start, 25) movies.extend(pages) return movies ``` 这个函数在循环中调用了上述的getPages()函数,并将返回值拼接到一个列表中。直到爬取到指定数量的电影信息。 以上就是一个简单的Python爬虫脚本了,你只需要运行这个脚本,并指定需要爬取的电影数量,就可以获取到豆瓣电影top250的全部数据了。不仅如此,你还可以将数据进行存储和处理,从而实现更多有趣的功能。 ### 回答3: Python爬虫是一种自动化程序,可用于在网站上进行数据抓取。豆瓣电影是一个非常流行的在线社区,提供了各种电影信息,包括电影评价和用户评价。本文将介绍如何使用Python爬虫程序,从豆瓣电影网站上抓取Top250电影信息。 1.准备工作 在编写Python爬虫之前,我们需要下载并安装Python运行环境,以及必要的第三方库(如Requests和BeautifulSoup)。 2.了解目标网站 在开始编写爬虫之前,我们需要了解目标网站的网页结构和数据存储方式。在该网站上,每个电影都有自己的页面。每个页面都包含了电影的一些基本信息,如电影名称、导演、演员、评分等。 3.识别目标 如果要爬取Top250电影信息,我们需要找到豆瓣电影Top250页面的URL,通过浏览该页面的HTML源代码,识别我们需要抓取的信息在哪里。可以使用浏览器开发者工具(例如Chrome浏览器的开发者工具)来帮助识别。 4.编写爬虫程序 使用Python编写爬虫程序,我们需要首先发送一个HTTP请求到目标URL,并获取该URL的HTML源代码。可以使用Requests库来发送HTTP请求。然后,我们使用BeautifulSoup库解析HTML源代码,并提取我们需要的内容。最后,我们将提取的数据存储到文件中,或将其添加到数据库中。 5.处理错误和异常 在爬取过程中,可能会遇到各种问题和错误。比如,目标网站可能会将我们的请求拒绝,或者是HTML源代码不兼容我们的解析程序。我们需要适当地处理这些错误并调整我们的程序。 6.总结 Python爬虫是一种非常有用的工具,可以向我们提供大量的数据资源。在编写爬虫程序时,我们需要注意一些法律和道德问题,如尊重目标网站的服务条款,避免使用爬虫程序造成危害等。另外,我们需要维护好我们的程序,确保其在长期运行中保持稳定性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值