这个小学期Python大作业搞了个获取IMDB TOP 250电影全部信息的爬虫。第二次写爬虫,比在暑假集训时写的熟练多了。欢迎大家评论。

 '''
************************************************
*Time:2017.9.11
*Target:All movies' information of IMDB TOP_250
*Resources:http://www.imdb.cn/IMDB250/
************************************************
''' import re
import requests
import numpy as np
import matplotlib.pyplot as plt
from bs4 import BeautifulSoup num = 1 #电影计数
All_txt = [] #全部电影的信息
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'}#浏览器代理
def getHTMLText(url):
try:
#print(url)
r = requests.get( url,headers = headers )
#print(r)
r.encoding = 'utf-8'
return r.text
except:
return "错误" #从每一部电影的页面中获取全部信息
def get_all_information(url,page):
global num,All_txt
txt = getHTMLText(url)
if txt != "错误":
print('page'+str(page)+' NO.'+str(num)+' Get it!')
if num == 247:
print('Finished!!!')
soup = BeautifulSoup(txt,"html.parser")
Cname,Ename,Score,title,Actor,Starring,Infor = '','','','','','','' #TOP250-film_Chinese_name&Score
infor_1 = soup.find_all('div',class_ = 'hdd')
rel = '<h3>'+'[\s\S]*?'+'</h3>'
pattern = re.compile(rel)
Cname = ''.join(pattern.findall(str(infor_1[0])))
Cname = Cname.replace('<h3>','').replace('</h3>','')
#print(Cname)
#find_the_year & save
rel = '('+'[\s\S]*?'+')'
pattern = re.compile(rel)
time_ = ''.join(pattern.findall(Cname))
#print(time_)
with open('time.txt','a',encoding='utf-8') as t:
t.write( time_.replace('(','').replace(')','') + '\n' )
#find_Score
rel = '<i>'+'[\s\S]*?'+'</i>'
pattern = re.compile(rel)
Score = ''.join(pattern.findall(str(infor_1[0])))
Score = Score.replace('<i>','').replace('</i>','')
#print(Cname,Score) #TOP250-film_many_infor
now = soup.find_all('div',class_ = 'bdd clear')
#print(now[0])
a = BeautifulSoup(str(now[0]), "html.parser")
many_infor = a.find_all('li') #TOP250-film_Ename
Ename = str(many_infor[0]).replace('<li>','').replace('<i>','').replace('</i>','').replace('</li>','').replace('<a>','').replace('</a>','')
#TOP250-film_Actor
Actor_temp = BeautifulSoup(str(many_infor[2]), "html.parser").find_all('a')
Actor = Actor_temp[0].get_text().replace('导演:','')
#TOP250-film_Starring
Starring_temp = BeautifulSoup(str(many_infor[3]), "html.parser").find_all('a')
for i in Starring_temp:
Starring += i.get_text().replace(' ','') + ' '
#print(Starring) #Top-film_Infor
for j in range(4,7):
Infor_temp = BeautifulSoup(str(many_infor[j]), "html.parser")
for i in Infor_temp.children:
Infor += i.get_text().replace(' ','') + ' '
Infor += '\n'
#print(Infor) #TOP250-film_Synopsis
content = soup.find_all('div',class_ = 'fk-4 clear')
#print(content)
soup_con = BeautifulSoup(str(content[0]), "html.parser")
title = soup_con.find_all('div',class_ = 'hdd')
title = str(title[0]).replace('<div class="hdd">','').replace('</div>','\n')
#print(title)
content_1 = soup_con.find_all('div',class_ = 'bdd clear')
content_1 = str(content_1[0]).replace('<div class="bdd clear" style="font-size:15px">','').replace('</div>','')
content_1 = content_1.replace('<!-- <p><a href="#">更多剧情 >></a></p> -->','').replace('<br/>','\n') #Save_all_information
All_txt.append('第'+str(num)+'部'+'\n')
All_txt.append( Cname+'\n' )
All_txt.append( '【英文名】'+Ename+'\n' )
All_txt.append( '【评分】'+Score+'\n' )
All_txt.append( '【导演】'+Actor+'\n' )
All_txt.append( '【主演】'+Starring+'\n' )
All_txt.append( Infor+'\n' )
All_txt.append( title+'\n'+content_1+'\n' )
All_txt.append('\n')
num += 1 #在每一页中得到当前页的全部电影的url
def getin_one(url,page):
txt = getHTMLText(url)
soup = BeautifulSoup(txt, "html.parser")
#print(soup)
temp = soup.find_all('div',class_="ss-3 clear")
rel = '<a href="' + '[\s\S]*?' + '">'
pattern = re.compile(rel)
All_url = pattern.findall( str(temp[0]) )
for i in range(len(All_url)):
temp_url = 'http://www.imdb.cn'+All_url[i].replace('<a href="','').replace('">','')
get_all_information(temp_url,page)
#print(All_url) #将所有电影的年份统计并生成条形图
def Analyze_some_infor():
plt.rc('font', family='SimHei', size=13)#字体及大小
#Analyze_time
file = open('time.txt')
a,b,c,d,e,f = 0,0,0,0,0,0
for line in file:
line = eval(line)
if line == 0:
f += 1
elif line < 1940 and line >= 1920:
a += 1
elif line < 1960 and line >= 1940:
b += 1
elif line < 1980 and line >= 1960:
c += 1
elif line < 2000 and line >= 1980:
d += 1
else:
e += 1
times = [a,b,c,d,e,f]
range_time = ['1920-1940','1940-1960','1960-1980','1980-2000','2000-现在','无信息']
idx = np.arange(len(range_time))
width = 0.5
plt.bar(idx,times,width,color='green')
plt.xticks(idx+width/2, range_time, rotation=40)
plt.xlabel('电影年代')
plt.ylabel('数目')
plt.savefig('time_pic.jpg')
plt.show() def main():
global All_txt
getin_one('http://www.imdb.cn/IMDB250/',1)
for i in range(2,10):
getin_one( 'http://www.imdb.cn/imdb250/'+str(i) , i )
#将已有内容清空
with open('All_infor.txt','w',encoding='utf-8') as x:
pass
with open('All_infor.txt','a',encoding='utf-8') as x:
for i in All_txt:
x.write(i)
Analyze_some_infor() main()

