首页 > 编程语言 >python爬虫遇到的问题

python爬虫遇到的问题

时间:2024-10-24 18:47:22浏览次数:10  
标签:span 遇到 python text title 爬虫 find strip class

python爬虫之获取文本信息时,经常犯的错误

如果代码部分不想看的 可以直接看后面粗体字

1.第一个例子

import requests

from bs4 import BeautifulSoup

import pandas as pd

import time 

import random

headers = {

    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'

}

movies_list=[]

def climb_movies(page):

    url=f'https://movie.douban.com/top250?start={page*25}&filter='

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

    

    if response.status_code==200:

        soup=BeautifulSoup(response.text,'html.parser')

        print(f"成功获取{page+1}页数据")

 

        #解析整页网页结构

        movies_all=soup.find_all('div',class_="info")

        #循环获取html标签中的信息

        for all in movies_all:

                name=all.find('span',class_="title").text.strip()if all.find('span',class_="title")else '未知'

                rating=all.find('span',class_="rating_num").text.strip()if all.find('span',class_="rating_num")else"未知"

                jingdian=all.find('span',class_="inq").text.strip()if all.find('span',class_="inq") else"未知"

               comment_number=all.find('div',class_="star").find_all('span')[-1].text.strip().replace('人评价','') ifall.find('div',class_="star").find_all('span')[-1].text.strip().replace('人评价','') else"未知"

                print(f"电影名:{name},评分:{rating}分,评论人数:{comment_number}")

                movies_list.append({'电影名':name,'评分':rating,'描述':jingdian,'评论人数':comment_number})

                print(f"第{page+1}页数据爬取成功")

    else:

        print(f"无法获取{page+1}数据,状态码:{response.status_code}")

#调用函数并循环获取没页电影的相关信息

for page in range (10):

    climb_movies(page)

    time.sleep(1)

df=pd.DataFrame(movies_list)        

df.to_excel('movie.xlsx',index=False,engine='openpyxl')

print("数据已存到--豆瓣movie.xlsx")

例子:

name=all.find('span',class_="title").text.strip()  if all.find('span',class_="title") else '未知'

思考:为什么if语句会放在获取标签元素语句(后文都称为目标语句)之后?

共同点:目标语句都有都有.text.strip()方法,该方法是为了获取标签元素的文本内容

 

 

 

上句的意思为:如果 all.find('span', class_="title") 找到一个结果(即不为 None),则执行 all.find('span', class_="title").text.strip(),即获取标题并去掉两端的空格    否则,如果 all.find('span', class_="title") 返回 None(即没有找到该元素),则赋值 "未知"。

 

 

这种写法是为了避免在 all.find('span', class_="title") 返回 None 时调用 .text.strip() 发生错误。注:如果标签文本内容为空,用.text.strip()会 发生错误

 

2.那我们在看一个例子

import requests

from bs4 import BeautifulSoup

import time 

import random

import pandas as pd

headers = {

    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'

}

book_data = []

def scrape_books(page):

    url=f"https://category.dangdang.com/pg{page}-cp01.01.00.00.00.00.html"

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

    if response.status_code==200:

        print(f"成功获取{page}页数据")

        soup=BeautifulSoup(response.text,'html.parser')

        books=soup.find_all('li',class_="line1")

        for book in books:

            if book.find('a',class_="pic"):

                title=book.find('a',class_="pic").get('title').strip()

                

            else :

                print('未知')

            if book.find('p',class_="search_book_author"):

                author=book.find('p',class_="search_book_author").text.strip()

                

            else :

                print('未知')

if book.find('span',class_="search_pre_price"):

                price=book.find('span',class_="search_pre_price").text.strip()

                

            else :

                print('未知')

            if book.find('a',class_="search_comment_num"):

                comments=book.find('a',class_="search_comment_num").text.strip()

            else :

                print("0条评论")

            print(f"书名:{title},作者:{author},价格:{price},评论数:{comments}")

            book_data.append({'书名':title,'作者':author,'价格':price,'评论数':comments})

    else :

        print(f"获取{page}页数据失败,状态码:{response.status_code}")

for page in range (1,3):

    scrape_books(page)

    time.sleep(random.uniform(1,3))

df=pd.DataFrame(book_data)

df.to_excel('dangdang图书.xlsx',index=False,engine='openpyxl')

print("数据已保存到 dangdang图书.xlsx中")

 

总结:这个网页的目标语句所包含的标签元素中恰好都有文本内容 避免了获取到的文本内容为空的情况

