基于python爬虫————静态页面和动态页面爬取
文章目录
1. 爬虫的原理
我们在浏览器里面搜索需要查找的目标,这时浏览器会与服务器之间建立一个通常被称作为会话。我给你一个请求你给我做出一个响应。这样就可以得到我们想要获取的知识。
在爬虫中要进行一个伪装,把爬虫伪装一个游览器,防止对ip进行封闭。通常解决办法带上请求头内容,让服务器知道自己是一个浏览器进行访问。
爬虫就是根据上面的这一原理,通过url(资源定位符)向服务器发送请求,随后服务器会做出响应。不过这时我们得到的是一个网页源代码。
百度首页

百度首页源码

爬取打印显示

通过上面的比较我们爬取得到的也就是网页的源代码,我们只需要对页面返回内容做一个筛选,提取我们想要的那部分数据即可,但通常许多网站都有反爬虫机制需要进行预处理。最后把获取到的数据写入到文件或数据库中进行数据的持久化保存。
步骤:通过url发送请求 ————>等待服务器做出响应——————>得到网页源码————>解析页面————>进行筛选————>数据保存
在上述步骤中得到网页源代码和解析页面最为重要,这两部分通常也是最难的,其中主要面对网页上的各种反爬机制,有时候你的道德页面源代码未必就是和网页源代码一模一样的,需进行一个对比分析。
2. 用正则表达式匹配获取数据
正则表达式对于爬虫比起其它方法去获取数据来讲是一个非常高效的手段,它只需要通过返回的网页源码字符串,通过在某种特殊的模式下进行模式匹配,就可以找到我们想要的那部分数据。但正则表达式的匹配模式写起来也是有点难度对于初学者来讲做到快速精确匹配。
使用正则表达式可以归纳为以下两种:
-
在自己写好的模式进行编译,创建模式对象(pattern) ,再通过掉函数并且函数里面只需要传入要匹配的字符串。
-
通过
re.函数名('匹配模式','需要匹配的字符串')来找到需要的字符
当同一个匹配模式需要用到多次选择第一种方法,当匹配模式只需要用到一次选择第二种方法。
正则表达式匹配成功返回的数据类型为字符串,匹配不成功返回None。但我们查看匹配结果时最好进行一个判断是否匹配成功,防止报错。
常用的匹配函数如下:
| 函数名 | 对应功能说明 |
|---|---|
| match() | 从前往后进行匹配,只匹配一次。匹配成功返回re.Match对象再通过调用group()查看对应的值 |
| fullmatch() | 从前往后进行匹配,只匹配一次并且进行完整匹配 |
| search() | 搜索满足匹配模式的字符串,只匹配一次 |
| findall() | 搜索满足所有满足匹配模式的字符,返回一个列表,列表里面的每一个元素就是满足匹配模式的字符串 |
在爬虫里面通常使用findall进行匹配找到所有满足匹配模式的字符串,通过遍历列表查看数据
正则表达式的特殊字符含义如下:
数量限定符

特殊字符

| \u4e00-\u9fa5 | 只匹配中文字体 |
|---|
位置相关字符

常用匹配字符

3. 页面源码解析
页面展示出来的内容

页面源码

通过两张图片的对比我们可以看出我们看到的和服务器返回给我们的还是有很大的区别的。我们在页面上既可以看见图片和文字还可以看见一些视频,但网页源码里面全都是纯文本,图片和视频在源码中对应的是一个个链接。那就意味着我们获取图片和视频等还需要源代码提供的链接进行访问。
在爬虫里面对网页源码进行分析是一项非常重要的技能,需要通过不断地探索找出一些共性。最好对css和JS有一定的了解,了解网页展示给我所看到的原理。
4. 通过requests请求,爬取静态页面
对于通过requests请求页面得到源代码需要进行一个预处理,常用的预处理通过css选择器和xpath进行筛选出我们想要的内容。
4.1 css选择器基本语法
| 选择器 | 示例 | 示例说明 |
|---|---|---|
| .class | .intro | 选择所有的class="intro"的元素 |
| #id | #firstname | 选择所有id="firstname"的元素 |
| * | * | 选择所有元素 |
| elemet | p | 选择所有 元素 |
| element,element | div,p | 选择所有
元素和
元素 |
| element element | div p | 选择
元素内的所有
元素 |
在用css选择器定位元素时,当有可以通过id进行定位首选id,id属性对应的值是唯一的,然后再考虑class属性进行地位元素,如果class属性中有多个值值需要选择一个即可。
4.2 xpath基本语法
| 表达式 | 说明 |
|---|---|
| nodename | 选取此结点的所有子节点 |
| / | 从当前节点选取子节点 |
| // | 从当前节点选取子孙节点 |
| . | 选取当前节点 |
| … | 选取当前节点的父节点 |
| @ | 选取属性 |

xpath还可以结合运算符对元素进行定位
xpath中的谓语(Predicates)
谓语用来查找某个特定的节点或者包含某个指定的值的节点。
谓语被嵌在方括号中。

选取未知节点

选择若干路径

有了上面的基础下面通过案例进行具体分析:
-
通css选择器方法获取豆瓣前25的电影名
import requests from bs4 import BeautifulSoup as Bs url = 'https://movie.douban.com/top250' # 设置请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36', # 先登录,通过开发者工具控制台获取 'Cookies': '**************************************************' } # 建立连接 resp = requests.get(url=url, headers=headers) print(resp

本文介绍了如何使用Python爬虫抓取静态页面的CSS选择器与XPath技巧,以及如何通过requests库和Selenium库处理动态页面。还涵盖了代理IP的使用和多线程提升效率的方法,是爬虫入门和进阶的实用指南。


被折叠的 条评论
为什么被折叠?



