首页 > Python基础教程 > Python Scrapy网络爬虫
阅读:6,696
Python Scrapy shell调试工具及用法(含爬虫案例)
本节示例将会爬取 BOSS 直聘网上广州地区的热门职位进行分析。首先使用浏览器访问 https://www.zhipin.com/c101280100/h_101280100/ 页面,即可看到广州地区的热门职位。
这里我们要使用爬虫来爬取该页面中的信息,因此需要查看该页面的源代码。可以看到,该页面中包含工作信息的源代码如图 1 所示。
下面将会使用 Scrapy 提供的 shell 调试工具来抓取该页面中的信息。使用如下命令来开启 shell 调试:
图 2 使用 shell 调试工具抓取页面信息时出现 403 错误
为了让 Scrapy 伪装成浏览器,需要在发送请求时设置 User-Agent 头,将 User-Agent 的值设置为真实浏览器发送请求的 User-Agent。
查看浏览器的 User-Agent,可按如下步骤进行操作(以 Firefox 为例):
图 3 查看Firefox 发送请求的请求头
因此,可以使用如下命令让 Scrapy 伪装成 Firefox 来开启 shell 调试。
图 4 使用 shell 调试工具成功抓取页面的提示信息
接下来就可以使用 XPath 或 css 选择器来提取我们感兴趣的信息了。
为了让读者能看懂后面的代码,这里简单补充一点 XPath 的必要知识。表 5 中列出了 XPath 最实用的简化写法。
典型的,比如可以使用 //div 来匹配页面中任意位置处的 <div.../> 元素,也可以使用 //div/span 来匹配页面中任意位置处的 <div....> 元素内的 <span.../> 子元素。
XPath 还支持“谓词”,就是在节点后增加一个方括号,在方括号内放一个限制表达式对该节点进行限制。
典型的,我们可以使用 //div[@class]来匹配页面中任意位置处、有 class 属性的 <div.../> 元素,也可以使用 //div/span[1] 来匹配页面中任意位置处的 <div.../> 元素内的第一个 <span.../> 子元素;使用 //div/span[last()] 来匹配页面中任意位置处的 <div.../> 元素内的最后一个 <span.../> 子元素;使用 //div/span[last()-1] 来匹配页面中任意位置处的 <div.../> 元素内的倒数第二个 <span.../> 子元素……
例如,想获取上面页面中的第一条工作信息的工作名称,从图 1 中可以看到,所有工作信息都位于 <div class="job-primary"> 元素内,因此该 XPath 的开始应该写成:
图 6 使用 css 选择器抓取感兴趣的信息
相比之下,XPath 比 css 选择器的匹配能力更强,因此本章的项目会使用 XPath 来匹配、抓取感兴趣的信息。
这里我们要使用爬虫来爬取该页面中的信息,因此需要查看该页面的源代码。可以看到,该页面中包含工作信息的源代码如图 1 所示。
下面将会使用 Scrapy 提供的 shell 调试工具来抓取该页面中的信息。使用如下命令来开启 shell 调试:
scrapy shell https://www.zhipin.com/c101280100/h_101280100/
运行上面命令,将会看到 Scrapy 并未抓取到页面数据,页面返回了 403 错误(如图 2 所示),这表明目标网站开启了“防爬虫”,不允许使用 Scrapy“爬取”数据。为了解决这个问题,我们需要让 Scrapy 伪装成浏览器。图 2 使用 shell 调试工具抓取页面信息时出现 403 错误
为了让 Scrapy 伪装成浏览器,需要在发送请求时设置 User-Agent 头,将 User-Agent 的值设置为真实浏览器发送请求的 User-Agent。
查看浏览器的 User-Agent,可按如下步骤进行操作(以 Firefox 为例):
- 启动Firefox 浏览器,然后按下“Ctrl+Shift+I”快捷键打开浏览器的调试控制台,选择“网络”Tab页。
- 通过该浏览器可以正常浏览任意页面。
- 在浏览器下方的调试控制台中,将会显示浏览器向哪些资源发送了请求。
- 在调试控制台中选择浏览器所请求的任意一个资源,即可在右边看到浏览器发送请求的各种请求头,如图 3 所示。
图 3 查看Firefox 发送请求的请求头
因此,可以使用如下命令让 Scrapy 伪装成 Firefox 来开启 shell 调试。
scrapy shell -s USER_AGENT='Mozilla/5.0' https://www.zhipin.com/c101280100/h_101280100
执行上面命令,将可以看到使用 shell 调试工具成功抓取页面的提示信息,如图 4 所示。图 4 使用 shell 调试工具成功抓取页面的提示信息
接下来就可以使用 XPath 或 css 选择器来提取我们感兴趣的信息了。
为了让读者能看懂后面的代码,这里简单补充一点 XPath 的必要知识。表 5 中列出了 XPath 最实用的简化写法。
表达式 | 作用 |
---|---|
nodename | 匹配此节点的所有内容 |
/ | 匹配根节点 |
// | 匹配任意位置的节点 |
. | 匹配当前节点 |
.. | 匹配父节点 |
@ | 匹配属性 |
典型的,比如可以使用 //div 来匹配页面中任意位置处的 <div.../> 元素,也可以使用 //div/span 来匹配页面中任意位置处的 <div....> 元素内的 <span.../> 子元素。
XPath 还支持“谓词”,就是在节点后增加一个方括号,在方括号内放一个限制表达式对该节点进行限制。
典型的,我们可以使用 //div[@class]来匹配页面中任意位置处、有 class 属性的 <div.../> 元素,也可以使用 //div/span[1] 来匹配页面中任意位置处的 <div.../> 元素内的第一个 <span.../> 子元素;使用 //div/span[last()] 来匹配页面中任意位置处的 <div.../> 元素内的最后一个 <span.../> 子元素;使用 //div/span[last()-1] 来匹配页面中任意位置处的 <div.../> 元素内的倒数第二个 <span.../> 子元素……
例如,想获取上面页面中的第一条工作信息的工作名称,从图 1 中可以看到,所有工作信息都位于 <div class="job-primary"> 元素内,因此该 XPath 的开始应该写成:
//div[@class="job-primary"]
接下来可以看到工作信息还处于 <div class="info-primary"> 元素内,因此该 XPath 应该写成(此处不加谓词也可以)://div[@class="job-primary"]/div
接下来可以看到工作信息还处于 <h3 class="name"> 元素内,因此该 XPath 应该写成(此处不加谓词也可以)://div [@class = "job-primary"]/div/h3
依此类推,可以看到工作名称对应的 XPath 写成://div[@class = "job-primary"]/div/h3/a/div/text()
在掌握了 XPath 的写法之后,即可在 Scrapy 的 shell 控制台调用 response 的 xpath() 方法来获取 XPath 匹配的节点。执行如下命令:response.xpath ('//div[@class="job-primary"]/div/h3/a/div/text()').extract()
上面的 extract() 方法用于提取节点的内容。运行上面命令,可以看到如图 6 所示的输出信息。图 6 使用 css 选择器抓取感兴趣的信息
相比之下,XPath 比 css 选择器的匹配能力更强,因此本章的项目会使用 XPath 来匹配、抓取感兴趣的信息。
所有教程
- socket
- Python基础教程
- C#教程
- MySQL函数
- MySQL
- C语言入门
- C语言专题
- C语言编译器
- C语言编程实例
- GCC编译器
- 数据结构
- C语言项目案例
- C++教程
- OpenCV
- Qt教程
- Unity 3D教程
- UE4
- STL
- Redis
- Android教程
- JavaScript
- PHP
- Mybatis
- Spring Cloud
- Maven
- vi命令
- Spring Boot
- Spring MVC
- Hibernate
- Linux
- Linux命令
- Shell脚本
- Java教程
- 设计模式
- Spring
- Servlet
- Struts2
- Java Swing
- JSP教程
- CSS教程
- TensorFlow
- 区块链
- Go语言教程
- Docker
- 编程笔记
- 资源下载
- 关于我们
- 汇编语言
- 大数据
- 云计算
- VIP视频