2015-01-05 2 views
-1

Я использую scrapy .24.4, я пытаюсь очистить некоторую информацию от threatexpert, и я почти получил ее, я могу захватить всю информацию на всех страницах ЗА ИСКЛЮЧЕНИЕМ первой страницы (или start_url). Я пробовал parse_start_url и добавляю Правила и просто не могу заставить его работать. Я уверен, что это просто то, что я забыл, но я смотрел на все выходные и просто нуждался в перерыве. Я был бы признателен, если бы у кого-нибудь были какие-либо предложения и т. Д. О, я получил его, чтобы работать с диапазоном в start_url, но он выглядел немного неэлегантным, и я пытаюсь научиться правильному пути. Спасибо заранее!!scurs parsing first page

import scrapy 
import re 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.contrib.spiders import CrawlSpider, Rule 
from threatexpert.items import ThreatExpert 
import urlparse 

class ThreatExpertSpider(scrapy.Spider): 
name = 'threatexpert' 
start_urls = ["http://www.threatexpert.com/reports.aspx?tf=2&sl=1"] 

def parse(self, response): 
    print '++++++++++++++++++++++++pull all page links+++++++++++++++++++++++' 
    urls = response.xpath('//a[contains(@href, "page")]/@href').extract() 
    for url in urls: 
     url = urlparse.urljoin(response.url, url) 
     self.log('Found follow url: %s' % url) 
     yield scrapy.Request(url, callback = self.parse_links) 


def parse_links(self, response): 
    print '++++++++++++++++++++++++pull item urls++++++++++++++++++++++++++' 
    urls = response.xpath('//a[contains(@href, "md5")]/@href').extract() 
    for url in urls: 
     url = urlparse.urljoin(response.url, url) 
     self.log('Found follow url: %s' % url) 
     yield scrapy.Request(url, callback = self.parse_items) 


def parse_items(self, response): 
    self.log("Hi, this is an item page! %s" % response.url) 
    item = ThreatExpert() 
    item['md5'] = response.xpath('//html/body/ul[1]/ul/ul/li[1]/text()').re(r"File MD5: ([\w, ]+)") 
    yield item 

ответ

0

См. Нижеприведенный код. Это работает для меня. Если у вас есть какие-либо вопросы, обновите их с помощью команды.

from scrapy.spider import BaseSpider 
from scrapy.http import Request 
import re 
from urlparse import urljoin 
from scrapy.selector import HtmlXPathSelector 
from threatexpert.items import ThreatExpert 
import inspect 
class usmallspider(BaseSpider): 
    name = 'threatexpert' 
    start_urls = ["http://www.threatexpert.com/reports.aspx?tf=2&sl=1"] 

def parse(self, response): 
    hxs = HtmlXPathSelector(response) 
    urls = response.xpath('//a[contains(@href, "page")]/@href').extract() 
    for url in urls: 
     url = urljoin(response.url, url) 
     print url 
     if url: 
      yield Request(url, callback=self.parse_links) 

def parse_links(self, response): 
    hxs = HtmlXPathSelector(response) 
    urls = response.xpath('//a[contains(@href, "md5")]/@href').extract() 
    for url in urls: 
     url = urljoin(response.url, url) 
     if url: 
      yield Request(url, callback = self.parse_items) 


def parse_items(self, response): 
    itm=[] 
    item = MallUk1Item() 
    hxs = HtmlXPathSelector(response) 
    item['md5'] = response.xpath('//html/body/ul[1]/ul/ul/li[1]/text()').re(r"File MD5: ([\w, ]+)") 
    itm.append(item) 
    return itm 
1

Многие, большое спасибо за ответ, это привело меня к тому, что я получил, чтобы работать! Просто был неправильный класс вместо класса ThreatExpertSpider (scrapy.Spider), я использовал класс ThreatExpertSpider (CrawlSpider) :, я все еще не совсем уверен, как он работает, но он это делает. Я знаю RTFM, lol, но я учусь. Вот что сработало для меня, если кто-то еще этого ищет.

import scrapy 
import re 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.contrib.spiders import CrawlSpider, Rule 
from threatexpert.items import ThreatExpert 
import urlparse 

class ThreatExpertSpider(CrawlSpider): 
    name = 'threatexpert' 
    start_urls = ["http://www.threatexpert.com/reports.aspx?tf=3&sl=1"] 

    rules = (
     Rule(SgmlLinkExtractor(allow=r'page=\d'), callback='parse_links', follow=True), 
     ) 

    def parse_start_url(self, response): 
     print '++++++++++++++++++++++++parse_start_url+++++++++++++++++++++++' 
     return self.parse_items(response) 
     # urls = response.xpath('//a[contains(@href, "page")]/@href').extract() 
     # for url in urls: 
     #  url = urlparse.urljoin(response.url, url) 
     #  self.log('Found follow url: %s' % url) 
     #  yield scrapy.Request(url, callback = self.parse_links) 


    def parse_links(self, response): 
     print '++++++++++++++++++++++++pull item urls++++++++++++++++++++++++++' 
     urls = response.xpath('//a[contains(@href, "md5")]/@href').extract() 
     for url in urls: 
      url = urlparse.urljoin(response.url, url) 
      self.log('Found follow url: %s' % url) 
      yield scrapy.Request(url, callback = self.parse_items) 


    def parse_items(self, response): 
     self.log("Hi, this is an item page! %s" % response.url) 
     item = ThreatExpert() 
     item['md5'] = response.xpath('//html/body/ul[1]/ul/ul/li[1]/text()').re(r"File MD5: ([\w, ]+)") 

     # item['callback'] = response.xpath('//*[contains(text(), "The following Host Names were requested from a host database:")]/following-sibling::ul/li/text()').extract() 
     # if item['callback']: 
     #  item['callback'] = response.xpath('//*[contains(text(), "The following Host Names were requested from a host database:")]/following-sibling::ul/li/text()').extract() 
     # else: 
     #  del item['callback'] 
     yield item