Python轻松搞定豆瓣电影TOP250采集

2023-05-28 0 626

原副标题:Python随心所欲搞掂新浪网影片TOP250收集

1.确认收集最终目标和形式

在已经开始收集以后,他们须要明晰收集最终目标和形式。此次收集的最终目标是新浪网影片TOP250排行榜上大部份影片的详细重要信息,主要包括影片中文名称、编剧、执导、打分、赞扬数目等。

而他们能透过演示应用程序出访新浪网网站,并采用Python中的食腐库BeautifulSoup和requests对网页源码

2.预测网页外部结构

在展开网页导出以后,他们须要先介绍新浪网网站影片TOP250网页的外部结构。关上网页后,他们能辨认出每一影片都被包涵在两个class为“item”的div条码中。而每一div条码外部又包涵数个其它条码,如a、span、p等,那些条码依次包涵了影片的中文名称、编剧、执导、打分等重要信息。

3.演示应用程序出访网页

他们能采用Python中的requests库演示应用程序出访网

python import requests url =”; headers ={ “User-Agent”:”Mozilla/5.0(Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3″} response = requests.get(url, headers=headers) html = response.text

当中,他们须要增设headers,演示应用程序的User-Agent重要信息,以防止被新浪网网站识别为食腐并过滤出访。

4.导出网页源码

python from bs4 import BeautifulSoup soup = BeautifulSoup(html,html.parser) items = soup.find_all(div, class_=item)

当中,find_all方式依照条码名和class特性搜寻大部份具备条件的条码,并回到两个条目。

5.提取影片重要信息

他们能遍历items条目,提取每一影片的详细重要信息。具体代码如下:

Python轻松搞定豆瓣电影TOP250采集

python movies =[] for item in items: movie ={} movie[“title”]= item.find(“span”, class_=”title”).text movie[“director”]= item.find(“div”, class_=”bd”).find_all(“p”)[0].text.strip().split(“”)[1].replace(“\xa0″,””) movie[“actor”]= item.find(“div”, class_=”bd”).find_all(“p”)[0].text.strip().split(“”)[-1].replace(“\xa0″,””) movie[“score”]= float(item.find(“span”, class_=”rating_num”).text) movie[“comment_num”]= int(item.find(“div”, class_=”star”).find_all(“span”)[-1].text[:-3]) movies.append(movie)

当中,他们采用字典存储每一影片的详细重要信息,并将大部份影片存储在两个条目中。

6.保存数据

python import csv with open(movies.csv,w, newline=, encoding=utf-8-sig) as csvfile: fieldnames =[title,director,actor,score,comment_num] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() for movie in movies: writer.writerow(movie)

当中,我们采用csv库将数据写入csv格式的文件中。

7.异常处理

在展开网页导出和数据保存的过程中,可能会遇到一些异常情况,如网络连接超时、网页源码导出失败等。为了保证程序的健壮性和稳定性,他们须要对那些异常情况展开处理。具体代码如下:

aders=headers, timeout=10) html = response.text #导出网页源码并提取影片重要信息 soup = BeautifulSoup(html,html.parser) items = soup.find_all(div, class_=item) movies =[] for item in items: movie ={} movie[“title”]= item.find(“span”, class_=”title”).text movie[“director”]= item.find(“div”, class_=”bd”).find_all(“p”)[0].text.strip().split(“”)[1].replace(“\xa0″,””) movie[“actor”]= item.find(“div”, class_=”bd”).find_all(“p”)[0].text.strip().split(“”)[-1].replace(“\xa0″,””) movie[“score”]= float(item.find(“span”, class_=”rating_num”).text) movie[“comment_num”]= int(item.find(“div”, class_=”star”).find_all(“span”)[-1].text[:-3]) movies.append(movie) #保存数据到本地文件中 with open(movies.csv,a, newline=, encoding=utf-8-sig) as csvfile: fieldnames =[title,director,actor,score,comment_num] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) for movie in movies: writer.writerow(movie) #间隔一定时间后继续收集 time.sleep(10) except Exception as e: print(e)

当中,他们采用了两个while循环,不断展开收集、导出和数据保存的过程,并在遇到异常情况时展开处理。

8.性能优化

为了提高程序的收集效率,他们能采用多线程或异步IO等技术。具体代码如下:

python import asyncio import aiohttp async def fetch(session, url): async with session.get(url) as response: return await response.text() async def main(): async with aiohttp.ClientSession() as session: tasks =[] for i in range(10): url =f{i*25}&filter= task = asyncio.ensure_future(5374034a40c8d6800cb4f449c2ea00a0(session, url)) tasks.append(task) htmls = await asyncio.gather(*tasks) for html in htmls: soup = BeautifulSoup(html,html.parser) items = soup.find_all(div, class_=item) movies =[] for item in items: movie ={} movie[“title”]= item.find(“span”, class_=”title”).text movie[“director”]= item.find(“div”, class_=”bd”).find_all(“p”)[0].text.strip().split(“”)[1].replace(“\xa0″,””) movie[“actor”]= item.find(“div”, class_=”bd”).find_all(“p”)[0].text.strip().split(“”)[-1].replace(“\xa0″,””) movie[“score”]= float(item.find(“span”, class_=”rating_num”).text) movie[“comment_num”]= int(item.find(“div”, class_=”star”).find_all(“span”)[-1].text[:-3]) movies.append(movie) with open(movies.csv,a, newline=, encoding=utf-8-sig) as csvfile: fieldnames =[title,director,actor,score,comment_num] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) for movie in movies: writer.writerow(movie) if __name__==__main__: loop = asyncio.get_event_loop() loop.run_until_complete(main())

当中,他们采用了异步IO技术和aiohttp库,实现了对新浪网影片TOP250的快速收集。

9.总结

本文介绍了如何利用Python实现对新浪网网站影片TOP250重要信息的高效收集。他们透过演示应用程序出访、

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务