我有一些存储在数据库中的网站需要按顺序爬取,即:
- 将域名添加到允许的域名列表中(应为空)。
- 将此域名添加到请求中(将
http://
添加到其中可完美运行)。 - 根据允许的域名爬取请求。
- 进入下一个域,仅将其添加到允许的域名列表中。这是唯一存在的域名,因此不会发生交叉。注意:这个问题 没有帮助我,但也许我漏掉了什么...
- 爬取此请求。
- 按顺序完成我所有的域名。
到目前为止,我所做的就是爬取这些域名,它工作得很好,能够完美地爬取请求。
我唯一遇到的问题是 allowed_domains
似乎没有更新,它会爬取各种类型的站点。
我设置了 DEPTH_LIMIT=1
,以便不会进行无限制的爬取,并且我还添加了 DF 爬取而不是 BF 爬取:
DEPTH_LIMIT= 1
SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleFifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.FifoMemoryQueue'
这是我的爬虫代码(只是开头部分;因为您不太关心我的项处理...):
from __future__ import with_statement
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from scrapy.http.request import Request
from company.items import CompanyItem, UrlItem
from urlparse import urlparse
import MySQLdb
import json
class RecipeSpider(CrawlSpider):
name = "company"
allowed_domains = []
start_urls = []
rules = (Rule(LinkExtractor(allow=(), deny=(), tags=('a', 'link', 'li' 'area')), callback='extract_raw_recipe', follow=True),)
def start_requests(self):
# print "before sources"
sources = self.get_allowed_domains()
dummy_tuple = (long(len(sources) + 1), u'dummy', None, None, None, None, None, 0L, long(len(sources) + 1),)
final_sources = sources + (dummy_tuple,)
for source in final_sources:
self.allowed_domains = [str(source[1])]
url_string = str("http://" + source[1])
self.start_urls = [url_string]
self.update_running_source(source)
yield Request(url_string, self.extract_raw_recipe)
### start_requests()
def extract_raw_recipe(self, response):
pass
extract_raw_recipe
函数的代码中没有请求或解析下一个url,它直接工作,因此不需要对其进行编辑。但是如果我需要在其中添加内容,请告诉我,因为这可能是缺失的链接。当前代码会将一个字典添加到一个项目中,然后将该项目放入数据库中。
因此,综上所述:我需要添加什么来使其每次爬取请求时过滤域名?
如果需要提供更多的代码,请告诉我。