L网络爬虫基础.py

前言:网络爬虫是一种自动获取网页内容的程序,它通过模拟人类访问网页的行为,向目标网站发送请求,获取网页的 HTML 代码,再从中提取我们所需的数据。这些数据可能是电影信息、新闻资讯、商品价格等各种形式。 

网络爬虫超简单!新手必学的豆瓣电影 Top250 数据获取秘籍

宝子们,是不是总感觉网上那些数据离我们很远,好像很难拿到?其实一点都不!今天我就手把手教你用 Python 做个超简单的网络爬虫,把豆瓣电影 Top250 的电影信息轻松拿下。别怕,这玩意儿可不难,就是个小工具,跟我们用浏览器看网页似的,把网页内容拿过来,再把我们需要的信息挑出来就行。

咱就以豆瓣电影 Top250 为例,爬一下每部电影的名字、年份、评分和评价人数。这要是学会了,以后你想爬啥数据都行。

先说说咱得准备啥工具:

  1. Python :这个软件特好用,简单又强大,适合咱新手。

  2. requests 库 :它能让咱们的爬虫像浏览器一样去网页 “串门”,把网页内容拿回来。

  3. 正则表达式(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

这个方法就是让爬虫去网页拿内容。它会:

  1. requests.get 向网页发请求,就像打开网页一样。

  2. 检查请求是不是成功了,要是失败了就报个错。

  3. 把网页内容的编码设置好,不然可能出现乱码。

  4. 把网页的 HTML 文本内容返回回来。

第三步:从网页内容里挑出电影信息

def _parse_content(self, content):
    try:
        pattern = re.compile(
            r'<div class="item">.*?<span class="title">(?P<名字>.*?)</span>.*?<br>(?P<时间>.*?)&nbsp;.*?<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 []

这个方法就像是在网页内容的 “大杂烩” 里找我们需要的宝贝。

  1. 我们用正则表达式这个 “小侦探” 来匹配电影名字、年份、评分和评价人数对应的 HTML 标签。

  2. 把匹配到的信息一个个挑出来,放进一个列表里。

  3. 如果没找到啥宝贝,就打印个提示信息。

第四步:把电影信息存起来

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}")

这个方法就是把前面挑出来的电影信息存到一个文件里。

  1. 打开一个文件(如果不存在就创建一个),设置好编码格式。

  2. 把每部电影的信息按一定格式写进去,就像在笔记本上记笔记一样。

  3. 如果保存成功,就打印个成功的消息。

第五步:启动爬虫,让它开始工作

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)

这个方法就是我们爬虫的 “启动按钮”。

  1. 指定要爬多少页,然后一页一页地去爬。

  2. 对于每一页,先去拿网页内容,如果拿到就挑出电影信息,加到列表里。

  3. 爬完所有页后,如果列表里有东西,就存到文件里。

看看成果吧!

把上面的代码保存成一个 Python 文件(比如叫 douban_spider.py),然后运行它。要是顺利的话,程序会在程序文件夹里生成一个叫 moviesTop250.txt 的文件,里面就是我们爬到的电影信息啦。打开看看,是不是很有成就感?

遇到问题别慌,试试这些方法

  1. 网页拿不到 :可能是网络不好,或者网站不让爬。可以试试加个延迟,或者把请求头设置得更像浏览器。

  2. 挑不出信息 :可能是网页结构变了。那就打开网页源代码,重新调整正则表达式。

  3. 文件乱码 :检查文件编码格式是不是一致。

好啦,这就是一个简单的网络爬虫教程啦。是不是也没那么难嘛?以后你可以试试爬别的数据,比如新闻、商品啥的。要是爬虫给你带来啥新奇的发现,记得和我分享分享哦。