前言:网络爬虫是一种自动获取网页内容的程序,它通过模拟人类访问网页的行为,向目标网站发送请求,获取网页的 HTML 代码,再从中提取我们所需的数据。这些数据可能是电影信息、新闻资讯、商品价格等各种形式。
网络爬虫超简单!新手必学的豆瓣电影 Top250 数据获取秘籍
宝子们,是不是总感觉网上那些数据离我们很远,好像很难拿到?其实一点都不!今天我就手把手教你用 Python 做个超简单的网络爬虫,把豆瓣电影 Top250 的电影信息轻松拿下。别怕,这玩意儿可不难,就是个小工具,跟我们用浏览器看网页似的,把网页内容拿过来,再把我们需要的信息挑出来就行。
咱就以豆瓣电影 Top250 为例,爬一下每部电影的名字、年份、评分和评价人数。这要是学会了,以后你想爬啥数据都行。
先说说咱得准备啥工具:
-
Python :这个软件特好用,简单又强大,适合咱新手。
-
requests 库 :它能让咱们的爬虫像浏览器一样去网页 “串门”,把网页内容拿回来。
-
正则表达式(re 库) :这个工具就像个聪明的小侦探,能在复杂的网页内容里把我们需要的信息找出来。
别慌,这些工具都很好用,我来一步步教你。
第一步:先搭个爬虫架子
import requests
import re
class DoubanTop250Spider:
def __init__(self, base_url, headers=None):
self.base_url = base_url
self.headers = headers if headers else {"User-Agent": "I love you zi kao"}
self.movies = []
这里我们建了一个 “爬虫小助手”(类),它有三个小部件:
-
base_url
:这是我们要爬取的网页基础地址,就是豆瓣电影 Top250 的网址。 -
headers
:这个是用来假装自己是浏览器的,不然网站可能不让爬虫进去哦。 -
movies
:一个空列表,等下我们要把电影信息都放这里面。
第二步:让爬虫去网页“串门”
def _fetch_page(self, url):
try:
response = requests.get(url, headers=self.headers, timeout=10)
response.raise_for_status()
response.encoding = "utf-8"
print(f"成功获取到页面 {url}啦, 当前状态码:{response.status_code} 属于正常哦")
return response.text
except requests.exceptions.RequestException as e:
print(f"出现问题啦:{e} 你要不要试着解决一下呢")
return None
except Exception as e:
print(f"哦,补~,出现了意料之外的问题:{e} 救救我-")
return None
这个方法就是让爬虫去网页拿内容。它会:
-
用
requests.get
向网页发请求,就像打开网页一样。 -
检查请求是不是成功了,要是失败了就报个错。
-
把网页内容的编码设置好,不然可能出现乱码。
-
把网页的 HTML 文本内容返回回来。
第三步:从网页内容里挑出电影信息
def _parse_content(self, content):
try:
pattern = re.compile(
r'<div class="item">.*?<span class="title">(?P<名字>.*?)</span>.*?<br>(?P<时间>.*?) .*?<span class="rating_num" property="v:average">(?P<评分>.*?)</span>.*?<span>(?P<评价人数>.*?)人评价</span>',
flags=re.DOTALL)
movies = [movie.groupdict() for movie in pattern.finditer(content)]
if not movies:
print("它没吃饭,肚子了啥都没有哦")
return movies
except re.error as e:
print(f"哦,No。出现问题啦:{e} 好像是正则的问题偶")
return []
except Exception as e:
print(f"没有内容?我要查。看看是那个该死的耽误我的行程:{e}")
return []
这个方法就像是在网页内容的 “大杂烩” 里找我们需要的宝贝。
-
我们用正则表达式这个 “小侦探” 来匹配电影名字、年份、评分和评价人数对应的 HTML 标签。
-
把匹配到的信息一个个挑出来,放进一个列表里。
-
如果没找到啥宝贝,就打印个提示信息。
第四步:把电影信息存起来
def _save_movies(self, filename="moviesTop250.txt"):
try:
with open(filename, "w", encoding="utf-8") as file:
for movie in self.movies:
if '时间' in movie:
movie['时间'] = movie['时间'].strip()
file.write(f"名字:{movie.get('名字', '无')}\n时间:{movie.get('时间', '无')}\n评分:{movie.get('评分', '无')}\n评价人数:{movie.get('评价人数', '无')}\n\n")
print(f"哇。好厉害,我们已经获取到电影信息并保存到 {filename} 文件中啦")
except IOError as e:
print(f"No~,怎么保存不了-_-:{e}")
except Exception as e:
print(f"前方出现意外,请注意看路:{e}")
这个方法就是把前面挑出来的电影信息存到一个文件里。
-
打开一个文件(如果不存在就创建一个),设置好编码格式。
-
把每部电影的信息按一定格式写进去,就像在笔记本上记笔记一样。
-
如果保存成功,就打印个成功的消息。
第五步:启动爬虫,让它开始工作
def run(self, total_pages=10):
try:
self.movies = []
for page in range(total_pages):
start = page * 25
url = f"{self.base_url}?start={start}"
page_content = self._fetch_page(url)
if page_content:
movies = self._parse_content(page_content)
if movies:
self.movies.extend(movies)
print(f"恭喜!成功获取第 {page + 1} 页的电影信息哦")
else:
print(f"很遗憾!第 {page + 1} 页未获取到有效的电影信息")
else:
print(f"不要啊~ 第 {page + 1} 页获取失败")
if self.movies:
self._save_movies()
else:
print("对方没吃饭,肚子里没东西")
except Exception as e:
print(f"咦,程序好像出了什么问题了呢:{e}")
if __name__ == "__main__":
base_url = "https://movie.douban.com/top250"
spider = DoubanTop250Spider(base_url)
spider.run(total_pages=10)
这个方法就是我们爬虫的 “启动按钮”。
-
指定要爬多少页,然后一页一页地去爬。
-
对于每一页,先去拿网页内容,如果拿到就挑出电影信息,加到列表里。
-
爬完所有页后,如果列表里有东西,就存到文件里。
看看成果吧!
把上面的代码保存成一个 Python 文件(比如叫 douban_spider.py
),然后运行它。要是顺利的话,程序会在程序文件夹里生成一个叫 moviesTop250.txt
的文件,里面就是我们爬到的电影信息啦。打开看看,是不是很有成就感?
遇到问题别慌,试试这些方法
-
网页拿不到 :可能是网络不好,或者网站不让爬。可以试试加个延迟,或者把请求头设置得更像浏览器。
-
挑不出信息 :可能是网页结构变了。那就打开网页源代码,重新调整正则表达式。
-
文件乱码 :检查文件编码格式是不是一致。
好啦,这就是一个简单的网络爬虫教程啦。是不是也没那么难嘛?以后你可以试试爬别的数据,比如新闻、商品啥的。要是爬虫给你带来啥新奇的发现,记得和我分享分享哦。