关于python爬虫解析的问题

news2024/11/19 19:36:47

在进行Python爬虫解析时,需要注意以下事项:

1、良好的网站使用协议:需要遵守网站的robots.txt文件,以确保你的爬虫程序不会将网站拦截下来。

2、编码问题:需要正确设置HTTP头和解析器的编码,以确保爬虫程序能够正确地解析网站的信息。

3、数据解析:需要适当地处理HTML文档中的标签,以便从中筛选出目标数据。

4、网站反爬虫机制:需要了解网站的反爬虫机制,采取相应的策略,确保爬虫程序不会被网站屏蔽。

5、频率控制:需要适度控制爬虫程序的请求频率,以避免给网站带来过多负荷。

6、数据存储:需要将爬取到的数据存储到合适的位置,例如数据库或文件系统中。

7、长期稳定性:需要优化代码,确保程序长期稳定地工作。

今天主要整理python的三种解析方法

正则表达式

1、正则解析主要是以//.和//.?的两种从而获得想要获取的数据就比如说在分页爬取的时候中间的

ex = '<div class="thumb">.*?<img src="(.*?)" alt.*?</div>'
img_src_list = re.findall(ex, page_text, re.S)

这是一个正则表达式的一个解析式 中间的(.*?)就是用来匹配你所要的内容。

主要就是是用python所提供的re模块用于实现正则表达式的操作,在操作的时候可以使用re提供的方法(search(),match(),findall())进行字符串处理;

他们三个都有共同的参数

pattern:模式字符串

string:要进行匹配的字符串

flags:可选参数,表示标识位,用于控制匹配方式,如是否匹配字母大小写

在这里插入图片描述

match()

用于从字符串的开始位置进行匹配如果开始位置匹配成功择返回match对象,否则择返回None

search()

用于整个字符串中搜索第一个匹配到的值,如果匹配成功则返回search对象,如果没有匹配成功则返回None

findall()

用于匹配整个列表中所有符合正测表达式的字符串并一列表的形式返回,,没有则返回None

关于.和.?的区别

.表示匹配换行符之外的任何单字符,*表示零次或者多次,所以.和在一起就是表示出现任意字符零次或者多次。如果没有?则表示贪婪模式

比如 a.b他将会匹配最长的以a开始,以b结束的字符串

.?表示懒惰模式

比如a.?b将会匹配以a开始,以b结束匹配最短的且符合标准的字符串

# 分页爬取
import requests
import os
import re

if __name__ == '__main__':
    if not os.path.exists('./fenyelibs'):
        os.mkdir('./fenyelibs')
    else:
        print()
    # 设置一个通用的url模版
    url = 'https://www.qiushibaike.com/imgrank/page/%d/'
    # pagenum=2
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36 Edg/90.0.818.51'
    }
    for item in range(1, 3):
        pagenum = item
        new_url = format(url % pagenum)
        # print(new_url)
        page_text = requests.get(url=new_url, headers=headers).text
        ex = '<div class="thumb">.*?<img src="(.*?)" alt.*?</div>'
        img_src_list = re.findall(ex, page_text, re.S)
        for src in img_src_list:
            new_src = 'https:' + src
            img_data = requests.get(new_src, headers=headers).content
            img_name = src.split('/')[-1]
            img_path = './fenyelibs/' + img_name
            with open(img_path, "wb")as file:
                file.write(img_data)
                print(img_name, '下载完成')
    print('下载完成!!!')

bs4解析

# 针对与bs4  实例化一个BeautifulSoup对象,并且将页面源码数据加载到该对象中
#            通过调用BeautifulSoup对象中相关的属性或者办法进行标签定位
from bs4 import BeautifulSoup

if __name__ == '__main__':
    fp = open('./text.html', 'r', encoding='utf-8')
    soup = BeautifulSoup(fp, 'lxml')
    #print(soup)
    print(soup.a)#soup.tagname 返回的是HTML中第一次出现的tagname对应的标签
    print('-----')
    print(soup.div)
    #soup.find()
    print('------')
    print(soup.find('div'))#相当于soup.div
    #属性定位
    print('---------属性定位:\n',soup.find('div',class_='song'),'\n')
    print('--------find_all:',soup.find_all('a'))
    #select
    print('----select\n',soup.select('.tang'),'\n')#某种选择器(id,class,标签...选择器),返回的是一个列表 只要符合选择器的要求
    #层级选择器
    print(soup.select('.tang > ul > li > a')[0],'\n')#>是一个层级
    print(soup.select('.tang > ul a')[0])#空格表示多个层级
    #获取标签之间的文本数据  text 和get_text()可以获取标签中的所有文本内容
    #                     string只可以获取该标签下面的直系文本内容
    print(soup.select('.tang > ul a')[0].get_text())
    print(soup.select('.tang > ul a')[0].text)
    print(soup.select('.tang > ul a')[0].string,'\n')
    print('测试一下','\n')
    print(soup.find('div',class_='song').text)
    #获取标签中的属性值'
    print('获取标签中的属性值:\n',soup.select('.tang>ul a')[0]['href'])

