首页 > 编程语言 >python爬虫学习记录

python爬虫学习记录

时间:2023-06-08 23:13:16浏览次数:67  
标签:xpath 匹配 记录 python text 爬虫 li print 选择器

浏览器工具

web请求过程

http协议

数据解析

目的提取有效的数据信息

四种解析方式

  1. re解析:正则表达式解析,效率特别高
  2. bs4解析:老项目的解析方式
  3. xpath解析:高级,简单方便速度快
  4. pyquery解析:模仿前端的jQuery函数库的解析方式

正则表达式 Regular Expression

一种使用表达式对字符串进行匹配的语法规则,由于我们抓取到的页面源代码本质上就是一个超长的字符串,所以使用正则最好不过

正则比表达式测试网站:tool.oschina.net/regex/

常用元字符:

. 匹配出换行符以外的所有字符
\w 匹配字母或数字或下划线
\d 匹配数字
\s 匹配空白字符

^string 匹配以string开始的字符串
string$ 匹配以string结尾的字符串

\W 匹配非字母和数字和下划线
\D 匹配非数字
\S 匹配非空白字符
a|b 匹配字符串a或字符串b
() 
[...] 匹配字符组
[^..] 匹配除字符组以外的所有内容

量词:匹配元字符出现的次数 ()表示元字符的位置

()* 重复0次或多次
()+ 重复1次或多次
()? 重复0次或一次
(){n} 重复n次
(){n,} 重复n次或多次
(){n,m} 重复n次到m次

贪婪匹配和惰性匹配

.*() 贪婪匹配 尽可能多的匹配
.*?() 惰性匹配 尽可能少的匹配

re模块

使用时直接导入,是python的内置模块

# 使用时直接导入,是python的内置模块
import re

# findall函数匹配正则表达式
# 字符串前加r识别为正则表达式
result = re.findall(r"\d+", "100和200和300");
print(result)

# finditer 作用同findall返回一个迭代器
result1 = re.finditer(r"\d+", "100和200和300");

# print(result1)
# <callable_iterator object at 0x000001E5A54BF070>
# 遍历迭代器
for item in result1:
    print(item.group())

# search只会匹配一次
result2 = re.search(r"\d+", "我叫周杰伦,今年32岁,班级是3年二班")
print(result2.group())

# match匹配必须以正则表达式开头,相当于^
result3 = re.match(r"\d+", "我叫周杰伦,今年32岁,班级是3年二班")
print(result3)
print(">"*50)

# 预加载
# compile 预先加载正则,防止重复加载,减少内存消耗
obj = re.compile(r"\d+")

s = """
<div class='西游记'><span id='10010'>中国联通</span></div>
<div class='西游记'><span id='10086'>中国移动</span></div>
"""
# 加上括号只提取括号内正则匹配到的内容,?P<>为该内容命名
obj = re.compile(r"<span id='(?P<id>\d+)'>(?P<name>.*?)</span></div>")

# result5得到一个列表
result5 = obj.findall(s)
print(result5)

# result4得到一个迭代器
result4 = obj.finditer(s)
for item in result4:
    id = item.group("id")
    print(id)
    name = item.group("name")
    print(name)

HTML基础语法

超文本标记语言,是编写网页的最基本也是最核心的一种语言,其语法规则就是用不同的标签对网页上的内容进行标记,从而使网页展示出不同的页面效果

  1. <标签名 属性=“值”>被标记内容</标签名>
  2. <标签名 属性=“值” />

CSS基础语法

CSS全程层叠样式表,主要用来定义页面内容展示效果的一门语言

HTML:页面骨架,素颜

CSS:页面效果梅花,美妆+滤镜

CSS语法规则

  • 通过style属性来编写样式
  • 通过style标签,然后使用选择器来编写样式
  • 在css文件中编写样式,通过link引入该文件

