爬取一般網(wǎng)站常用的spider。其定義了一些規(guī)則(rule)來提供跟進link的方便的機制。 也許該spider并不是完全適合您的特定網(wǎng)站或項目,但其對很多情況都使用。 因此您可以以其為起點,根據(jù)需求修改部分方法。當然您也可以實現(xiàn)自己的spider。
除了從Spider繼承過來的(您必須提供的)屬性外,其提供了一個新的屬性:rules
一個包含一個(或多個) [Rule]對象的集合(list)。 每個 [Rule]對爬取網(wǎng)站的動作定義了特定表現(xiàn)。 Rule對象在下邊會介紹。 如果多個rule匹配了相同的鏈接,則根據(jù)他們在本屬性中被定義的順序,第一個會被使用。
該spider也提供了一個可復寫(overrideable)的方法:parse_start_url(*response*)
當start_url的請求返回時,該方法被調(diào)用。 該方法分析最初的返回值并必須返回一個 [Item]對象或者 一個 [Request]對象或者 一個可迭代的包含二者對象。
建立爬蟲的方法為:
scrapy genspider -t crawl lagou www.lagou.com
在生成的頁面中
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy.loader import ItemLoader
from items import LagouJobItem, LagouJobItemLoader
from utils.common import get_md5
import datetime
class LagouSpider(CrawlSpider):
name = 'lagou'
allowed_domains = ['www.lagou.com']
start_urls = ['https://www.lagou.com/']
rules = (
# 提取匹配 'category.php' (但不匹配 'subsection.php') 的鏈接并跟進鏈接(沒有callback意味著follow默認為True)
Rule(LinkExtractor(allow=('www.lagou.com/zhaopin/Java/',), )),
# 提取匹配 'item.php' 的鏈接并使用spider的parse_item方法進行分析
Rule(LinkExtractor(allow=('www.lagou.com/jobs/',)), callback='parse_job'),
)
def parse_job(self, response):
item_loader = LagouJobItemLoader(item=LagouJobItem(), response=response)
item_loader.add_css("title", ".job-name span::text")
item_loader.add_value("url", response.url)
item_loader.add_value("url_object_id", get_md5(response.url))
item_loader.add_xpath("job_city", "http://*[@class='job_request']/p/span[2]/text()")
item_loader.add_xpath("work_years", "http://*[@class='job_request']/p/span[3]/text()")
item_loader.add_xpath("degree_need", "http://*[@class='job_request']/p/span[4]/text()")
item_loader.add_xpath("job_type", "http://*[@class='job_request']/p/span[5]/text()")
item_loader.add_css("salary", ".job_request .salary::text")
item_loader.add_css("publish_time", ".publish_time::text")
item_loader.add_css("job_advantage", ".job-advantage p::text")
item_loader.add_css("job_desc", ".job_bt div")
item_loader.add_css("job_addr", ".work_addr")
item_loader.add_css("tags", ".position-label .labels::text")
item_loader.add_css("company_url", "#job_company dt a::attr(href)")
item_loader.add_css("company_name", "#job_company dt a div h2::text")
item_loader.add_value("crawl_time", datetime.datetime.now())
job_item = item_loader.load_item()
yield job_item