Python爬虫教程(一):基础知识

目录

01 基础知识

1.1 渲染

1.2 http(超文本传输协议)协议

1.3 requests进阶

02 数据解析

2.1 re模块

2.2 bs4模块

2.3 xpath模块

01 基础知识

1.1 渲染

1° 服务器渲染:  直接可以获取源数据,然后用于分析  2° 客户端渲染:  第一次请求只有一个html骨架,查看network预览没有办法获取想要的数据  第二次请求才是拿数据,进行数据展示

1.2 http(超文本传输协议)协议

1° 请求  请求行:请求方式(get/post)请求地址  请求头Requests Headers:放一些服务器的附加信息(反爬也在这里)  User-Agent:请求载体的身份标识(用啥浏览器)  Referer:防盗链(这次请求从哪个页面来的?反爬注意)  cookie:本地字符串数据信息(用户登录信息,反爬的token)  请求体:放一些请求参数 2° 响应  状态行:协议 状态码 200(成功) 404丢失  响应头Response Headers:放在客户端要使用的一些附加信息  cookie:本地字符串数据信息(用户登录信息,反爬的token)奇怪字符串,一般是token字样  响应体:服务i返回客户端要用的内容

1.3 requests进阶

1° 模拟浏览器登陆  登陆——得到cookie——>请求书架——获得内容(连续操作)  seesion请求(会话):可以保证一连串请求保证cookie不丢失,或者一开始就把cookie放入get请求中
2° 防盗链处理(简单的反爬处理)  网页源代码没有而开发者工具中有,表明材料是有二次加载,  然后刷新后在开发者工具中获取下载链接,但是发现链接无效存在猫腻,  在拼接url进入时,加上headers仍然显示该视频已下线表明反爬,  这时候需要加入防盗链,加入referer

02 数据解析

2.1 re模块

re模块即正则表达式,将在第三讲着重介绍。

python爬虫教程(三):正则表达式

2.2 bs4模块

直接定位到专属标签,然后通过find定位查找内容,之后会着重讲解。

python爬虫教程(五):解析库bs4及爬取实例

2.3 xpath模块

1° 节点的排序
(a)利用[ 下标 ]来选择对应位置的节点,注意xpath的下标是从1开始的:    tree.xpath('//div[@class="root"]/div/p[2]/text()')    (b)当前层所有子节点最后一个的位置下标:last():    tree.xpath('//div[@class="root"]/div/p[last()]/text()')        最后一个位置再往前一个位置的p标签:    tree.xpath('//div[@class="root"]/div/p[last()-1]/text()')    (c)位置小于等于2的元素:position(),and与or关键词还可以组合多个条件:    tree.xpath('//div[@class="root"]/div/p[position() <= 2]/text()')    tree.xpath('//div[@class="root"]/div/p[position() != 1 and position() != last()]/text()')    (d)使用*通配符匹配任何满足之后条件的节点,不需要考虑父亲节点:    tree.xpath("//*[@class='price' or @class='price-item']/text()")​​​​
2° 函数用法(a) 筛选出嵌套文本长度大于5的嵌套文本:string-length(属性):    tree.xpath("//ul/li[string-length(text()) > 5]/text()")    (b) 可用于判断对应属性是否包含指定的“子字符串”:contains(属性,子字符串)      tree.xpath("//ul/li[contains(@class, 'price')]/text()")         (c) 匹配指定字符开头的节点:starts-with(属性,子字符串):    tree.xpath("//ul/li[starts-with(text(), '上证')]/text()")    (d) 用于计算对应的节点数量:count():    tree.xpath("count(//ul/li)")    (e) 开头结尾匹配:ns:match()配合特殊的namespaces:            1) “以中文结尾”的模式:        tree.xpath("//ul/li[ns:match(text(), '点$')]/text()",               namespaces={"ns": "http://exslt.org/regular-expressions"})         2)  “以中文开头”的模式:        tree.xpath("//ul/li[ns:match(text(), '^[\u4e00-\u9fa5]')]/text()",               namespaces={"ns": "http://exslt.org/regular-expressions"})

3° 节点关系
(a)同级关系中最简单的是self:代表当前节点自身,用法格式是self::标签名称):    tree.xpath('//div/p/self::p/text()')    (b) 通配符代表所有内容* 代替标签名称,即匹配任何标签:    tree.xpath('//div/p/self::*/text()')     (b)找到当前节点的同级节点中(都在
下)且顺序在它之后/前的:following-sibling/preceding-sibling: tree.xpath("//div/p[text()='第三段']/following-sibling::*/text()") tree.xpath("//div/p[text()='第三段']/preceding-sibling::*/text()") (c)选定节点的上一级及以上层次的其他节点称作先辈节点: 1) 父辈节点:parent轴: tree.xpath('//div[@class="self"]/parent::*/@class') 2) 先辈 / 先辈+自己:ancestor / ancestor-or-self: tree.xpath('//div[@class="self"]/ancestor::*/@class') tree.xpath('//div[@class="self"]/ancestor-or-self::*/@class') 3) 后代关系:子女:child;所有后代:descendant;所有后代和自己:descendant-or-self: tree.xpath("//div[@class='uncle']/child::*/@class") tree.xpath("//div[@class='grandpa']/descendant::*/@class") tree.xpath("//div[@class='grandpa']/descendant-or-self::*/@class") 4) html文档中,一对标签均出现在当前节点 之前 / 之后 的其他节点: tree.xpath('//div[@class="cousin"]/preceding::*/@class') tree.xpath('//div[@class="self"]/following::*/@class') (d)相对查找                 1) 子路径下查找: list = tree.xpath("/html/body/ol/li") for li in list: li.xpath("./a/text()") 2) 查找属性值:用@获取想要的属性值,具体文本的时候也是通过@具体定位到这里 li.xpath("./a/@href")

4° 补充知识点
(a) 运算符同时获取多种异构节点集合,前面的结构不同:|符号可以解决:    tree.xpath("//div[@class='type1']/text() | //p[@class='p1']/text() | //a[@class='a1']/@href")                (b)利用not运算符进行条件的反转,所有不含href属性的标签text()值:     tree.xpath("//*[not(@href)]/@class")                (c)有些格式刁钻的内容不太容易直接用xpath一步到位提取出来,先利用xpath进行一次粗略定位,    再利用etree.tostring()方法还原定位到的节点对应html源码:    原始结果是bytes字节串,需要decode    etree.tostring(child_nodes[0]).decode()     配合html库中的unescape函数来还原    import html    html.unescape(etree.tostring(child_nodes[0]).decode())            
(d)可以对文件进行提取:    tree = etree.parse("b.html")    如果提取文件需要进行转码,可以通过以下操作              parser = etree.HTMLParser(encoding="utf-8")    tree = etree.parse("b.html",parser=parser)

你可能感兴趣的:(爬虫系列教程,python,爬虫,http)