为什么我的 linkExtractor 在 scrapy spider 中无法抓取允许的链接?
Why is my linkExtractor in a scrapy spider semming to not crawl allowed links?
我创建了一个简单的蜘蛛来抓取 disneyfoodblog.com
posts 和 return post 标题和 post permalink。
我的项目没有显示任何错误。调试输出(见下文)显示所有开始的 links 都被访问,但这些页面上的 links 没有被抓取。起始页是包含每天 post 的页面。从那里,我试图抓取实际的 post.
- 这是一个开始的例子link:http://www.disneyfoodblog.com/2014/12/31/
- 这是一个post:http://www.disneyfoodblog.com/2014/12/31/photo-tour-and-review-new-polynesian-village-resort-lobby-and-tiramisu-cupcake-at-captain-cooks-in-disneys-polynesian-village-resort/
我的爬虫代码:
import datetime
import scrapy
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy import log
from dfbScrape.items import *
class dfbSpider(CrawlSpider):
name="dfb"
base="http://disneyfoodblog.com/"
allowed_domains=[base]
start_urls=[]
startDate=datetime.date(2014,6,1)
endDate=datetime.date.today()
while startDate<endDate:
start_urls.append(base+str(startDate.year)+"/"+startDate.strftime("%m")+"/"+startDate.strftime("%d")+"/")
startDate+=datetime.timedelta(days=1)
rules = [Rule(SgmlLinkExtractor(allow=["\d+/\d+/\d+/.+/"]), callback='parse_item')]
def parse_item(self, response):
self.log('Hi, this is an item page! %s' % response.url)
item =DfbscrapeItem()
item['title']=response.xpath('/html/body/div[3]/div[3]/div/div/main/article/header/h1').extract()
item['link']=response.url
print "t: %s l: %s" % (item['title'],item['link'])
return item
可以在 pastebin.
上查看调试输出
让我知道是否应该在此处包括实际输出。我没有,因为它差不多有 800 行长。
我唯一的想法是恕我直言,这不是一个很好的想法。这可能是已弃用的 link 提取器的问题。我在 lxml 上选择了这个,因为我没有发现使用 lxml 的示例,而且有很多使用旧的示例。即使您无法回答我的问题,也非常感谢 lxml 的优势和示例。一如既往地欢迎建设性的批评和编辑。请询问您需要的任何其他信息。
如果您更仔细地查看输出,您会看到 "Filtered offsite request" 消息:
2015-06-07 10:00:01-0500 [dfb] DEBUG: Filtered offsite request to
'www.disneyfoodblog.com': http://www.disneyfoodblog.com/2013/03/26/best-disney-world-restaurants-for-first-time-disney-visitors/>
这意味着 "Link Extractor" 完成了它的工作。
但是,您的 allowed_domains
设置定义不正确,应定义为:
allowed_domains = ["www.disneyfoodblog.com"]
(为我工作)。
我创建了一个简单的蜘蛛来抓取 disneyfoodblog.com
posts 和 return post 标题和 post permalink。
我的项目没有显示任何错误。调试输出(见下文)显示所有开始的 links 都被访问,但这些页面上的 links 没有被抓取。起始页是包含每天 post 的页面。从那里,我试图抓取实际的 post.
- 这是一个开始的例子link:http://www.disneyfoodblog.com/2014/12/31/
- 这是一个post:http://www.disneyfoodblog.com/2014/12/31/photo-tour-and-review-new-polynesian-village-resort-lobby-and-tiramisu-cupcake-at-captain-cooks-in-disneys-polynesian-village-resort/
我的爬虫代码:
import datetime
import scrapy
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy import log
from dfbScrape.items import *
class dfbSpider(CrawlSpider):
name="dfb"
base="http://disneyfoodblog.com/"
allowed_domains=[base]
start_urls=[]
startDate=datetime.date(2014,6,1)
endDate=datetime.date.today()
while startDate<endDate:
start_urls.append(base+str(startDate.year)+"/"+startDate.strftime("%m")+"/"+startDate.strftime("%d")+"/")
startDate+=datetime.timedelta(days=1)
rules = [Rule(SgmlLinkExtractor(allow=["\d+/\d+/\d+/.+/"]), callback='parse_item')]
def parse_item(self, response):
self.log('Hi, this is an item page! %s' % response.url)
item =DfbscrapeItem()
item['title']=response.xpath('/html/body/div[3]/div[3]/div/div/main/article/header/h1').extract()
item['link']=response.url
print "t: %s l: %s" % (item['title'],item['link'])
return item
可以在 pastebin.
上查看调试输出让我知道是否应该在此处包括实际输出。我没有,因为它差不多有 800 行长。
我唯一的想法是恕我直言,这不是一个很好的想法。这可能是已弃用的 link 提取器的问题。我在 lxml 上选择了这个,因为我没有发现使用 lxml 的示例,而且有很多使用旧的示例。即使您无法回答我的问题,也非常感谢 lxml 的优势和示例。一如既往地欢迎建设性的批评和编辑。请询问您需要的任何其他信息。
如果您更仔细地查看输出,您会看到 "Filtered offsite request" 消息:
2015-06-07 10:00:01-0500 [dfb] DEBUG: Filtered offsite request to 'www.disneyfoodblog.com': http://www.disneyfoodblog.com/2013/03/26/best-disney-world-restaurants-for-first-time-disney-visitors/>
这意味着 "Link Extractor" 完成了它的工作。
但是,您的 allowed_domains
设置定义不正确,应定义为:
allowed_domains = ["www.disneyfoodblog.com"]
(为我工作)。