环境:
ubuntu : 16.04
python : 3.5.2
scrapy : 1.3.3
编辑器 : vim
分析拉勾网(http://www.lagou.com)
可以看到在左侧有着各行各业的招聘信息,今天就把各行各业的招聘都给拿下来×——×
创建一个scrapy爬虫项目:
scrapy startproject lagou使用基本(basic)模板创建一个蜘蛛(spider):
scrapy genspider lagou1 www.lagou.com整个项目目录结构如下:
配置settings.py文件:
设置请求头(可以根据自己需要设置):
DEFAULT_REQUEST_HEADERS = { 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Encoding':'gzip, deflate, sdch, br', 'Accept-Language':'zh-CN,zh;q=0.8', 'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36', }配置ITEM_PIPELINES优先级:
ITEM_PIPELINES = { 'lagou.pipelines.LagouPipeline': 300, }'''爬太快对人家网站不太好'''',所以设置我设置0.5一次:
DOWNLOAD_DELAY = 0.5最后配置图如下
编写items.py文件(item文件定义抓取数据格式):
因为这里只需要职位的序号,薪水,公司名称,职位名称,公司位置。所以items编写如下
import scrapy from scrapy import Field class LagouItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() index=Field() salary=Field() company=Field() positionname=Field() position=Field()
用firefox里面的Firebug工具分析主页(http://www.lagou.com)左侧的的方向网址:编写代码获取各个方向的网址
因为存在一些url是"javascript:;"
所以用下面的if进行判断:
if 'http' in u:获取各方向网址:
def home_parse(self,response): sel=scrapy.selector.Selector(response) #/html/body/div[2]/div[1]/div[1]/div[1]/div[1] dd=sel.xpath("//div[@class='menu_main job_hopping']") allurl=dd.xpath("//a/@href").extract() for u in allurl: if 'http' in u: yield scrapy.Request(u,callback=self.parse,dont_filter=True)
对每一个方向的页面进行抓取:
例如:
针对这种页面编写代码如下:
def parse(self,response): sel=selector.Selector(response) dd=sel.xpath('//li[@class="con_list_item default_list"]') for d in dd: position=LagouItem() position['index']=d.xpath('@data-index').extract() position['salary']=d.xpath('@data-salary').extract() position['company']=d.xpath('@data-company').extract() position['position']=d.xpath('div[@class="list_item_top"]/div/div/a/span/em/text()').extract() position['positionname']=d.xpath('@data-positionname').extract() yield position if 'http' in purl: yield scrapy.Request(purl,callback=self.parse,dont_filter=True)
将存储数据到文件中(pipelines.py是存储数据的一个模块,你可以设置将数据存储到数据库,也可以存储到文件中):
from lagou.items import LagouItemfrom scrapy import logclass LagouPipeline(object): def process_item(self, item, spider): w=open('position','a') w.write(str(dict(item))+"\n") w.close() log.msg("position added to file!!!",level=log.DEBUG,spider=spider) return item
至此爬虫代码完成
进入项目根目录执行下面命令,查看爬虫是否有无语法错误:scrapy list接着运行爬虫:
scrapy crawl lagou1结果:
这里我抓了大概三万条信息,明天再做分析×××——×××
欢迎大牛前来指教。。。
项目地址:https://git.oschina.net/nanxun/lagou.git