Jas*_*ouk 1 python web-crawler scrapy
我正在抓取大量的网址,并想知道是否有可能让scrapy不解析带有'meta name ="robots"content ="noindex"'的网页?查看此处列出的拒绝规则http://doc.scrapy.org/en/latest/topics/link-extractors.html,看起来deny规则仅适用于URL.你有scrapy忽略xpath吗?
from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from wallspider.items import Website
class Spider(CrawlSpider):
name = "browsetest"
allowed_domains = ["www.mydomain.com"]
start_urls = ["http://www.mydomain.com",]
rules = (
Rule(SgmlLinkExtractor(allow=('/browse/')), callback="parse_items", follow= True),
Rule(SgmlLinkExtractor(allow=(),unique=True,deny=('/[1-9]$', '(bti=)[1-9]+(?:\.[1-9]*)?', '(sort_by=)[a-zA-Z]', '(sort_by=)[1-9]+(?:\.[1-9]*)?', '(ic=32_)[1-9]+(?:\.[1-9]*)?', '(ic=60_)[0-9]+(?:\.[0-9]*)?', '(search_sort=)[1-9]+(?:\.[1-9]*)?', 'browse-ng.do\?', '/page/', '/ip/', 'out\+value', 'fn=', 'customer_rating', 'special_offers', 'search_sort=&', 'facet=' ))),
)
def parse_items(self, response):
hxs = HtmlXPathSelector(response)
sites = hxs.select('//html')
items = []
for site in sites:
item = Website()
item['url'] = response.url
item['canonical'] = site.xpath('//head/link[@rel="canonical"]/@href').extract()
item['robots'] = site.select('//meta[@name="robots"]/@content').extract()
items.append(item)
return items
Run Code Online (Sandbox Code Playgroud)
不幸的是,CrawlSpider它没有提供您想要做的选项.不过,您可以覆盖其方法来实现这一点.
尝试将此方法添加到您的蜘蛛:
def _response_downloaded(self, response):
# Check whether this page contains the meta noindex in order to skip the processing.
sel = Selector(response)
if sel.xpath('//meta[@content="noindex"]'):
return
return super(Spider, self)._response_downloaded(response)
Run Code Online (Sandbox Code Playgroud)
每当文档不够时,您可以检查源代码以查看可以更改的内容以及位置,只需注意您使用的是哪个版本.您可以在github中浏览最新的源代码:https://github.com/scrapy/scrapy/blob/master/scrapy/contrib/spiders/crawl.py#L61
但最好检查系统中的源代码.如果您正在使用可以轻松完成??操作员的IPython .
| 归档时间: |
|
| 查看次数: |
1016 次 |
| 最近记录: |