Python爬虫入门案例(一)豆瓣电影Top250爬取(request+XPath+csv)

本文以豆瓣电影Top250为例,介绍爬虫入门知识。先阐述爬虫流程,包括访问网页获取回应、分析源码获取信息、将内容存入文件。接着讲解代码实现,如设置headers、分析源码结构、写入信息到csv文件,还提及翻页爬取方法,最后给出完整代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

豆瓣电影top250是学习爬虫很好的入门案例。学习爬虫,首先我们应该清楚爬虫的流程。

一、流程分析

  • 1.访问网页, 获取网页回应(response)
    2.分析源码结构,通过xpath或其他解析方法获得所需的相应信息内容。
    3.通过csv方法将获取的内容存入文件中(新手可以先存入txt文件,这种方法比较简单)

二、代码实现与思路讲解

  1. 设置headers,设置编码解析格式,通过requests中的get方法获取网页回应。
    headers查看方式:
    进入网页,点击f12或查看开发者工具,点击Network-headers-User-Agent在这里插入图片描述
def get_response(url):
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3534.4 Safari/537.36'}
    response = requests.get(url,headers=headers)
    response.encoding = 'UTF-8'
    return response.text

**

2.分析源码

在这里插入图片描述
通过查看源码,可以看出每个电影都是放置在li标签中的,这样我们就非常清晰。

def get_nodes(html):
    text = etree.HTML(html)
    nodes = text.xpath('//li/div[@class="item"]')  #锁定代码位置
    infos = []
    for node in nodes:
        try:
            key = {}
            key['movieName'] = str(node.xpath('.//span[@class="title"][1]/text()')).strip("[']")
            print(key['movieName'])
            firstInfo = node.xpath('.//div[@class="bd"]/p/text()')[0]
            secondInfo = node.xpath('.//div[@class="bd"]/p/text()')[1]
            key['director'] = str(firstInfo.split("主演:")[0]).strip().strip('导演:')
            key['actors'] = firstInfo.split("主演:")[1]
            key['time'] = secondInfo.split('/')[0]
            key['country'] = secondInfo.split('/')[1]
            infos.append(key)
        except:
            key['actors'] = None
    return infos

这样我们就可以爬取到电影名,导演,主演,上映时间,国家等电影信息。(如果对xpath语法有问题的同学可以去w3school官网去查看。语法相当简单好学)

3. 将信息写入csv文件

def save_file(infos):
    headers = ['电影名称','导演','主演','上映时间','国家']
    with open('DouBanMovieT250.csv','a+',encoding='UTF-8',newline='') as fp:
        writer = csv.writer(fp)
        writer.writerow(headers)
        for key in infos:
            writer.writerow([key['movieName'],key['director'],key['actors'],key['time'],key['country']])

这里我们先通过csv.writer(fp)方法生成一个csv对象。再通过这个对象来调用writerrow方法写入文件。到这里我们就完成了第一页的爬虫。
当然,我们的欲望不止爬取第一页。下面我们再来说一下翻页爬取。

if __name__  == '__main__':
    urls = ['https://movie.douban.com/top250?start={}'.format(i) for i in range(0, 226, 25)]
    for url in urls:
        html = get_response(url)
        infos = get_nodes(html)
        save_file(infos)

通过查看网页的get请求可以知道,参数是固定变化的。这样我们直接可以通过for循环来遍历网页请求参数。
在这里插入图片描述
到这里,我们的豆瓣电影就爬取完成了。来看一下结果吧!
在这里插入图片描述
完整代码

import requests
from lxml import etree
import csv

def get_response(url):
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3534.4 Safari/537.36'}
    response = requests.get(url,headers=headers)
    response.encoding = 'UTF-8'
    return response.text

def get_nodes(html):
    text = etree.HTML(html)
    nodes = text.xpath('//li/div[@class="item"]')
    infos = []
    for node in nodes:
        try:
            key = {}
            key['movieName'] = str(node.xpath('.//span[@class="title"][1]/text()')).strip("[']")
            print(key['movieName'])
            firstInfo = node.xpath('.//div[@class="bd"]/p/text()')[0]
            secondInfo = node.xpath('.//div[@class="bd"]/p/text()')[1]
            key['director'] = str(firstInfo.split("主演:")[0]).strip().strip('导演:')
            key['actors'] = firstInfo.split("主演:")[1]
            key['time'] = secondInfo.split('/')[0]
            key['country'] = secondInfo.split('/')[1]
            infos.append(key)
        except:
            key['actors'] = None
    return infos
def save_file(infos):
    headers = ['电影名称','导演','主演','上映时间','国家']
    with open('DouBanMovieT250.csv','a+',encoding='UTF-8',newline='') as fp:
        writer = csv.writer(fp)
        writer.writerow(headers)
        for key in infos:
            writer.writerow([key['movieName'],key['director'],key['actors'],key['time'],key['country']])

if __name__  == '__main__':
    urls = ['https://movie.douban.com/top250?start={}'.format(i) for i in range(0, 226, 25)]
    for url in urls:
        html = get_response(url)
        infos = get_nodes(html)
        save_file(infos)

每天进步一点点,Keep Going!

好的,我了解了您的问题。要使用Scrapy爬取豆瓣电影Top250,首先需要安装Scrapy。您可以使用以下命令在命令行中安装Scrapy,前提是您已经安装了Python: ``` pip install scrapy ``` 然后,您需要创建个Scrapy项目。在命令行中使用以下命令创建项目: ``` scrapy startproject douban_movie ``` 然后,您需要创建个Spider来定义如何爬取数据。在douban_movie目录中,创建个名为“spiders”的目录,并在该目录中创建个名为“douban_spider.py”的Python文件。然后,在douban_spider.py文件中添加以下代码来定义Spider: ``` 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="info"]'): yield { 'title': movie.xpath('div[@class="hd"]/a/span/text()').extract_first(), 'rating': movie.xpath('div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()').extract_first(), 'quote': movie.xpath('div[@class="bd"]/p[@class="quote"]/span/text()').extract_first(), } next_page = response.xpath('//span[@class="next"]/a/@href') if next_page: url = response.urljoin(next_page[0].extract()) yield scrapy.Request(url, self.parse) ``` 此Spider将使用XPath语法解析豆瓣Top250页面的HTML,并从每个电影的页面提取电影的标题、评级和引用,并在页面中索引下页的链接以实现全网翻页。现在,通过运行以下命令,将爬虫部署到Scrapy项目中: ``` scrapy crawl douban -o movies.csv ``` 这将开始爬取Top250,并将结果保存在名为“movies.csv”的CSV文件中。当然,您可以根据需要更改输出格式。希望这可以帮助您开始使用Scrapy爬取豆瓣电影Top250
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值