python爬虫学习记录

浏览器工具

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)
    # 后续的爬虫工作.....

posted @   STONEEEEE  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示