他这中间会有find find_all select 三种查找的犯法

find是返回查找到的第一个值

find_all是返回查找到的所有值以列表形式返回

select 某种选择器(id,class,标签…选择器),返回的是一个列表 只要符合选择器的要求

他在进行网页查找的时候要记得在他div的标签属性下加.使用>进行下一个选项如果要跨级去中的话那就要是用空格

xpath解析

from lxml import etree
import requests

if __name__ == '__main__':
    print('hello python!!')
    #实例化一个etree对象,并且被解析的源码也加载到了该对象中
    tree=etree.parse('text.html')
    #调用xpath
    r=tree.xpath('/html/body/div/text()')#在HTML前边加一个/标识从根节点开始 后边的/标识一个层级
    # r=tree.xpath('/html//div')#//表示多个层级
    #r=tree.xpath('//div')#//标识可以从任意的位置去定位div标签
    print(r)
    # r1 = tree.xpath('//div[@class="sng"]/p[3]')
    # r2 = tree.xpath('//div[@class="sang"]/p[3]')  # 索引是从1开始的
    # # print(r1)
    # print(r2)
    r3=tree.xpath('//div[@class="tang"]//li[5]/a/text()')[0]#取文本用/text()
    print(r3)
    r4=tree.xpath('//li[7]//text()')[0]#/txet()获取的是标签中直系的文本内容
                                        #//text()获取的是标签中的非直系的内容
    print(r4)
    r5=tree.xpath('//li//text()')
    for item in r5:
        print(item)
    print('----------------')
    r6=tree.xpath('//div[@class="sang"]/img/@src')#取属性值用/@sttrName 可以取到标签属性当中的文本内容
    print(r6)

这个他就使用的是/进行分级的 要是要想跨级进行查找的话那就要使用//

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/451089.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

低代码开发重要工具:jvs-logic(逻辑引擎)可视化设计要素

逻辑引擎可视化的交互 可视化的服务编排是逻辑引擎的核心功能&#xff0c;逻辑引擎的界面可视化设计是为了方便用户使用和操作逻辑引擎而设计的。一个好的界面设计能够提高用户的工作效率和使用体验&#xff0c;同时也能增加软件的可靠性和可维护性。 以下是逻辑引擎界面可视化…

python数据分析综合案列--星巴克门店数据分析及可视化

本实训针对一组关于全球星巴克门店的统计数据&#xff0c;分析了在不同国家和地区以及中国不同城市的星巴克门店数量。 获取数据&#xff0c;数据放在directory.csv 这个案例主要分为以下几个部分&#xff1a; 数据清洗和预处理&#xff1a;使用 Pandas 进行数据清洗和预处理&…

windows下安装emscripten

Qt系列文章目录 文章目录 Qt系列文章目录前言一、Emscripten SDK介绍二、Emscripten SDK安装Get the emsdk repoEnter that directory 前言 由于Web端需要处理大量图像&#xff0c;大量图片的分辨率8k*8k&#xff0c;使用Canvas API&#xff08;画布&#xff09;是在HTML5中新…

(二)app自动化脚本录制回放

上一篇&#xff1a;(一)app自动化测试环境搭建&#xff08;maciosairtest &#xff09;_airtest环境搭建_要开朗的spookypop的博客-CSDN博客 注&#xff1a;后续都是用IOS设备来介绍自动化测试&#xff0c;安卓就不赘述了。 接上一篇&#xff0c;搭建好自动化测试环境后&#…

如何去阅读Java源码,我总结了18条心法

大家好&#xff0c;我是Martin。 这篇文章我准备来聊一聊如何去阅读开源项目的源码。 在聊如何去阅读源码之前&#xff0c;先来简单说一下为什么要去阅读源码&#xff0c;大致可分为以下几点原因&#xff1a; 最直接的原因&#xff0c;就是面试需要&#xff0c;面试喜欢问源码…

Docker实战笔记4-安装jenkins

转载请标明出处&#xff1a;http://blog.csdn.net/zhaoyanjun6/article/details/130318679 本文出自【赵彦军的博客】 文章目录 拉取 jenkins 镜像排查问题验证结果总结 拉取 jenkins 镜像 在官方镜像仓库查询 jenkins 镜像 https://hub.docker.com/r/jenkins/jenkins 拉取镜…

linux 安装php8.1 ZipArchive和libzip最新版扩展安装

1、概述 安装前咱们先看下我本地环境 [rootelk php8]# cat /etc/redhat-release Red Hat Enterprise Linux Server release 7.9 (Maipo) [rootelk php8]# [rootelk php8]# ./bin/php -v PHP 8.1.18 (cli) (built: Apr 17 2023 13:15:17) (NTS) Copyright (c) The PHP Group Z…

onnx手动操作

使用onnx.helper可以进行onnx的制造组装操作&#xff1a; 对象描述ValueInfoProto 对象张量名、张量的基本数据类型、张量形状算子节点信息 NodeProto算子名称(可选)、算子类型、输入和输出列表(列表元素为数值元素)GraphProto对象用张量节点和算子节点组成的计算图对象ModelP…

