我正在使用scrapy编写一个爬虫来查找大学的所有部门网页。 但似乎我的管道不起作用。有谁知道为什么? 这是我的蜘蛛的代码:
class Univ2deptemorySpider(Spider):
name = 'univ2deptEmory'
def __init__(self, url='http://www.emory.edu/', **kw):
super(Univ2deptemorySpider,self).__init__(**kw)
self.url = url
self.allowed_domains = [re.sub(r'^www\.', '', urlparse(url).hostname)]
def start_requests(self):
return [Request(self.url, callback=self.find_all_url, dont_filter=False)]
def find_all_url(self,response):
if self.check_dept(response):
self.parse_dept(response)
links = LinkExtractor().extract_links(response)
for link in links:
if len(link.url) < 50:
yield Request(link.url, callback = self.find_all_url, dont_filter=False)
def parse_dept(self, response):
dept = deptItem()
#did some extraction
return dept
def check_dept(self,response):
#check whether the given page is a department webpage, if yes, return True, otherwise False
以下是管道代码:
class deptPipeline(object):
def __init__(self):
#connect to a sqlite database
def process_item(self, item, spider):
cur = self.conn.cursor()
cur.execute('select * from department where deptName=(?)',(item['deptName'],))
res = cur.fetchall()
if not (len(res) > 0):
cur.execute('insert into department(deptName, url, description, photo) values (?,?,?,?) ', (item["deptName"], item['url'], item['description'], item['photo']))
self.conn.commit()
从日志信息中,我可以看到管道中的__init__
工作正常,但永远不会调用process_item
。
与项目管道相关的设置:
ITEM_PIPELINES = {'advisor.pipelines.deptPipeline': 300}
顾问是项目的名称。
EDIT1:项目管道在我修改我的蜘蛛代码之前工作,所以我猜问题可能来自蜘蛛。我在parse_dept
和process_item
中添加了一些日志记录,似乎在返回之前所有内容都在parse_dept
中执行,而在process_item
中没有执行任何操作。