Scrapy Linkextractor复制(?)

时间:2015-07-25 20:23:42

标签: python algorithm python-2.7 web-crawler scrapy

我的抓取工具如下所示。

它正在运行,它将通过link extractor下的受监管网站。

基本上我要做的是从页面中的不同位置提取信息:

- “新闻”类下的href和text()(如果存在)

- “think block”类(如果存在)

下的图片网址

我的scrapy有三个问题:

1)复制linkextractor

它似乎会复制已处理的页面。 (我检查导出文件,发现同样的〜.img多次出现,但几乎不可能)

事实是,对于网站中的每个页面,底部都有超链接,方便用户指向他们感兴趣的主题,而我的目标是从主题页面中提取信息(这里列出了几个段落的同一主题下的标题)和段落页面中的图像(您可以通过点击主题页面上的文章标题到达文章的页面)。

我怀疑链接提取器会在这种情况下再次循环同一页面。

(也许用depth_limit解决?)

2)改进parse_item

我认为parse_item效率不高。我怎么能改进它?我需要从Web中的不同位置提取信息(当然,它只会提取,如果它存在)。除此之外,看起来parse_item只能进行HkejImage而不是HkejItem(我再次检查输出文件)。我应该怎么解决这个问题?

3)我需要蜘蛛能够阅读中文。

我正在香港抓取一个网站,能够阅读中文是必不可少的。

网站:

  

http://www1.hkej.com/dailynews/headline/article/1105148/IMF%E5%82%B3%E4%BF%83%E4%B8%AD%E5%9C%8B%E9%80%80%E5%87%BA%E6%95%91%E5%B8%82

只要它属于'dailynews',那就是我想要的东西。

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.selector import Selector
from scrapy.http import Request, FormRequest
from scrapy.contrib.linkextractors import LinkExtractor
import items


class EconjournalSpider(CrawlSpider):
    name = "econJournal"
    allowed_domains = ["hkej.com"]
    login_page = 'http://www.hkej.com/template/registration/jsp/login.jsp'
    start_urls =  'http://www.hkej.com/dailynews'

    rules=(Rule(LinkExtractor(allow=('dailynews', ),unique=True), callback='parse_item', follow =True),
           )


    def start_requests(self):
         yield Request(
         url=self.login_page,
         callback=self.login,
         dont_filter=True
         )
# name column
    def login(self, response):
        return FormRequest.from_response(response,
                    formdata={'name': 'users', 'password': 'my password'},
                    callback=self.check_login_response)

    def check_login_response(self, response):
        """Check the response returned by a login request to see if we are
        successfully logged in.
        """
        if "username" in response.body:       
            self.log("\n\n\nSuccessfully logged in. Let's start crawling!\n\n\n")
            return Request(url=self.start_urls)
        else:
            self.log("\n\n\nYou are not logged in.\n\n\n")
            # Something went wrong, we couldn't log in, so nothing happens

    def parse_item(self, response):
        hxs = Selector(response)
        news=hxs.xpath("//div[@class='news']")
        images=hxs.xpath('//p')

        for image in images:
            allimages=items.HKejImage()
            allimages['image'] = image.xpath('a/img[not(@data-original)]/@src').extract()
            yield allimages

        for new in news:
            allnews = items.HKejItem()
            allnews['news_title']=new.xpath('h2/@text()').extract()
            allnews['news_url'] = new.xpath('h2/@href').extract()
            yield allnews

非常感谢,我将不胜感激!

1 个答案:

答案 0 :(得分:0)

首先,要设置设置,请在settings.py文件上进行设置,或者您可以在蜘蛛上指定custom_settings参数,例如:

custom_settings = {
    'DEPTH_LIMIT': 3,
}

然后,你必须确保蜘蛛达到parse_item方法(我认为它还没有,但尚未经过测试)。而且,您也无法在规则上指定callbackfollow参数,因为它们无法协同工作。

首先删除规则中的follow,或添加其他规则,以检查要关注的链接以及要作为项目返回的链接。

在您的parse_item方法中,您得到的xpath不正确,以获取所有图片,也许您可​​以使用以下内容:

images=hxs.xpath('//img')

然后获取图片网址:

allimages['image'] = image.xpath('./@src').extract()

对于新闻,看起来这可行:

allnews['news_title']=new.xpath('.//a/text()').extract()
allnews['news_url'] = new.xpath('.//a/@href').extract()

现在,作为并了解您的问题,这不是Linkextractor duplicating错误,但只有糟糕的规则规范,同时也要确保您拥有有效的xpath ,因为您的问题没有&# 39; t表示你需要xpath校正。