python2.7爬取豆瓣电影top250并分别写入到TXT,Excel,MySQL数据库
1.任务
-
爬取豆瓣电影top250
-
以txt文件保存
-
以Excel文档保存
-
将数据录入数据库
2.分析
-
电影中文名的采集可以查看:http://www.cnblogs.com/carpenterworm/p/6026274.html
-
电影链接采集:
可以看到电影链接放在<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