python爬虫豆瓣TOP250电影信息并写入数据库

初步完成一个页面的数据爬取与写入数据库

import requests
import pymysql
from loguru import logger
from lxml import etree

db = pymysql.connect(host='localhost', port=3306, user='root', passwd='1234', db='db', charset='utf8')
logger.info("正在连接到数据库")
cursor = db.cursor()
cursor.execute("DROP TABLE IF EXISTS movie")

sql = 'CREATE TABLE	movie(name CHAR(255),year int,country char(255),director char(255),type CHAR(20),sorce char(20), ' \
      'notes char(255)) '
cursor.execute(sql)
logger.info("创建表格")


def get_html():
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/92.0.4515.159 Safari/537.36'}
    url = 'https://movie.douban.com/top250'
    resp = requests.get(url, headers=headers)
    html = resp.text
    resp.close()
    return html


if __name__ == '__main__':
    logger.info("执行主程序...")
    xhtml = etree.HTML(get_html())
    logger.info("...")
    names = xhtml.xpath('/html/body/div[3]/div[1]/div/div[1]/ol/li/div/div[2]/div[1]/a/span[1]/text()')
    logger.info("已完成电影名字的抓取...")

    notes = xhtml.xpath('/html/body/div[3]/div[1]/div/div[1]/ol/li/div/div[2]/div[2]/p[2]/span/text()')
    logger.info("已完成电影标语的抓取...")

    sorce = xhtml.xpath('/html/body/div[3]/div[1]/div/div[1]/ol/li/div/div[2]/div[2]/div/span[2]/text()')
    logger.info("已完成电影评分的抓取...")

    years = xhtml.xpath('/html/body/div[3]/div[1]/div/div[1]/ol/li/div/div[2]/div[2]/p[1]/text()[2]')
    logger.info("已完成电影年份,国家,类型的抓取...")

    # 获取下标,直接用字符串截取年份,国家,类型
    # print(years[0].index('1'))
    # for i in range(len(years)):
    #     print(years[i][29:33])
    # print(years[0].index('美'))
    # print(years[0][36:38])

    # 方法二 使用split("/")
    # print(years[0])
    # print(years[1])
    # print(years[1].split("/")[-1])

    directors = xhtml.xpath('/html/body/div[3]/div[1]/div/div[1]/ol/li/div/div[2]/div[2]/p[1]/text()[1]')
    logger.info("已完成电影导演的抓取...")

    # print(re.match(re.compile(r'\d{4}')),years[0])

    # for i  in range(len(directors)):
    #     print((directors[i].split(':')[1])[:-2])

    # 同时使用split("/")  和 字符串下标截取
    # print(directors[1])
    # print((directors[1].split(':')[1])[:-2])

    for i in range(len(sorce)):
        sql = "insert into movie(name,year,country,sorce,director,type,notes) values(%s,%s,%s,%s,%s,%s,%s)"
        par = (names[i], years[i][29:33], years[i].split("/")[-1],sorce[i],(directors[i].split(':')[1])[:-2], years[i].split("/")[-2],notes[i])
        cursor.execute(sql, par)
        db.commit()
    logger.info("数据已经写入表格中...")

    db.close()

# class LinkMysql():
#     def __init__(self):
#         self.db = pymysql.connect(host='localhost', port=3306, user='root', passwd='1234', db='db', charset='utf8')
#         logger.info("正在连接到数据库")
#         self.cursor = self.db.cursor()

以上面为模板,找到豆瓣翻页后网址的规律,重新封装函数 

去掉了note 字段

import requests
import pymysql
from loguru import logger
from lxml import etree
from faker import Faker

db = pymysql.connect(host='localhost', port=3306, user='root', passwd='1234', db='db', charset='utf8')
logger.info("正在连接到数据库")
cursor = db.cursor()
cursor.execute("DROP TABLE IF EXISTS movie")

sql = 'CREATE TABLE	movie(name CHAR(255),year int,country char(255),director char(255),type varchar(255),score char(20)) '
cursor.execute(sql)
logger.info("创建表格")


