1.深度爬蟲crawlspider
scrapy.spiders.CrawlSpider
創(chuàng)建項(xiàng)目:scrapy startproject <project_name>
創(chuàng)建爬蟲:scrapy genspider -t crawl <spider_name> <domains>
核心處理規(guī)則:from scrapy.spiders import CrawlSpider,Rule
核心處理提取:from scrapy.linkextractors import LinkExtractor
2.鏈接提?。篖inkExtractor
class scrapy.contrib.linkextractor.sgml.SgmlLinkExtractor(
allow = (), #符合正則表達(dá)式參數(shù)的數(shù)據(jù)會(huì)被提取
deny = (), #符合正則表達(dá)式參數(shù)的數(shù)據(jù)會(huì)禁止提取
allow_domains = (), #包含在域名中可以提取數(shù)據(jù)
deny_domains = (), #包含在域名中禁止提取數(shù)據(jù)
deny_extensions = (),
restrict_xpath = (), #使用xpath提取數(shù)據(jù),和allow共同起作用
tags = (), #根據(jù)標(biāo)簽名稱提取數(shù)據(jù)
attrs = (), #根據(jù)標(biāo)簽屬性提取數(shù)據(jù)
canonicalize = (),
unique = True, #剔除重復(fù)鏈接請(qǐng)求
process_value = None
)
classscrapy.contrib.spiders.CrawlSpider
爬取一般網(wǎng)站常用的spider。其定義了一些規(guī)則(rule)來提供跟進(jìn)link的方便的機(jī)制。 也許該spider并不是完全適合您的特定網(wǎng)站或項(xiàng)目,但其對(duì)很多情況都使用。 因此您可以以其為起點(diǎn),根據(jù)需求修改部分方法。當(dāng)然您也可以實(shí)現(xiàn)自己的spider。
除了從Spider繼承過來的(您必須提供的)屬性外,其提供了一個(gè)新的屬性:
rules
一個(gè)包含一個(gè)(或多個(gè)) Rule
對(duì)象的集合(list)。 每個(gè) Rule
對(duì)爬取網(wǎng)站的動(dòng)作定義了特定表現(xiàn)。 Rule對(duì)象在下邊會(huì)介紹。 如果多個(gè)rule匹配了相同的鏈接,則根據(jù)他們?cè)诒緦傩灾斜欢x的順序,第一個(gè)會(huì)被使用。
該spider也提供了一個(gè)可復(fù)寫(overrideable)的方法:
parse_start_url(response)
當(dāng)start_url的請(qǐng)求返回時(shí),該方法被調(diào)用。 該方法分析最初的返回值并必須返回一個(gè) Item
對(duì)象或者 一個(gè) Request
對(duì)象或者 一個(gè)可迭代的包含二者對(duì)象。
3.爬取規(guī)則
rules = [
Rule(
link_extractor, # LinkExtractor對(duì)象
callback=None, # 請(qǐng)求到響應(yīng)數(shù)據(jù)時(shí)的回調(diào)函數(shù)
cb_kwargs=None, # 調(diào)用函數(shù)設(shè)置的參數(shù)
follow=None, # 是否從response跟進(jìn)鏈接:不要指定為parse
process_links=None, # 過濾linkextractor列表,每次獲取列表時(shí)都會(huì)調(diào)用
process_request=None # 過濾request,每次提取request都會(huì)調(diào)用
)
]
classscrapy.contrib.spiders.Rule(link_extractor, callback=None, cb_kwargs=None, follow=None,process_links=None, process_request=None)
link_extractor
是一個(gè) Link Extractor 對(duì)象。 其定義了如何從爬取到的頁面提取鏈接。
callback
是一個(gè)callable或string(該spider中同名的函數(shù)將會(huì)被調(diào)用)。 從link_extractor中每獲取到鏈接時(shí)將會(huì)調(diào)用該函數(shù)。該回調(diào)函數(shù)接受一個(gè)response作為其第一個(gè)參數(shù), 并返回一個(gè)包含Item
以及(或) Request
對(duì)象(或者這兩者的子類)的列表(list)。
警告
當(dāng)編寫爬蟲規(guī)則時(shí),請(qǐng)避免使用 parse作為回調(diào)函數(shù)。 由于 CrawlSpider 使用 parse方法來實(shí)現(xiàn)其邏輯,如果 您覆蓋了 parse方法,crawl spider 將會(huì)運(yùn)行失敗。
cb_kwargs 包含傳遞給回調(diào)函數(shù)的參數(shù)(keyword argument)的字典。
follow 是一個(gè)布爾(boolean)值,指定了根據(jù)該規(guī)則從response提取的鏈接是否需要跟進(jìn)。 如果callback 為None, follow 默認(rèn)設(shè)置為 True ,否則默認(rèn)為 False 。
process_links 是一個(gè)callable或string(該spider中同名的函數(shù)將會(huì)被調(diào)用)。 從link_extractor中獲取到鏈接列表時(shí)將會(huì)調(diào)用該函數(shù)。該方法主要用來過濾
process_request 是一個(gè)callable或string(該spider中同名的函數(shù)將會(huì)被調(diào)用)。 該規(guī)則提取到每個(gè)request時(shí)都會(huì)調(diào)用該函數(shù)。該函數(shù)必須返回一個(gè)request或者None。 (用來過濾request)
CrawlSpider樣例
import scrapy
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors import LinkExtractor
class MySpider(CrawlSpider):
name = 'example.com'
allowed_domains = ['example.com']
start_urls = ['http://www.example.com']
rules = (
# 提取匹配 'category.php' (但不匹配 'subsection.php') 的鏈接并跟進(jìn)鏈接(沒有callback意味著follow默認(rèn)為True)
Rule(LinkExtractor(allow=('category\.php', ), deny=('subsection\.php', ))),
# 提取匹配 'item.php' 的鏈接并使用spider的parse_item方法進(jìn)行分析
Rule(LinkExtractor(allow=('item\.php', )), callback='parse_item'),
)
def parse_item(self, response):
self.log('Hi, this is an item page! %s' % response.url)
item = scrapy.Item()
item['id'] = response.xpath('//td[@id="item_id"]/text()').re(r'ID: (\d+)')
item['name'] = response.xpath('//td[@id="item_name"]/text()').extract()
item['description'] = response.xpath('//td[@id="item_description"]/text()').extract()
return item
該spider將從example.com的首頁開始爬取,獲取category以及item的鏈接并對(duì)后者使用 parse_item
方法。 當(dāng)item獲得返回(response)時(shí),將使用XPath處理HTML并生成一些數(shù)據(jù)填入 Item
中
4.如何在pycharm中啟動(dòng)爬蟲程序
在項(xiàng)目下創(chuàng)建start.py文件
# -*- coding:utf-8 -*-
from scrapy import cmdline #引入命令行
cmdline.execute('scrapy crawl dang'.split())
運(yùn)行文件即可
點(diǎn)擊Edit Configurations
添加python文件
配置完畢后,點(diǎn)擊ok
點(diǎn)擊運(yùn)行