css选择器

  • id选择器 #

  • 标签选择器 标签

  • 类选择器 .

  • 选择器分组 ,

  • 后代选择器 空格

  • 子选择器 >

  • 相邻选择器 +

  • 属性选择器 [属性=值]

bs4解析

# 安装bs4
# pip install bs4
from bs4 import BeautifulSoup

html = """
<ul>
    <li><a href="zhangwuji.com">张无忌</a></li>
    <li id="abc"><a href="zhouxingchi.com">周星驰</a></li>
    <li><a href="zhubajie.com">猪八戒</a></li>
    <li><a href="wuzetian.com">武则天</a></li>
    <a href="jinmaoshiwang.com">金毛狮王</a>
</ul>
"""

# 1. 初始化BeautifulSoup对象,第二个参数是设置解析器格式为html
page = BeautifulSoup(html, "html.parser")
# page.find("标签名", attrs={"属性": "值"})  # 查找某个元素, 只会找到一个结果
# page.find_all("标签名", attrs={"属性": "值"})  # 找到一堆结果,得到的是一个列表

# li = page.find("li", attrs={"id":"abc"})
# a = li.find("a")
# print(a.text)  # 拿文本
# print(a.get("href"))  # 拿属性. get("属性名")


li_list = page.find_all("li")
for li in li_list:
    a = li.find("a")
    text = a.text
    href = a.get("href")
    print(text, href)


xpath解析

xpath是一门在XML文档中查找信息的语言。xpath可用来在XML文档中对元素和属性进行遍历,而我们熟知的HTML恰巧属于XML的一个子集。所以完全可以用xpath去查找html中的内容

from lxml import etree

# 如果pycharm报错. 可以考虑这种导入方式
# from lxml import html
# etree = html.etree

xml = """
<book>
    <id>1</id>
    <name>野花遍地香</name>
    <price>1.23</price>
    <nick>臭豆腐</nick>
    <author>
        <nick id="10086">周大强</nick>
        <nick id="10010">周芷若</nick>
        <nick class="jay">周杰伦</nick>
        <nick class="jolin">蔡依林</nick>
        <div>
            <nick>惹了</nick>
        </div>
    </author>
    <partner>
        <nick id="ppc">胖胖陈</nick>
        <nick id="ppbc">胖胖不陈</nick>
    </partner>
</book>
"""
# 此时练习只能用XMLxml
# et = etree.XML(xml)
# result = et.xpath("/book")  # / 表示根节点
# result = et.xpath("/book/name")   # 在xpath中间的/表示的是儿子
# result = et.xpath("/book/name/text()")[0]   # text() 拿文本
# result = et.xpath("/book//nick")  # //表示的是子孙后代.
# result = et.xpath("/book/*/nick/text()")  # * 通配符. 谁都行
# result = et.xpath("/book/author/nick[@class='jay']/text()")  # []表示属性筛选. @属性名=值   find(Nick, attrs={"class":"jay"})
# result = et.xpath("/book/partner/nick/@id")  # 最后一个/表示拿到nick里面的id的内容, @属性. 可以直接拿到属性值
# print(result)


# xpath处理HTML

html = """
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>Title</title>
</head>
<body>
    <ul>
        <li><a href="http://www.baidu.com">百度</a></li>
        <li><a href="http://www.google.com">谷歌</a></li>
        <li><a href="http://www.sogou.com">搜狗</a></li>
    </ul>
    <ol>
        <li><a href="feiji">飞机</a></li>
        <li><a href="dapao">大炮</a></li>
        <li><a href="huoche">火车</a></li>
    </ol>
    <div class="job">李嘉诚</div>
    <div class="common">胡辣汤</div>
</body>
</html>

"""

et = etree.HTML(html)
# li_list = et.xpath("/html/body/ul/li[2]/a/text()")
# print(li_list)


li_list = et.xpath("//li")  # 找到所有的li标签
for li in li_list:
    href = li.xpath("./a/@href")[0]  # ./表示当前节点
    text = li.xpath("./a/text()")[0]  # ./表示当前节点
    print(text, href)
    # 后续的爬虫工作.....

