scrapy之Crawspider 腾讯招聘实战案例

1.  在虚拟机中cd到项目目录,再运行下面代码创建spider文件:

  scrapy genspider -t crawl test www.baidu.com

   

2.  spider.py代码

  

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from tanzhou.items import TanzhouItem,DetailItem

class TencentSpider(CrawlSpider):
    name = 'tencent'
    allowed_domains = ['hr.tencent.com']
    start_urls = ['https://hr.tencent.com/position.php?lid=2268&tid=87&keywords=python']

    rules = (
        Rule(LinkExtractor(allow=r'start=\d+'), callback='parse_item',follow=True),
        Rule(LinkExtractor(allow=r'position_detail\.php\?id=\d+'), callback='parse_detail_item', follow=False),

    )

    def parse_item(self, response):
        # 解析职位信息
        tr = response.xpath(
            '//table[@class="tablelist"]/tr[@class = "even"]|//table[@class="tablelist"]/tr[@class = "odd"]')
        if tr:
            for i in tr:
                # 第二种方式,用items.py约束
                item = TanzhouItem()
                item["jobName"] = i.xpath('./td[1]/a/text()').extract_first()
                item["jobType"] = i.xpath('./td[2]/text()').extract_first()
                item["Num"] = i.xpath('./td[3]/text()').extract_first()
                item["Place"] = i.xpath('./td[4]/text()').extract_first()
                item["Time"] = i.xpath('./td[5]/text()').extract_first()

                yield item
    def parse_detail_item(self,response):
        item = DetailItem()
        item['detail_content'] = response.xpath("//ul[@class = 'squareli']/li/text()").extract()
        item['detail_content'] = '\n'.join(item['detail_content'])
        yield item

3.  items代码:

  

import scrapy


class TanzhouItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    jobName = scrapy.Field()
    jobType = scrapy.Field()
    Num = scrapy.Field()
    Place = scrapy.Field()
    Time = scrapy.Field()
class DetailItem(scrapy.Item):
    detail_content = scrapy.Field()

4.  pipelines代码:

  

import json
from tanzhou.items import TanzhouItem,DetailItem

class TanzhouPipeline(object):
    def process_item(self, item, spider):
        # 数据json化 ,如果是用items 则需要先转化成字典格式dict()再用json
        # item = json.dumps(item,ensure_ascii=False)
        if isinstance(item,TanzhouItem):
            item = json.dumps(dict(item),ensure_ascii=False)
            self.f.write(item)
            self.f.write('\n')
        if isinstance(item,DetailItem):
            item = json.dumps(dict(item), ensure_ascii=False)
            self.f2.write(item)
            self.f2.write('\n')

        return item
    # 爬虫开启时运行
    def open_spider(self,spider):
        # 打开文件
        self.f = open('info2.json','w')
        self.f2 = open('detail2.json', 'w')
    # 爬虫关闭时运行
    def close_spider(self,spider):
       #  关闭文件
       self.f.close()
       self.f2.close()

 

posted @ 2019-01-28 16:52  山…隹  阅读(179)  评论(0编辑  收藏  举报