作者: LB919
出处:http://www.cnblogs.com/L1B0/
该文章为LB919投入了时间和精力的原创;
如有转载,荣幸之至!请随手标明出处;

IMDB TOP 250爬虫的更多相关文章

  1. 吐血推荐250部必看电影下载 IMDB TOP 250 download

    中文名: IMDB Top 250合辑 TLF-MiniSD收藏版英文名: IMDB Top 250 TLF-MiniSD Collection版本: (更新至TOP119)[MiniSD]发行日期: ...

  2. Douban Top 250爬虫

    # Ref: https://fishc.com.cn/forum.php?mod=viewthread&tid=101887&extra=page%3D1%26filter%3Dty ...

  3. 爬取豆瓣电影TOP 250的电影存储到mongodb中

    爬取豆瓣电影TOP 250的电影存储到mongodb中 1.创建项目sp1 PS D:\scrapy> scrapy.exe startproject douban 2.创建一个爬虫 PS D: ...

  4. 用python爬取豆瓣电影Top 250

    首先,打开豆瓣电影Top 250,然后进行网页分析.找到它的Host和User-agent,并保存下来. 然后,我们通过翻页,查看各页面的url,发现规律: 第一页:https://movie.dou ...

  5. Python开发爬虫之静态网页抓取篇:爬取“豆瓣电影 Top 250”电影数据

    所谓静态页面是指纯粹的HTML格式的页面,这样的页面在浏览器中展示的内容都在HTML源码中. 目标:爬取豆瓣电影TOP250的所有电影名称,网址为:https://movie.douban.com/t ...

  6. Python爬虫-豆瓣电影 Top 250

    爬取的网页地址为:https://movie.douban.com/top250 打开网页后,可观察到:TOP250的电影被分成了10个页面来展示,每个页面有25个电影. 那么要爬取所有电影的信息,就 ...

  7. 豆瓣电影 Top 250

    import refrom urllib.request import urlopen def getPage(url): # 获取网页的字符串 response = urlopen(url) ret ...

  8. IMDB-TOP_250-爬虫

    这个小学期Python大作业搞了个获取IMDB TOP 250电影全部信息的爬虫.第二次写爬虫,比在暑假集训时写的熟练多了.欢迎大家评论. ''' ************************** ...

  9. Livid : 在 26 岁时写给 18 岁的自己

    转载自: https://livid.v2ex.com/essays/2012/01/24/a-letter-from-26-to-18.html 在 26 岁时写给 18 岁的自己 Jan 24, ...

随机推荐

  1. python3.6如何安装pymssql

    使用pip install pymssql安装时,总是会出现UnicodeDecodeError.于是下载了适用的pymssql.whl进行安装,详细可参考 https://docs.microsof ...

  2. win10 UWP 你写我读

    想要电脑读出我们写的内容,在win10,很简单 其实这个技术在windows7就有了,但是现在win10让写出一个你写我读的软件很简单. 我们需要一个类MediaElement来播放,因为window ...

  3. 解决 Win10 UWP 无法使用 ss 连接

    一旦使用了 ss, 那么很多应用就无法连接网络. 本文提供一个方法可以简单使用ss提供的代理. 多谢 wtwsgs 提供方法:http://blog.csdn.net/wtwsgs/article/d ...

  4. LINUX下分区命令Parted详解

    通常划分分区工具我们用的比较多是fdisk命令,但是现在由于磁盘越来越廉价,而且磁盘空间越来越大.而fdisk工具他对分区是有大小限制的,它只能划分小于2T的磁盘.现在的磁盘空间已经远远大于2T,有两 ...

  5. Tomcat针对网站打开速度慢进行局部优化方案

    首先打开tomcat下的conf文件夹里面的server.xml找到Tomcat端口号一栏 <Connector port="8081" protocol="HTT ...

  6. LINUX 笔记-crontab命令

    用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下: minute   hour   da ...

  7. LeetCode 448. Find All Numbers Disappeared in an Array (在数组中找到没有出现的数字)

    Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and ot ...

  8. 2.动手实操Apache ZooKeeper

    Tips 做一个终身学习的人! 日拱一卒,功不唐捐. 在本节中,我们将讲解如何下载并安装Apache ZooKeeper,以便我们可以直接开始使用ZooKeeper. 本部分旨在通过提供详细的安装和使 ...

  9. JDBC 连接数据库的步骤

    1.JDBC (JAVA DATABASE CONNECTION) (Java 数据库 连接)2.JAVA 面向对象的编程语言 (汉语) || || 标准(接口)---->jar包(mysql- ...

  10. 笔记-测试崩溃之memcpy_s

    昨天晚上提测,今天早上测试发来贺电,程序崩溃!!!!!! 而问题出在memcpy_s errno_t memcpy_s( void *dest, size_t numberOfElements, co ...