scrapy не просканировал всю ссылку

Я хочу извлечь данные из http://community.sellfree.co.kr/. Scrapy работает, однако, похоже, он очищает только start_urls и не сканирует никакие ссылки.

Я бы хотел, чтобы паук обошел весь сайт.

Вот мой код:

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

from metacritic.items import MetacriticItem
class MetacriticSpider(BaseSpider):
    name = "metacritic" # Name of the spider, to be used when crawling
    allowed_domains = ["sellfree.co.kr"] # Where the spider is allowed to go
    start_urls = [
        "http://community.sellfree.co.kr/"
    ]
    rules = (Rule (SgmlLinkExtractor(allow=('.*',))
          ,callback="parse", follow= True),
        )

    def parse(self, response):
        hxs = HtmlXPathSelector(response) # The XPath selector
        sites = hxs.select('/html/body')
        items = []
        for site in sites:
            item = MetacriticItem()
            item['title'] = site.select('//a[@title]').extract()
            items.append(item)
        return items

На странице есть два типа ссылок. Один onclick="location='../bbs/board.php?bo_table=maket_5_3', а другой <a href="../bbs/board.php?bo_table=maket_5_1&amp;sca=프로그램/솔루션"><span class="list2">solution</span></a>

Как я могу заставить поисковый робот переходить по обоим типам ссылок?


person user3138338    schedule 01.02.2014    source источник
comment
Вы должны унаследовать от CrawlSpider: попробуйте с class MetacriticSpider(CrawlSpider):   -  person paul trmbrth    schedule 01.02.2014
comment
попробуйте правило: rules = [Rule (SgmlLinkExtractor (allow = (sellfree.co.kr. * ( \ .html) $)), callback = 'parse_item', follow = True),] или allow = sellfree. co.kr ... попробуйте использовать регулярное выражение в допустимых ссылках   -  person Vipul    schedule 01.02.2014
comment
На sellfree.co.kr есть ссылки двух типов.   -  person user3138338    schedule 01.02.2014
comment
vipul sharma, спасибо за ответ, но ваше решение не работает. извините   -  person user3138338    schedule 02.02.2014
comment
Пол, неважно, используете ли Crawlspider или нет   -  person user3138338    schedule 02.02.2014
comment
Чтобы использовать правила, вам нужен CrawlSpider И НЕ переопределяйте метод parse, попробуйте parse_item, как предложил другой пользователь.   -  person R. Max    schedule 02.02.2014


Ответы (1)


Прежде чем начать, я настоятельно рекомендую использовать обновленную версию Scrapy. Похоже, вы все еще используете старую версию, так как многие из используемых вами методов / классов были перемещены или устарели.

К текущей проблеме: класс scrapy.spiders.BaseSpider ничего не сделает с указанным вами rules. Вместо этого используйте класс scrapy.contrib.spiders.CrawlSpider, который имеет встроенные функции для обработки правил.

Затем вам нужно изменить parse() метод на новое имя, поскольку CrawlSpider использует parse() для работы внутри. (Мы предполагаем parse_page() до конца этого ответа)

Чтобы получить все основные ссылки и сканировать их, необходимо изменить средство извлечения ссылок. По умолчанию вы не должны использовать синтаксис регулярных выражений для доменов, которым вы хотите следовать. Следующие элементы подберут его, и ваш DUPEFILTER отфильтрует ссылки, отсутствующие на сайте:

rules = (
    Rule(SgmlLinkExtractor(allow=('')), callback="parse_page", follow=True),
)

Что касается onclick=... ссылок, это ссылки JavaScript, и страница, которую вы пытаетесь обработать, в значительной степени полагается на них. Scrapy не может сканировать такие вещи, как onclick=location.href="javascript:showLayer_tap('2')" или onclick="win_open('./bbs/profile.php?mb_id=wlsdydahs', потому что он не может выполнять showLayer_tap() или win_open() в Javascript.

(следующее не проверено, но должно работать и дать общее представление о том, что вам нужно делать)

Однако вы можете написать свои собственные функции для их анализа. Например, следующее может обрабатывать onclick=location.href="./photo/":

def process_onclick(value):
    m = re.search("location.href=\"(.*?)\"", value)
    if m:
        return m.group(1)

Затем добавьте следующее правило (оно обрабатывает только таблицы, при необходимости расширяйте его):

Rule(SgmlLinkExtractor(allow=(''), tags=('table',), 
                       attrs=('onclick',), process_value=process_onclick), 
     callback="parse_page", follow=True),
person Rejected    schedule 22.09.2015