命令模式解读

问题引进 看一个具体的需求 1) 我们买了一套智能家电&#xff0c;有照明灯、风扇、冰箱、洗衣机&#xff0c;我们只要在手机上安装 app 就可以控制对这些家电工作。 2) 这些智能家电来自不同的厂家&#xff0c;我们不想针对每一种家电都安装一个 App&#xff0c;分别控制&…

HTTP相关知识

HTTP HTTP 是一种能够获取如 HTML 这样的网络资源的 protocol(通讯协议)。它是在 Web 上进行数据交换的基础&#xff0c;是一种 client-server 协议&#xff0c;也就是说&#xff0c;请求通常是由像浏览器这样的接受方发起的。一个完整的 Web 文档通常是由不同的子文档拼接而成…

苹果通讯录怎么备份?手机通讯录备份的方法看这里!

案例&#xff1a;手机通讯录怎么备份&#xff1f; 【友友们&#xff0c;想问下苹果手机的通讯录怎么样才能进行备份&#xff1f;可以解答我的疑惑吗&#xff1f;感谢&#xff01;】 在日常使用手机过程中&#xff0c;我们经常会遇到误删通讯录的情况。因此&#xff0c;备份通讯…

必须要知道的hive调优知识(上)

Hive数据倾斜以及解决方案 1、什么是数据倾斜 数据倾斜主要表现在&#xff0c;map/reduce程序执行时&#xff0c;reduce节点大部分执行完毕&#xff0c;但是有一个或者几个reduce节点运行很慢&#xff0c;导致整个程序的处理时间很长&#xff0c;这是因为某一个key的条数比其…

QT QPainter坐标变换绘图实例(五角星绘制)

1、绘制3个五角星的程序 创建一个基于 QWidget 的窗口的应用程序 &#xff0c;窗体上不放置任何组件。在 Widget 类的构造函数和paintEvent0事件中编写代码&#xff0c;代码内容如下。 Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(…

Keil生成.bin文件

1. 打开OptionsforTarget 对话框&#xff1a; 2 选择User&#xff1a; 3. 根据User页的配置还要配置Output页面&#xff0c;具体如下&#xff1a; 4. 点击OK确定&#xff0c;然后再重新编译则会按照上图中的配置路径生成.bin格式的文件了&#xff1a; Keil自带的fromelf.exe工具…

D. Ehab and the Expected XOR Problem(构造 + 异或和)

Problem - D - Codeforces 给出两个整数nn和xx&#xff0c;构造一个满足以下条件的数组&#xff1a; 对于数组中的任何元素aiai&#xff0c;1≤ai<2n1≤ai<2n&#xff1b; 没有非空的子段&#xff0c;其位数XOR值等于00或xx、 它的长度ll应该是最大的。 一个序列bb是一个…

flv转换mp4最简单方法,3个保姆级教程

flv转换mp4最简单方法你知道吗&#xff1f;今天小编就来分享分享啦&#xff0c;那么先来说说flv视频格式。这个格式大家可能知道的并不多&#xff0c;它最大的特点就是文件体积偏小&#xff0c;多以在线观看的时候加载速度非常快&#xff0c;它有效解决了视频在导入Flash后出现…

实施推荐系统过程中遇到的坑

引言 推荐系统本身很成熟&#xff0c;但是在落地过程当中&#xff0c;仍然会有很多困难。通过经历几个大型推荐系统项目&#xff0c;总结一些经验&#xff0c;帮助大家避坑。 01推荐系统的技术架构 推荐系统模块一般如上图所示&#xff0c;先通过召回模块&#xff0c;将候选…

云擎未来 万象共生:2023移动云万象生态峰会来袭

云融万象&#xff0c;赋能千行百业&#xff0c;云是万物智能的源泉&#xff0c;生态是移动云与万千伙伴共同发展的沃土。 2023移动云万象生态峰会将于4月25日下午在苏州金鸡湖国际会议中心隆重举行&#xff0c;大会荟聚众多重量级嘉宾&#xff0c;共话生态新发展&#xff0c;同…

语音交友app开发中的用户积分系统

引言 在当今数字时代&#xff0c;语音交友app已成为一种流行的社交工具。它们给用户提供了一个平台&#xff0c;在这里他们可以结交新朋友&#xff0c;分享他们的生活和信仰&#xff0c;并建立深厚的人际关系。然而&#xff0c;市场上存在大量的语音交友app&#xff0c;这使得…

小米集团Jira实战:如何在高负载状态下保持Jira性能与运行稳定

2023年4月14日&#xff0c;Atlassian中国合作伙伴企业日上海站圆满落幕。作为Atlassian全球白金合作伙伴、云专业伙伴&#xff0c;龙智参与了此次活动&#xff0c;并邀请小米集团信息技术部SRE薛世英作为演讲嘉宾&#xff0c;分享了小米公司的Jira实战经验。 以“小米集团Jira实…