def get_xhtml(num=0):
    # 代理ip
    # ip_list = ['60.186.41.131:9000', '175.7.199.253:3256', '118.190.244.234:3128', '112.250.107.37:53281']
    # i = random.choice(ip_list)
    # proxy = {
    #     'http': i
    # }
    # print(proxy)

    # 随时改变UA
    # faker = Faker()

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/92.0.4515.159 Safari/537.36',
        'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,"
                  "application/signed-exchange;v=b3;q=0.9 ",
        'origin': 'https://movie.douban.com'
    }

    url = f'https://movie.douban.com/top250?start={num}&filter='

    logger.info("正在发送请求...")
    resp = requests.get(url, headers=headers)
    logger.info("正在响应...")
    html = resp.text
    resp.close()
    xhtml = etree.HTML(html)
    return xhtml


if __name__ == '__main__':
    for i in range(10):
        logger.info("执行主程序...")
        xhtml = get_xhtml(25 * i)
        logger.info(f"-----正在抓取第{i + 1}页内容-----")
        names = xhtml.xpath('/html/body/div[3]/div[1]/div/div[1]/ol/li/div/div[2]/div[1]/a/span[1]/text()')
        print(names)

        logger.info("已完成电影名字的抓取...")
        notes = xhtml.xpath('/html/body/div[3]/div[1]/div/div[1]/ol/li/div/div[2]/div[2]/p[2]/span/text()')
        logger.info("已完成电影标语的抓取...")
        sorce = xhtml.xpath('/html/body/div[3]/div[1]/div/div[1]/ol/li/div/div[2]/div[2]/div/span[2]/text()')
        logger.info("已完成电影评分的抓取...")
        years = xhtml.xpath('/html/body/div[3]/div[1]/div/div[1]/ol/li/div/div[2]/div[2]/p[1]/text()[2]')
        logger.info("已完成电影年份,国家,类型的抓取...")
        directors = xhtml.xpath('/html/body/div[3]/div[1]/div/div[1]/ol/li/div/div[2]/div[2]/p[1]/text()[1]')
        logger.info("已完成电影导演的抓取...")

        for j in range(len(sorce)):
            print(names[j])
            print(years[j][29:33], years[j].split("/")[-1], sorce[j], (directors[j].split(':')[1])[:-2],years[j].split("/")[-2])
            sql = "insert into movie(name,year,country,score,director,type) values(%s,%s,%s,%s,%s,%s)"
            par = (names[j], years[j][29:33], years[j].split("/")[-1], sorce[j], (directors[j].split(':')[1])[:-2],
                   years[j].split("/")[-2])
            cursor.execute(sql, par)
            db.commit()
        logger.info("数据已经写入表格中...")

        # db.close()

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python爬虫是一种利用Python编程语言来获取互联网上的数据的技术。而豆瓣电影是一个知名的电影评分和推荐网站,提供了大量的电影信息。因此,使用Python爬虫可以方便地获取豆瓣电影的相关数据。 要实现Python爬取豆瓣电影的功能,可以按照以下步骤进行: 1. 导入所需的库:首先,需要导入一些Python库,如requests、BeautifulSoup等,以便进行网络请求和解析网页。 2. 发送网络请求:使用requests库发送HTTP请求,获取豆瓣电影网页的HTML内容。 3. 解析网页内容:使用BeautifulSoup库解析HTML内容,提取出需要的电影信息,如电影名称、评分、导演、演员等。 4. 存储数据:将提取到的电影信息存储到本地文件或数据库中,以便后续使用或分析。 以下是一个简单的示例代码,用于爬取豆瓣电影Top250电影名称和评分: ```python import requests from bs4 import BeautifulSoup def get_movie_info(url): response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') movie_list = soup.find_all('div', class_='hd') for movie in movie_list: title = movie.a.span.text rating = movie.parent.find('span', class_='rating_num').text print(f'电影名称:{title},评分:{rating}') def main(): for i in range(0, 250, 25): url = f'https://movie.douban.com/top250?start={i}' get_movie_info(url) if __name__ == '__main__': main() ``` 这段代码通过循环访问豆瓣电影Top250的不同页面,获取每个页面上的电影名称和评分,并打印输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值