2

我正在浏览一组页面,但不确定有多少,但当前页面由 url 中的一个简单数字表示(例如“ http://www.website.com/page/1 ")

我想在scrapy中使用for循环来增加页面的当前猜测并在达到404时停止。我知道从请求返回的响应包含此信息,但我不确定如何自动获取来自请求的响应。

关于如何做到这一点的任何想法?

目前我的代码是这样的:

def start_requests(self):
    baseUrl = "http://website.com/page/"
    currentPage = 0
    stillExists = True
    while(stillExists):
        currentUrl = baseUrl + str(currentPage)
        test = Request(currentUrl)
        if test.response.status != 404: #This is what I'm not sure of
            yield test
            currentPage += 1
        else:
            stillExists = False
4

2 回答 2

2

你可以这样做:

from __future__ import print_function
import urllib2

baseURL = "http://www.website.com/page/"

for n in xrange(100):
    fullURL = baseURL + str(n)
    #print fullURL
    try:
        req = urllib2.Request(fullURL)
        resp = urllib2.urlopen(req)
        if resp.getcode() == 404:
            #Do whatever you want if 404 is found
            print ("404 Found!")
        else:
            #Do your normal stuff here if page is found.
            print ("URL: {0} Response: {1}".format(fullURL, resp.getcode()))
    except:
        print ("Could not connect to URL: {0} ".format(fullURL))

这将遍历范围并尝试通过 连接到每个 URL urllib2。我不知道scapy或您的示例函数如何打开 URL,但这是一个如何通过urllib2.

请注意,大多数使用这种 URL 格式的网站通常都运行 CMS,该 CMS 可以自动将不存在的页面重定向到自定义404 - Not Found页面,该页面仍将显示为 HTTP 状态代码 200。在这种情况下,查看的最佳方式对于可能显示但实际上只是自定义 404 页面的页面,您应该进行一些屏幕抓取并查找在“正常”页面返回期间可能不会出现的任何内容,例如“找不到页面”或类似内容的文本并且是自定义 404 页面独有的。

于 2013-04-08T00:17:27.503 回答
2

您需要让出/返回请求以检查状态,创建Request对象实际上并不发送它。

class MySpider(BaseSpider):
    name = 'website.com'
    baseUrl = "http://website.com/page/"

    def start_requests(self):
        yield Request(self.baseUrl + '0')

    def parse(self, response):
        if response.status != 404:
            page = response.meta.get('page', 0) + 1
            return Request('%s%s' % (self.baseUrl, page), meta=dict(page=page))
于 2013-04-08T02:13:22.617 回答