scrapy CrawlSpider

 

Scrapy

Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。

Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。

crawlspider

crawlspider为scrapy中spider的派生类。可以说是专门为全站爬虫所生。通过命令行生成

scrapy genspider -t crawl spidername url

现在爬取的是腾讯招聘页面的所有信息

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from tenxun.items import ScrapyspidertestItem,infoItem


class Tenxun2Spider(CrawlSpider):
    name = 'tenxun2'
    allowed_domains = ['hr.tencent.com']
    start_urls = ['https://hr.tencent.com/position.php?keywords=&tid=0'] # 初始爬取的链接
    base_url = "https://hr.tencent.com/"
    rules = (
        Rule(LinkExtractor(allow=r'position\.php\?keywords=&tid=0&start=\d+#a'),callback='parse_item',follow=True),# 爬取列表页的其他链接
        Rule(LinkExtractor(allow=r'position_detail\.php\?id=\d+&keywords=&tid=\d+&lid=\d+'), callback='parse_info', follow=False)# 爬取详细页的链接
    )


    def parse_info(self,response):
    '''解析详情页的信息,获取工作职责,工作要求'''
        item = infoItem()
        work_duty_list = response.xpath('//tr[3]//li/text()').extract()
        work_require_list = response.xpath('//tr[4]//li/text()').extract()
        item['result_Duties'] = ''.join(work_duty_list)
        item['result_Claim'] = ''.join(work_require_list)
        yield item

    def parse_item(self, response):
    '''解析列表页的页面信息'''
        result_list = response.xpath("//tr[@class='even']| //tr[@class='odd']")
        for node_obj in result_list:
            item = ScrapyspidertestItem()
            item['result_name'] = node_obj.xpath('.//a/text()').extract_first()
            item['result_url'] = 'https://hr.tencent.com/' + node_obj.xpath('.//a/@href').extract_first()
            item['result_type'] = node_obj.xpath('.//td[2]/text()').extract_first()
            item['result_num'] = node_obj.xpath('.//td[3]/text()').extract_first()
            item['result_pos'] = node_obj.xpath('.//td[4]/text()').extract_first()
            item['result_date'] = node_obj.xpath('.//td[5]/text()').extract_first()
            yield item

其他的item,和pipline都可以与原来的配置相同。

posted @ 2019-01-10 19:54  一颗大白菜_20181203  阅读(263)  评论(0编辑  收藏  举报