踏實爬取通常網站的經常使用spider,其中定義了一些規則(rule)來提供跟進link的方便機制,也許該spider不適合你的目標網站,可是對於大多數狀況是能夠使用的。所以,能夠以此爲七點,根據需求修改部分方法,固然也能夠實現本身的spider。php
官方文檔:http://scrapy-chs.readthedocs.io/zh_CN/0.24/topics/spiders.html#crawlspiderhtml
建立爬蟲文件:scrapy genspider -t crawl "spider_name" "url"node
獲得以下目錄:python
其中spider文件夾中的爬蟲文件下的內容以下所示:正則表達式
CrawlSpider是Spider的派生類,Spider類的設計原則是隻爬取start_url列表中的網頁,而CrawlSpider類中定義了一些規則(rule)來提取跟進link的方便機制,從而爬取的網頁中獲取link並繼續爬取。dom
Name:定義spider的名字scrapy
allow_domains:包含了spider容許抓起去的域名列表。ide
start_url:初始化url列表,當沒有指定的url時,spider將從該列表中開始進行爬取。函數
start_requests(self):該方法返回一個可迭代對象,該對象包含了spider用於抓取的第一個request。網站
parse(self, resposne):默認的Request對象回調函數,用來處理返回的response,以及生成Items或者Request對象。
編寫CrawlSpider,抓取騰訊招聘的信息,具體網頁分析,見:
http://www.cnblogs.com/pythoner6833/p/9018782.html
具體代碼以下:
# -*- coding: utf-8 -*- import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from tencent2.items import Tencent2Item, DetailsItem class Tencent2Spider(CrawlSpider): # 爬蟲名 name = 'Tencent2' # 容許抓取的url allowed_domains = ['hr.tencent.com'] # 請求開始的url start_urls = ['https://hr.tencent.com/position.php?'] # rules屬性 rules = ( # 定義規則,抓取符合要求的url # allow是容許爬取的規則,後面的內容是正則表達式,匹配頁面中全部符合匹配規則的a標籤 # callback是回調函數,用於解析抓取到的符合匹配的連接 # follow:是否跟進,是否繼續請求抓取到的連接 Rule(LinkExtractor(allow=r'start=\d+'), callback='parse_tencent', follow=True), #編寫匹配詳情頁的規則,抓取到詳情頁的連接後不用跟進 Rule(LinkExtractor(allow=r'position_detail\.php\?id=\d+'), callback='parse_detail', follow=False), ) def parse_tencent(self, response): # 獲取頁面中招聘信息在網頁中位置節點 node_list = response.xpath('//tr[@class="even"] | //tr[@class="odd"]') # 遍歷節點,進入詳情頁,獲取其餘信息 for node in node_list: # 實例化,填寫數據 item = Tencent2Item() item['position_name'] = node.xpath('./td[1]/a/text()').extract_first() item['position_link'] = node.xpath('./td[1]/a/@href').extract_first() item['position_type'] = node.xpath('./td[2]/text()').extract_first() item['wanted_number'] = node.xpath('./td[3]/text()').extract_first() item['work_location'] = node.xpath('./td[4]/text()').extract_first() item['publish_time'] = node.xpath('./td[5]/text()').extract_first() yield item def parse_detail(self, response): """ 解析詳情頁數據 :param response: :return: """ item = DetailsItem() # 從詳情頁獲取工做責任和工做技能兩個字段名 item['work_duties'] = ''.join(response.xpath('//ul[@class="squareli"]')[0].xpath('./li/text()').extract()) item['work_skills'] = ''.join(response.xpath('//ul[@class="squareli"]')[1].xpath('./li/text()').extract()) yield item
其餘部分,包括items.py和數據保存的pipelines.py裏的代碼編寫和上文中連接裏的已解釋。