2、Scrapy的shell编程
- 使用 Scrapy 进行爬虫时,先用 shell 程序调试成功后再在 Scrapy 项目中运行,减少直接在 Scrapy 项目中运行出错导致工作效率低
需求:
- 爬取BOSS直聘官网北京地区的招聘信息
- BOSS直聘官网北京地区 url:https://www.zhipin.com/job_detail/?query=&city=101010100&industry=&position=
1)启动shell调试抓取数据
-
使用“scrapy shell 目标页面”命令尝试爬取
-
cmd 窗口下:
scrapy shell https://www.zhipin.com/job_detail/?query=&city=101010100&industry=&position=
分析:
- 目标页面返回 403,没有下载到服务器响应,那就表明对方网站做了一些反爬处理
- 解决方式:浏览器伪装
-
2)浏览器伪装
-
在发送请求时设置 User-Agent 为真实浏览器信息
scrapy shell -s USER_AGENT=‘Mozilla/5.0’ https://www.zhipin.com/job_detail/?query=&city=101010100&industry=&position=
分析:目标页面返回 200,表明可以抓取到数据
3)使用XPath、CSS选择器提取数据
查看response包含的方法:
-
cmd 窗口下:
dir(response)
... 'css' ... 'xpath'
-
使用 XPath 或 CSS选择器取网页中提取感兴趣的信息。
-
XPath 的简化写法:
表达式 作用 nodename 匹配此节点的所有内容 / 匹配根节点 // 匹配任意位置的节点 . 匹配当前节点 … 匹配父节点 @ 匹配属性
-
步骤:
(1)打开目标页面的源码,找到想要数据的模块信息
(2)设计 xpath 语句
-
scrapy shell 请求成功后,测试 xpath 语句获取数据
-
response.xpath(’//div[@class=“job-primary”]’)
分析:获取 “job-primary” 的 div 模块信息
-
response.xpath(’//div[@class=“job-primary”]/div/h3/a/div[@class=“job-title”]/text()’)
分析:获取想要数据的网页源码
-
同上:
response.xpath(’//div[@class=“job-primary”]/div[@class=“info-primary”]/h3/a/div[@class=“job-title”]/text()’)
-
-
response.xpath(’//div[@class=“job-primary”]/div/h3/a/div[@class=“job-title”]/text()’).extract()
分析:获取要想数据的文本信息
-
(3)(亦可用)CSS语句
-
简化写法
- 子节点:>
- 后代节点:空格
-
cmd 窗口下:
response.css(‘div.job-primary>div.info-primary div.job-title’).extract()