python爬虫学习笔记(三)—— 实战爬取豆瓣TOP250电影


基于之前两篇的基础知识后


python爬虫学习笔记(一)——初识爬虫
python爬虫学习笔记(二)——解析内容


开始实战爬取豆瓣TOP250电影


首先还是重新复习下爬虫的基本流程:

  • 发起请求
  • 获取响应内容
  • 解析内容
  • 保存数据


1. 发起请求


首先观察豆瓣电影Top250首页
在这里插入图片描述


话不多说,直接发起爬取请求


# 得到指定一个URL的网页内容
def GetHTML(url):
    try:
        headers = {                  # 模拟浏览器头部信息,向豆瓣服务器发送消息
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36"
        }                            # 用户代理,表示告诉豆瓣服务器,我们是什么类型的机器、浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容)
        r = requests.get(url, headers=headers, timeout=30)
        r.raise_for_status                            # 若状态码不是200,抛出HTTPError异常
        r.encoding = r.apparent_encoding              # 保证页面编码正确
    except requests.exceptions.ConnectTimeout:
        print('爬虫超时!')
    except requests.exceptions.ConnectionError:
        print('无效地址!')

    return r.text


2. 获取响应内容


然而,我们发现一页只有25部电影信息,爬取Top250部一共需要10页
在这里插入图片描述

在这里插入图片描述


当链接为https://movie.douban.com/top250?start=25时,我们可以发现此时正是电影的第二页,按照这个规律,利用一个for循环,我们就可以提取10页的网页数据了


for i in range(0, 10):         # 调用获取页面信息的函数,10次
        url = baseurl + str(i * 25)
        response = GetHTML(url)                           


3.解析内容


获取完一堆网页数据后,此时就需要一步步解析出我们所需要的信息
按下F12,找出第一部电影的相关信息的对应关系


在这里插入图片描述


然后通过正则表达式查找指定的字符串


# 获取影片排名
findrank = re.compile(r'<em class="">(.*)</em>')
 
# 获取影片名字的
findTitle = re.compile(r'<span class="title">(.*)</span>')      

# 获取影片评分的
findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')

# 获取影片评价人数的
findJudge = re.compile(r'<span>(\d*)人评价</span>')

# 获取影片概况的
findInq = re.compile(r'<span class="inq">(.*)</span>')

# 获取影片相关内容的
findBd = re.compile(r'<p class="">(.*?)</p>',re.S)

# 获取详情的链接的
findLink = re.compile(r'<a href="(.*?)">')    

# 获取影片图片链接
findImgSrc = re.compile(r'<img.*src="(.*?)"',re.S)  


当学会第一部影片信息的提取后,此时便可举一反二五零


# 逐一解析数据
def SoupHTML(url):
    datalist = []
    for i in range(0, 10):                                      # 调用获取页面信息的函数,10次
        url = baseurl + str(i * 25)
        response = GetHTML(url)                                 # 保存获取到的网页源码
        Soup = BeautifulSoup(response, "html.parser")
        for item in Soup.find_all('div', class_="item"):        # 查找符合要求的字符串,形成列表
            data = []                                           # 保存一部电影的所有信息
            item = str(item)
            
			# 影片排名的解析
            findrank = re.compile(r'<em class="">(.*)</em>')
            rank = re.findall(findrank, item)[0]
            data.append(rank)                                   # 添加排名
            
            # 影片名字的解析
            findtitle = re.compile(r'<span class="title">(.*)</span>')
            title = re.findall(findtitle, item)
            if len(title) == 2:
                ctitle = title[0]
                data.append(ctitle)                             # 添加中文名
                otitle = title[1].replace("/", "")
                data.append(otitle)                             # 添加外国名
            else:
                data.append(title[0])
                data.append(" ")                                # 若无外国名字,则留空

            # 影片评分的解析
            findrating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
            rating = re.findall(findrating, item)[0]
            data.append(rating)                                 # 添加评分

            # 影片评价人数的解析
            findjudge = re.compile(r'<span>(\d*)人评价</span>')
            judgenum = re.findall(findjudge, item)[0]
            data.append(judgenum)                              # 添加评价人数

            # 影片概况的解析
            findinq = re.compile(r'<span class="inq">(.*)</span>')
            inq = re.findall(findinq, item)
            if len(inq) != 0:
                inq = inq[0].replace("。", "")
                data.append(inq)                               # 添加概述
            else:
                data.append(" ")

            # 影片相关内容的解析
            findbd = re.compile(r'<p class="">(.*?)</p>', re.S)
            bd = re.findall(findbd, item)[0]
            bd = re.sub('<br(\s+)?/>(\s+)?', " ", bd)
            bd = re.sub('/', " ", bd)
            data.append(bd.strip())                            # 添加相关内容

            # 影片详情的链接的解析
            findlink = re.compile(r'<a href="(.*?)">')
            link = re.findall(findlink, item)[0]
            data.append(link)                                  # 添加链接

            # 影片图片链接的解析
            findimgsrc = re.compile(r'<img.*src="(.*?)"', re.S)
            imgsrc = re.findall(findimgsrc, item)[0]
            data.append(imgsrc)                               # 添加图片链接

            datalist.append(data)                              # 把解析好的一部电影信息放入datalist

    return datalist


