假如我们有这样有一个需求,统计一下全国Python相关工作的薪酬状况,于是我们选择了去前程无忧这样的网站,主要是这个网站不用注册就能进行检索
看下一个有多少页:
我们接下来进行操作一把:
(1)首先去创建一个project,我们直接命名为job
接下来就会出现这样一个页面:
(2)把需要爬取的目标连接填进去
我是直接拷贝的链接,看起来略长
(2)尝试运行一下
继续点击:
报错了,这是一个安全错误
我们可以直接 添加一个这个:validate_cert=False
保存一下,重新运行(是返回到第一个代码出运行),出现这样一个结果
也就是出现了,574个我们空可以进行进一步爬取的信息,其实这里的多数是没有价值的,因为我们只需要中间部分,我们默认爬取的是凡是含有http的都进行爬取
(3)修改选择器
我们直接使用pyspider给我们提供的选择器,按照上面操作即可
重新run一下:
现在只有50个,说明前程无忧给我们默认的是每一页50个岗位
(4)先将后面的方法置为spss
重新运行一下:
已经有了这个页面,假如我们需要提取薪酬
(5)提取薪酬
重新运行一下
OK,可以进行提取
(6)设置我们需要提取的页数
from pyspider.libs.base_handler import *
class Handler(BaseHandler):
crawl_config = {
}
def __init__(self):
self.index=1
self.url_base1='https://search.51job.com/list/000000,000000,0000,00,9,99,Python,2,'
self.url_base2='.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare='
@every(minutes=24 * 60)
def on_start(self):
for index in range(30):
self.crawl(self.url_base1+str(index)+self.url_base2, callback=self.index_page,validate_cert=False)
index+=1
@config(age=10 * 24 * 60 * 60)
def index_page(self, response):
for each in response.doc('p > span > a').items():
self.crawl(each.attr.href, callback=self.detail_page,validate_cert=False)
@config(priority=2)
def detail_page(self, response):
salary=response.doc('.cn > strong').text()
print salary
运行一下:
得到了我们设定的30页
(7)将我们需要的数据导成文件
毕竟我们只是进行的print,但是一般来说我们爬虫的目的是为了得到数据,因此我们需要进行导出数据
1)添加路径
self.baseDir = "D:/salary"
2)获取公司名称,以便导出的数据有属性名字
运行一下:
建立路径:
if not os.path.exists(self.baseDir+"/"+company_name):
os.makedirs(self.baseDir+"/"+company_name)
3)写入
运行一下,报错:
[E 181215 21:21:58 base_handler:203] 'ascii' codec can't encode characters in position 0-13: ordinal not in range(128)
Traceback (most recent call last):
File "D:\Python27\lib\site-packages\pyspider\libs\base_handler.py", line 196, in run_task
result = self._run_task(task, response)
File "D:\Python27\lib\site-packages\pyspider\libs\base_handler.py", line 176, in _run_task
return self._run_func(function, response, task)
File "D:\Python27\lib\site-packages\pyspider\libs\base_handler.py", line 155, in _run_func
ret = function(*arguments[:len(args) - 1])
File "<job_python>", line 34, in detail_page
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-13: ordinal not in range(128)
提示说我们的编码错误,那我们设置一下编码
运行一下在,磁盘的目标位置正常也出现了文件
(8)正式进行爬虫
显示爬取状态
静静等待爬取完成