python2.7爬取豆瓣电影top250并写入到TXT,Excel,MySQL数据库

时间:2023-01-25 12:31:59

python2.7爬取豆瓣电影top250并分别写入到TXT,Excel,MySQL数据库

1.任务

  • 爬取豆瓣电影top250

  • 以txt文件保存

  • 以Excel文档保存

  • 将数据录入数据库

2.分析

  • 电影链接采集:

python2.7爬取豆瓣电影top250并写入到TXT,Excel,MySQL数据库

可以看到电影链接放在<a class="" href=" ">中,因此可以用re.compile(r'<a class="" href="(.*)">')进行匹配。

如果re.compile(r'<a class="" href="https://movie.douban.com/subject/(.*)/">')进行匹配,得到的结果就是诸如:1292052这样的数字,而不是链接了。

3.程序

总的来说,程序比较简单,这里不再说明,直接上程序。

#!/usr/bin/python
# -*- coding: utf-8 -*- #
import requests,sys,re,openpyxl,MySQLdb,time
from bs4 import BeautifulSoup

reload(sys)
sys.setdefaultencoding('utf-8')
print '正在从豆瓣电影Top250抓取数据......'
# --------------------------创建列表用于存放数据-----------------------------#
nameList=[]
linkList=[]

#---------------------------------爬取模块------------------------------------#
def topMovie():
    for page in range(10):
        url='https://movie.douban.com/top250?start='+str(page*25)
        print '正在爬取第---'+str(page+1)+'---页......'
        html=requests.get(url)
        html.raise_for_status()
        try:
            soup=BeautifulSoup(html.text,'html.parser')
            soup=str(soup) # 利用正则表达式需要将网页文本转换成字符串
            name=re.compile(r'<span class="title">(.*)</span>')
            links=re.compile(r'<a class="" href="(.*)">')
            movieNames=re.findall(name,soup)
            movieLinks=re.findall(links,soup)
            for name in movieNames:
                if name.find('/')==-1: # 剔除英文名(英文名特征是含有'/')
                    nameList.append(name)
            for link in movieLinks:
                linkList.append(link)
        except Exception as e:
            print e
    print '爬取完毕!'
    return nameList,linkList

# ---------------------------------储存为文本文件-----------------------------------#
def save_to_txt():
    print 'txt文件存储中......'
    try:
        f=open('data.txt','w')
        for i in range(250):
            f.write(nameList[i])
            f.write('\t'*3)
            f.write(linkList[i])
            f.write('\n')
        f.close()
    except Exception as e:
        print e
    print 'txt文件存储结束!'

# ---------------------------------储存为excel文件-----------------------------------#
def save_to_Excel():
    print 'Excel文件存储中......'
    try:
        wb=openpyxl.Workbook()
        sheet=wb.get_active_sheet()
        sheet.title='Movie Top 250'
        for i in range(1,251):
            one='a'+str(i)
            two='b'+str(i)
            sheet[one]=nameList[i-1]
            sheet[two]=linkList[i-1]
        wb.save(ur'豆瓣电影Top250.xlsx') # 保证文件名为中文
    except Exception as e:
        print e
    print 'Excel文件存储结束!'

# ---------------------------------储存到文数据库-----------------------------------#
def save_to_MySQL():
    print 'MySQL数据库存储中......'
    try:
        conn = MySQLdb.connect(host="127.0.0.1", user="root", passwd="******", db="test", charset="utf8")
        cursor = conn.cursor()
        print "数据库连接成功"
        cursor.execute('Drop table if EXISTS MovieTop250') # 如果表存在就删除
        time.sleep(3)
        cursor.execute('''create table if not EXISTS MovieTop250(
                           movieName VARCHAR (200),
                           link VARCHAR (200))''')
        for i in range(250):
            sql='insert into MovieTop250(movieName,link) VALUES (%s,%s)'
            param=(nameList[i],linkList[i])
            cursor.execute(sql,param)
            conn.commit()
        cursor.close()
        conn.close()
    except Exception as e:
        print e
    print 'MySQL数据库存储结束!'

# -------------------------------------主模块--------------------------------------#
if __name__=="__main__":
    try:
        topMovie()
        save_to_txt()
        save_to_Excel()
        save_to_MySQL()
    except Exception as e:
        print e