我是一名使用Python編寫的爬蟲程序,它抓取給定域中的所有頁面,作爲特定於域的搜索引擎的一部分。我使用Django,Scrapy和Celery來實現這一點。該方案如下:Scrapy spider在使用芹菜時沒有遵循鏈接
我接收來自用戶的域名,並調用視圖內crawl
任務,傳遞域作爲參數:
crawl.delay(domain)
任務本身只是調用一個函數用於啓動過程爬行:
from .crawler.crawl import run_spider
from celery import shared_task
@shared_task
def crawl(domain):
return run_spider(domain)
run_spider
開始抓取過程,as in this SO answer,與WebSpider
替換MySpider
。
WebSpider
繼承自CrawlSpider
,我現在只是用它來測試功能。定義的唯一規則需要一個SgmlLinkExtractor
實例和一個回調函數parse_page
,它簡單地提取響應url和頁面標題,用它們填充一個新的DjangoItem(HTMLPageItem
)並將其保存到數據庫中(我不知道效率如何)。
from urlparse import urlparse
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from ..items import HTMLPageItem
from scrapy.selector import Selector
from scrapy.contrib.spiders import Rule, CrawlSpider
class WebSpider(CrawlSpider):
name = "web"
def __init__(self, **kw):
super(WebSpider, self).__init__(**kw)
url = kw.get('domain') or kw.get('url')
if not (url.startswith('http://') or url.startswith('https://')):
url = "http://%s/" % url
self.url = url
self.allowed_domains = [urlparse(url).hostname.lstrip('www.')]
self.start_urls = [url]
self.rules = [
Rule(SgmlLinkExtractor(
allow_domains=self.allowed_domains,
unique=True), callback='parse_page', follow=True)
]
def parse_start_url(self, response):
return self.parse_page(response)
def parse_page(self, response):
sel = Selector(response)
item = HTMLPageItem()
item['url'] = response.request.url
item['title'] = sel.xpath('//title/text()').extract()[0]
item.save()
return item
問題是爬蟲抓取唯一的start_urls
和不遵循鏈接(或調用回調函數)以下這種情況下,用芹菜時。然而通過python manage.py shell
調用run_spider
就行了!
另一個問題是項目管道和日誌不能與芹菜一起工作。這使得調試更加困難。我認爲這些問題可能是相關的。
考慮與芹菜寫一個「hello world」程序,並讓日誌工作。沒有看到發生了什麼事情使事情變得困難:) – johntellsall
謝謝!我很快就得到了芹菜測井工作。我正在嘗試使用Scrapy進行日誌記錄,但這不起作用。日誌確實有幫助,我解決了這個問題:),現在將發佈答案。 –
管道仍然無法正常工作 –