4.保存数据


由于250部电影的数据比较庞大,直接print出来可能会显示不完整
于是我们选择保存到excel表格中便于观察和研究
首先我们需要了解一下Python-xlwt库的基本使用
然后就可以上手保存数据


def SaveHTML(datalist):
    print("Start saving……")
    book = xlwt.Workbook(encoding="utf-8", style_compression=0)            # 创建workbook对象
    sheet = book.add_sheet("电影TOP250", cell_overwrite_ok=True)           # 创建工作表
    col = ("排名","影片中文名", "影片外国名", "评分", "评价人数", "影片概述", "影片相关内容", "影片链接", "影片图片链接")
    for i in range(0, 9):
        sheet.write(0, i, col[i])                                          # 列名

    for i in range(0, 250):
        print("第%d条" % (i + 1))
        data = datalist[i]
        for j in range(0, 9):
            sheet.write(i + 1, j, data[j])                                 # 写入数据

    book.save("豆瓣电影TOP_250.xls")
    print("数据保存成功!")


最后的最后,稍稍调用一下上面的3个函数


if __name__ == "__main__":
    url = "https://movie.douban.com/top250?start="
    Datalist = SoupHTML(url)
    SaveHTML(Datalist)


最后实战成果如图:


在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面我来为你介绍一下如何使用Scrapy爬取豆瓣TOP250电影信息。 1. 安装Scrapy 首先,你需要安装Scrapy。如果你已经安装了Python,可以在命令行中使用以下命令安装Scrapy: ``` pip install Scrapy ``` 2. 创建Scrapy项目 接下来,我们需要创建一个Scrapy项目。在命令行中输入以下命令: ``` scrapy startproject douban_top250 ``` 这将会在当前目录下创建一个名为“douban_top250”的文件夹,其中包含了Scrapy项目的基本结构。 3. 编写爬虫代码 在“douban_top250/spiders”目录下创建一个名为“douban.py”的文件,并输入以下代码: ```python import scrapy class DoubanSpider(scrapy.Spider): name = 'douban' allowed_domains = ['movie.douban.com'] start_urls = ['https://movie.douban.com/top250'] def parse(self, response): for movie in response.xpath('//div[@class="hd"]'): yield { 'title': movie.xpath('.//span[@class="title"]/text()').extract_first(), 'rating': movie.xpath('../div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()').extract_first(), 'link': movie.xpath('.//a/@href').extract_first(), } next_page = response.xpath('//span[@class="next"]/a/@href') if next_page: yield response.follow(next_page[0], self.parse) ``` 这段代码定义了一个名为“DoubanSpider”的类,用于爬取豆瓣电影TOP250电影名称、评分和链接。在这个类中,我们使用了XPath选择器来定位页面中的元素。 4. 运行爬虫 在命令行中进入“douban_top250”文件夹,并输入以下命令来运行爬虫: ``` scrapy crawl douban -o douban_top250.csv ``` 这将会运行刚才编写的“DoubanSpider”爬虫,并将结果保存在名为“douban_top250.csv”的文件中。 至此,你已经学会了如何使用Scrapy来爬取豆瓣TOP250电影信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值