标签:xpath,匹配,记录,python,text,爬虫,li,print,选择器
From: https://www.cnblogs.com/stonejc/p/17467930.html

相关文章

  • 【Python查漏补缺(一)】闭包和装饰器
    闭包的构成条件:在函数嵌套(函数里面再定义函数)的前提下内部函数使用了外部函数的变量(还包括外部函数的参数)外部函数返回了内部函数简单闭包deffun_out(num1):  #定义外部函数  deffun_inner(num2):    #内部函数使用了外部函数的变量  ......
  • 【Python查漏补缺(二)】正则表达式与深浅拷贝
    在开始正题之前讲一下打开文件的另一种方式。之前打开文件的方式f=open("文件路径","文件打开方式",encoding="utf8")模式描述r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开......
  • 数据库记录安全解决方案
    via: http://netkiller.github.io/journal/mysql.security.html 1. 什么是防删除,防撰改禁止数据删除,数据一旦增加不允许数据被任何人删除禁止数据修改,数据一旦建立不允许对数据做修改操作2. 为什么要做防删除,防撰改限制很多时候我们的数据是只增加,不会删除数据。有些敏......
  • 【视频】Python的天气数据爬虫实时抓取采集和可视化展示
    全文链接:http://tecdat.cn/?p=32715原文出处:拓端数据部落公众号分析师:XiaoyangZhou本文以天气数据实时抓取和可视化展示为主题,旨在探讨如何使用Python编写程序来实现对天气数据的抓取、可视化和预测。从中国气象局天气预报网来获取数据首先,我们需要从中国气象局天气预报网上......
  • python爬虫——爬取网易云音乐评论内容
    一、选题背景  随着互联网的快速发展,网络上的评论文本资源急速增长。面对海量的网络资源信息,如何运用python爬虫技术爬取数据进行数据分析,挖掘评论文本中蕴含的丰富价值。二、大数据分析设计方案1.爬虫网站https://music.163.com/?from=wsdh#/song?id=2052441038 ......
  • 实验6turtle绘图与python库应用编程体验
    实验任务1test1实验代码fromturtleimport*defmove(x,y):penup()goto(x,y)pendown()defdraw(n,size=100):foriinrange(n):fd(size)left(360/n)defmain():pensize(2)pencolor('red')move(-200,0)......
  • Python取整及四舍五入
    向上取整:math.ceil()importmathmath.ceil(-0.9)>>>0math.ceil(0.3)>>>1向下取整:math.floor()、int()、//(整除)math.floor(-0.3)>>>-1int(0.9)>>>03//2#1.5>>>1虚假的四舍五入:round()""&quo......
  • 14dayPythonTask7-类与对象+魔法函数
    目录类与对象1.对象=属性+方法2.self是什么?3.Python的魔法方法4.公有和私有5.继承6.组合7.类、类对象和实例对象8.什么是绑定?9.一些相关的内置函数(BIF)练习题魔法方法1.基本的魔法方法2.算术运算符3.反算术运算符4.增量赋值运算符5.一元运算符6.属性访问7.描......
  • 【python】lambda
    lambdalambda是匿名函数,也就是没有名字的函数。lambda的语法非常简单:下面是一个lambda表达式的简单例子,我们可以把lambda表达式赋值给一个变量,然后通过这个变量来使用它:>>>my_sum=lambdax,y:x+y>>>my_sum(1,2)3lambda默认参数详解语法lambda[parameter_list,p......
  • python常用函数(zip,map,filter,reduce)
    一、zip它是Python的内建函数,(与序列有关的内建函数有:sorted()、reversed()、enumerate()、zip()),其中sorted()和zip()返回一个序列(列表)对象,reversed()、enumerate()返回一个迭代器(类似序列)>>>name=('jack','man','sony','pcky')>>>age=(2001,2003,2005,......