Python网页数据爬取:豆瓣电影Top250数据

·引言

  Python爬虫工具,拥有强大的网络数据爬取能力,能够满足广阔的商业应用需求,如市场调研、精准营销、金融分析等领域,也用于个人信息整合,以及数据分析与人工智能等方面的使用需求。

  本文章以“爬取‘豆瓣电影Top250’数据”项目为例,使用Python详细展示爬取网络数据的过程,并呈现所需的程序代码。

  此项目所涉及的编程技术有:1、网页爬取;2、反爬(user-agent);3、使用Xpath工具;4、for循环翻页;5、Excel文件保存

·网页访问

  首先,根据“豆瓣电影Top250”网址,进行模拟用户访问。即使用请求头访问网址。

import requests #导入请求模块

url='https://movie.douban.com/top250'  #豆瓣电影Top250网址

#请求头
headers={'user-agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1 Edg/129.0.0.0'}

res=requests.get(url,headers=headers)

#检验网站是否访问成功
print(res)  #若显示‘Response[200]’则说明访问成功

  当控制台显示访问成功后,即可进行下一步。

·添加反爬

  由于网站会设置反爬虫机制,因此掌握应对反爬虫机制的措施和方法格外重要。此文章仅使用较为简单的方法:随机用户代理。

import random

#此处可自行增添不同的请求头于列表中
list1=['Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1 Edg/129.0.0.0',
       'Mozilla/5.0 (Linux; Android 13; SM-G981B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36 Edg/129.0.0.0',
       'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Mobile Safari/537.36 Edg/129.0.0.0']

head=random.choice(list1)

headers={'user-agent':head}

print(head) #检验是否显示随机请求头

·循环爬取

  由于“豆瓣电影Top250”网页中,有多页数据内容,我们可以使用for循环来循环遍历所有页面的数据信息。

  当for循环遍历电影信息时,还需要对数据信息进行定位,准确爬取我们所需的数据内容(本文章仅展示爬取电影中文名以及相应评分的内容)。即使用Xpath工具进行定位。

from lxml import etree #导入lxml库中的HTML解释器

movie_list=[]

for page in range(1,11): #豆瓣电影Top250全部10页内容

    #点开不同页的网址,即可发现下列网页规律
    url=f'https://movie.douban.com/top250?start={(page-1)*25}&filter='

    res=requests.get(url,headers=headers)

    #使用etree将响应的文本内容解析为HTML元素数,以便后续通过Xpath表达式提取数据。
    html=etree.HTML(res.text)

    #使用Xpath表达式在HTML中找到所有class为info的div元素,而div元素包含了每部电影的详细信息。
    divs=html.xpath("//div[@class='info']")
    #print(divs)
    
    for div in divs:

        #创建空字典dic,用于储存当前电影信息
        dic={}
        
        title=div.xpath("./div[@class='hd']/a/span[@class='title']/text()")
        #电影名//div[@class='info']/div[@class='hd']/a/span[1]/text()

        title_CN=''.join(title).split('\xa0/\xa0')[0]
        dic['电影中文名']=title_CN

        score=div.xpath("./div[@class='bd']/div/span[2]/text()")[0]
        dic['电影评分']=score

        #检验代码有效性:
        print(title_CN,score)

        #将每个电影信息字典dic添加到movie_list列表中
        movie_list.append(dic)

  到此,已完成了对电影基本数据的爬取工作。

·文件保存

  爬取完电影数据之后,使用Excel文件,对电影数据进行收集整理,方便数据的使用。

import csv

with open('豆瓣Top250.csv','w',encoding='utf-8-sig',newline='') as f:

     #创建一个DictWriter对象,用于将字典形式的数据写入CSV文件     
     writer=csv.DictWriter(f,fieldnames=('电影中文名','电影评分'))

     #根据前面指定的fieldnames,在CSV文件的第一行写入表头“电影中文名”和“电影评分”
     writer.writeheader()

     #将包含电影信息的字典列表movie_list写入到 CSV 文件中。writerows方法会遍历列表中的每个字典,按照fieldnames指定的顺序,将字典中的值对应写入到 CSV 文件的相应列中。
     writer.writerows(movie_list)

  至此,代码结束。

·完整代码

import requests
import random
from lxml import etree
import csv

list1=['Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1 Edg/129.0.0.0',
       'Mozilla/5.0 (Linux; Android 13; SM-G981B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36 Edg/129.0.0.0',
       'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Mobile Safari/537.36 Edg/129.0.0.0']
head=random.choice(list1)
headers={'user-agent':head}

movie_list=[]

for page in range(1,11):

    url=f'https://movie.douban.com/top250?start={(page-1)*25}&filter='
    res=requests.get(url,headers=headers)

    html=etree.HTML(res.text)
    divs=html.xpath("//div[@class='info']")

    for div in divs:
    
        dic={}

        title=div.xpath("./div[@class='hd']/a/span[@class='title']/text()")

        title_CN=''.join(title).split('\xa0/\xa0')[0]
        dic['电影中文名']=title_CN

        score=div.xpath("./div[@class='bd']/div/span[2]/text()")[0]
        dic['评分']=score

        movie_list,append(dic)

with open('豆瓣Top250.csv','w',encoding='utf-8-sig',newline='') as f:

    writer=csv.DictWriter(f,fieldnames=('电影中文名','评分'))

    writer.writeheader()

    writer.writerows(movie_list)

·总结

  文章实现了一个基本的豆瓣电影Top250数据爬取功能,但仍有非常多的改进空间。该段代码还可以添加错误处理,增强代码稳定性;优化请求头,避免请求被拒;爬取更多电影信息,完善数据完整性等。

  最后,欢迎广大读者在评论区积极交流指正。下文再见。

猜你喜欢

转载自blog.csdn.net/Hibernation_23/article/details/144929162
今日推荐