Python爬虫信息技术实践之四抓取数据及数据解析

举报
tea_year 发表于 2024/06/19 14:44:06 2024/06/19
【摘要】 1.分析针对所爬去的Url进行分析:爬取的网址是:https://movie.douban.com/top250?start=0&filter=分析网址'?'符号后的参数,第一个参数'start=0',这个代表页数,‘=0’时代表第一页,‘=25’代表第二页,以此类推。1.1页面分析明确要爬取的元素 :排名、名字、导演、评语、评分1.2 页面代码分析2.网站信息爬取2.1 获取每部分电影信息...

1.分析

针对所爬去的Url进行分析:

爬取的网址是:https://movie.douban.com/top250?start=0&filter=

分析网址'?'符号后的参数,第一个参数'start=0',这个代表页数,‘=0’时代表第一页,‘=25’代表第二页,以此类推。

1.1页面分析

明确要爬取的元素 :排名、名字、导演、评语、评分

1.2 页面代码分析

2.网站信息爬取

2.1 获取每部分电影信息

def get_html(web_url):
    header = {
        "User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) 
    AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16"}
    html = requests.get(url=web_url,headers= header).text
    soup = BeautifulSoup(html,'lxml')
    data = soup.find('ol').find_all('li') #截取需要的内容
    return data

代码说明】

requests.get()函数,会根据参数中url的链接,返回response对象

.text会将response对象转换成str类型

find_all()函数,会将html文本中的ol标签下的每一个li标签中的内容筛选出来

2.2 筛选信息保存进入文本

def get_info(all_move):
 
    f = open("./douban.txt", "a",encoding='UTF-8')
 
    for info in all_move:
        #排名
        nums = info.find('em')
        num = nums.get_text()
 
        #名字
        names = info.find("span")  # 名字比较简单 直接获取第一个span就是
        name = names.get_text()
 
        #导演
        charactors = info.find("p")  # 这段信息中有太多非法符号你需要替换掉
        charactor = charactors.get_text().replace(" ", "").replace("\n", "")  # 使信息排列规律
        charactor = charactor.replace("\xa0", "").replace("\xee", "").replace("\xf6", "").replace("\u0161", "").replace(
            "\xf4", "").replace("\xfb", "").replace("\u2027", "").replace("\xe5", "")
 
        #评语
        remarks = info.find_all("span", {"class": "inq"})
        if remarks:  # 这个判断是因为有的电影没有评语,你需要做判断
            remark = remarks[0].get_text().replace("\u22ef", "")
        else:
            remark = "此影片没有评价"
        print(remarks)
 
        #评分
        scores = info.find_all("span", {"class": "rating_num"})
        score = scores[0].get_text()
 
        f.write(num + '、')
        f.write(name + "\n")
        f.write(charactor + "\n")
        f.write(remark + "\n")
        # f.write(score)
        f.write("\n\n")
 
    f.close()  # 记得关闭文件

注意爬取元素的时候,会有非法符号(因为这些符号的存在,会影响你写入文本中),所以需要将符号用replace函数替换.

【Tips】注意写数据时将格式改为“UTF-8”,不然所写信息为乱码

常见状态码

    200 - 服务器成功返回网页,客户端请求已成功。
    302 - 对象临时移动。服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
    304 - 属于重定向。自上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。
    401 - 未授权。请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
    404 - 未找到。服务器找不到请求的网页。
    503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。
-----------------------------------
Python爬虫入门教程:豆瓣Top电影爬取
https://blog.51cto.com/u_15162069/2741239

全部代码如下:

#coding:utf-8
from bs4 import BeautifulSoup
import requests
import os
 
def get_html(web_url):
    header = {
        "User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16"}
    html = requests.get(url=web_url,headers= header).text
    soup = BeautifulSoup(html,'lxml')
    data = soup.find('ol').find_all('li') #截取需要的内容
    return data
 
def get_info(all_move):
 
    f = open("./douban.txt", "a",encoding='UTF-8')
 
    for info in all_move:
        #排名
        nums = info.find('em')
        num = nums.get_text()
 
        #名字
        names = info.find("span")  # 名字比较简单 直接获取第一个span就是
        name = names.get_text()
 
        #导演
        charactors = info.find("p")  # 这段信息中有太多非法符号你需要替换掉
        charactor = charactors.get_text().replace(" ", "").replace("\n", "")  # 使信息排列规律
        charactor = charactor.replace("\xa0", "").replace("\xee", "").replace("\xf6", "").replace("\u0161", "").replace(
            "\xf4", "").replace("\xfb", "").replace("\u2027", "").replace("\xe5", "")
 
        #评语
        remarks = info.find_all("span", {"class": "inq"})
        if remarks:  # 这个判断是因为有的电影没有评语,你需要做判断
            remark = remarks[0].get_text().replace("\u22ef", "")
        else:
            remark = "此影片没有评价"
        print(remarks)
 
        #评分
        scores = info.find_all("span", {"class": "rating_num"})
        score = scores[0].get_text()
 
        f.write(num + '、')
        f.write(name + "\n")
        f.write(charactor + "\n")
        f.write(remark + "\n")
        # f.write(score)
        f.write("\n\n")
 
    f.close()  # 记得关闭文件
 
 
if __name__ == "__main__":
    File_Path = os.getcwd()[:-4] + 'Test\\'  # 获取到当前文件的目录,并检查是否有report文件夹,如果不存在则自动新建report文件
    if not os.path.exists(File_Path):
        os.makedirs(File_Path)
 
    page = 0  # 初始化页数,TOP一共有250部   每页25部
    while page <= 225:
        web_url = "https://movie.douban.com/top250?start=%s&filter=" % page
        all_move = get_html(web_url)  # 返回每一页的网页
        get_info(all_move)  # 匹配对应信息存入本地
        page += 25

requests.get(url=url, headers=headers) 请求网页返回的是response对象

response.text: 获取网页文本数据

response.json: 获取网页json数据

这两个是用的最多的,当然还有其他的

效果图如下:

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。