【发布时间】:2016-11-02 10:43:15
【问题描述】:
我在数据库中有要连续抓取的网站,即:
- 将域添加到允许的域列表(应为空)。
- 将此域添加到请求中(添加
http://效果很好)。 - 根据允许的域抓取请求。
- 前进到下一个域,仅将其添加到允许的域列表中。它将是那里唯一的一个,因此不会发生纵横交错。注意:criss-cross question 对我没有帮助,但也许我遗漏了一些东西......
- 抓取此请求。
- 依次完成我拥有的所有域。
到目前为止,我所取得的成就是抓取域,它做得很好,它完美地抓取了请求。
我唯一的问题是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,它只是工作,所以不需要编辑它。但是如果我需要在那里添加一些东西,请告诉我,因为也许这是缺少的链接。当前代码将字典添加到项目中,然后将该项目放入数据库中。
所以总结:我需要添加什么来让它在每次抓取请求时过滤域?
如果需要提供更多代码,请告诉我。
【问题讨论】:
标签: python scrapy web-crawler scrapy-spider