if book.find('span',class_="search_pre_price"):

        price=book.find('span',class_="search_pre_price").text.strip()

        else :

              print('未知')

if后的条件都为真,所以能正常输出

总结:在 Python 中,您所看到的 if 写在后面的这种写法是 三元表达式(Ternary Expression),它是 Python 中的一种简洁写法,用来在一行中实现条件判断。它的格式是:

 

<表达式1> if <条件> else <表达式2>

 

意思是:如果 <条件> 为 True,则返回 <表达式1>,否则返回 <表达式2>。

 

在我的代码中:

 

name = all.find('span', class_="title").text.strip() if all.find('span', class_="title") else "未知"

 

它的意思是:

 

如果 all.find('span', class_="title") 找到一个结果(即不为 None),则执行 all.find('span', class_="title").text.strip(),即获取标题并去掉两端的空格;

 

 

 

 

 

 

标签:span,遇到,python,text,title,爬虫,find,strip,class
From: https://blog.csdn.net/sxdjdjdb/article/details/143216583

相关文章

  • python32位和64位的区别是什么
    python32位和64位有什么区别?64位能够用更大的内存空间,64位可以在64位的系统下运行,但是不能在32位系统下运行。32位能够在32位和64位上运行,考虑到兼容性,建议使用32位的python。如何查看python是32位还是64位可使用IDLE或者CMD查看。方法一:打开IDLE,看第一行提示,例如:32位......
  • python实战项目47:Selenium采集百度股市通数据
    python实战项目47:Selenium采集百度股市通数据一、思路分析二、完整代码一、思路分析这里以获取百度股市通股评下的投票数据为例,页面中的其他数据同理。由于此页面数据是js动态加载的,所以采用Selenium获取数据。思路很简单,通过Selenium打开页面,然后定位到“股评”......
  • Python的NumPy库简介
    Python的NumPy库是一个非常基础且重要的库,它为Python提供了强大的支持,使得Python能够有效地处理大型多维数组和矩阵,以及执行高效的数学计算。NumPy是数据科学、机器学习和深度学习等领域中不可或缺的工具。参考官网:https://numpy.org/doc/NumPy(NumericPython)是Python的一......
  • 综合能源系统分析的统一能路理论(三):《稳态与动态潮流计算》(Python代码实现)
     ......
  • 计算机毕业设计项目推荐:大学生实习成绩评价系统的设计与实现38147(开题答辩+程序定制+
    摘 要21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准确、快速、完善,并能提高工作管理效率,促进其发展。论文主要是对大学生实习成绩......
  • 计算机毕业设计项目推荐,个人知识管理系统 79004(开题答辩+程序定制+全套文案 )上万套实
    摘 要尽管我们每天面临的信息越来越多,信息过载与信息噪音越来越严重,但只要我们能充分利用个人知识管理技能,借助有效的个人知识管理软件相信战胜海量信息不再是困难。本课题在分析了个人知识管理现状以及对现有的个人知识管理网站进行研究比较的基础上,针对网络交流互助的特......
  • dify的docker服务请求内网服务器遇到的问题
    接上一篇文章: https://www.cnblogs.com/neozheng/p/18400589 我有一台10.xxx.20.162的内网服务器运行着dify的dockercompose服务,又起了一台10.xxx.41.11的内网服务器用来运行ollama大模型。我是通过手动的方式安装的ollama,在运行ollama的时候遇到一个问题:ollam......
  • 关于python代码PyInstaller介绍
    PyInstaller打包PyInstaller是一个用于将Python程序打包成独立可执行文件的工具,它使得用户无需安装Python环境即可运行你的程序。一、安装PyInstaller使用以下命令安装PyInstaller:pipinstallpyinstaller二、基本使用方法1.打包简单脚本假设我们有一个简单的......
  • 真AI遇到招聘管理系统,帮助企业打造新质生产力
    知名科技杂志《连线》创始主编凯文·凯利曾预测:“在未来的100年里,人工智能将超越任何一种人工力量,将人类引领到一个前所未有的时代。”确实如此,随着近两年AIGC与大模型的快速爆发,AI在千行百业中的重要性愈发突出,它不但让众多行业迎来了被深度重构的新阶段,同时也成为了驱动新......
  • 10.24Python_pandas_基础
    一、基础1、概述Pandas是一个开源的第三方Python库,从Numpy和Matplotlib的基础上构建而来Pandas名字衍生自术语“paneldata”(面板数据)和“Pythondataanalysis”(Python数据分析)Pandas已经成为Python数据分析的必备高级工具,它的目标是成为强大、灵活、可以......