python - 递归地浏览和抓取网页

标签 python recursion scrapy

如何使用scrapy python库制作以下爬虫,递归地浏览整个网站:

class DmozSpider(BaseSpider):
    name = "dmoz"
    allowed_domains = ["dmoz.org"]
    start_urls = [
        "http://www.dmoz.org/"
    ]

def parse(self, response):

    hxs = HtmlXPathSelector(response)

    titles = hxs.select('//ul[@class="directory-url"]/li/a/text()').extract()

    for t in titles:
        print "Title: ", t

我在单个页面上尝试过此操作:

start_urls = [
    "http://www.dmoz.org/Society/Philosophy/Academic_Departments/Africa/"
]

它运行良好,但仅返回起始网址的结果,并且不跟踪域内的链接。 我想这必须使用 Scrapy 手动完成,但不知道如何操作。

最佳答案

尝试使用 CrawlSpider(请参阅 documentation ),以及单个 Rule() 和仅在域上进行过滤的 LinkExtractor您想要的(s):

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector

class DmozSpider(CrawlSpider):
    name = "dmoz"
    allowed_domains = ["dmoz.org"]
    start_urls = [
        "http://www.dmoz.org/"
    ]

    rules = (
        Rule(
            SgmlLinkExtractor(allow_domains=("dmoz.org",)),
            callback='parse_page', follow=True
        ),
    )

    def parse_page(self, response):
        hxs = HtmlXPathSelector(response)
        titles = hxs.select('//ul[@class="directory-url"]/li/a/text()').extract()
        for t in titles:
            print "Title: ", t

回调必须以 parse 以外的其他名称调用(请参阅 this warning )

关于python - 递归地浏览和抓取网页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18221453/

相关文章:

python - 理解Python中的父/子类

python - 创建重复字符数量不断增加的列表

javascript - 在树状结构中查找具有属性的对象的第一次出现

java - 最长递增序列二维矩阵递归

python - 在 Pandas 中制作堆叠条形图

python - jinja flask 和循环属性

java - MINIMAX算法如何从树底向上进行BFS?

python - Scrapy中如何获取上层函数的url地址?

Python Scrapy 提取 aria-label 的值

python - Scrapy - 在 DOWNLOAD MIDDLEWARE __init__ 中获取蜘蛛变量