2014-10-30 2 views
2

나는 일반적으로 치료 및 파이썬에 대해 처음이지만, 실제로 배우기를 원하며 나는 많은 노력을 기울였다. eb5info.com을 크롤링하고 개별 지역 센터를 선택하고 각각에서 전화 번호와 이메일을 복사하려고합니다. 그러나 크롤링 할 때 0 개의 웹 사이트가 크롤링되었음을 알립니다. 어떤 도움이라도 대단히 감사하게 될 것입니다!scrapy/python으로 웹을 크롤링하여 연락처 정보 추출

여기 내 거미입니다 : 여기

from scrapy.item import Item, Field 

class Eb5Item(Item): 
description = Field() 

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

class Eb5Spider(CrawlSpider): 
    name = 'eb5' 
    allowed_domains = ["eb5info.com"] 
    start_urls = ["http://eb5info.com/regional-centers"] 
    rules = (Rule(SgmlLinkExtractor(allow=[r'regional-centers/*$']), callback='parse_item'),) 
    def parse_item(self, response): 
     hxs = HtmlXPathSelector(response) 
     sites = hxs.select('//ul/li/a/@href') 
     items = [] 
     for site in sites: 
      item = Eb5Item() 
      item['url'] = response.url 
      item['phone'] = site.select("()").extract() 
      items.append(item) 
     return (items) 

을 그리고 내 항목은 파일입니다

from scrapy.item import Item, Field 

class Eb5Item(Item): 
    # define the fields for your item here like: 
    name = Field() 
    email = Field() 
    name = Field() 
    description = Field() 
    phone = Field() 
    pass 

너무 감사합니다!

+0

나는 당신이 당신의 질문을 삭제하고 그것을 재 게시 한 것을 본다. 명확한 차이가 없다면 그렇게하지 않는 것이 좋습니다. – Manhattan

+0

불편을 끼쳐 드려 죄송합니다. 본인은이 웹 사이트에 처음 오신 동안 실수로 내 문제의 해결책으로 편집을 표시했으며 일반적으로 내 질문은 해결 된 상태로 등록 될 것을 우려했습니다. –

답변

1

틀림없이 Scrapy을 사용하면 다소 강력합니다. 나는 lxml 또는 BeautifulSoup과 결합하여 requests을 개인적으로 사용했습니다.

어쨌든 다음은 작동하는 코드입니다. 나는 결과를 정리하는 것을 괴롭히지 않았다. 그것은 당신에게 달려 있습니다. 작동

from scrapy.contrib.spiders import CrawlSpider 
from scrapy.selector import Selector 
from scrapy import Item, Field 
from scrapy.http import Request 
import urlparse 

class Eb5Item(Item): 

    name = Field() 
    email = Field() 
    name = Field() 
    description = Field() 
    phone = Field() 
    url = Field() 

class Eb5Spider(CrawlSpider): 

    name = 'eb5' 
    allowed_domains = ["eb5info.com"] 
    start_urls = ["http://eb5info.com/regional-centers/"] 

    def parse(self, response): 
     hxs = Selector(response) 
     sites = hxs.xpath('//ul/li/a/@href') 
     for site in sites: 
      yield Request(urlparse.urljoin("http://www.eb5info.com", site.extract()), callback=self.parse_item) 

    def parse_item(self, response): 
     hxs = Selector(response) 
     item = Eb5Item() 
     item['url'] = hxs.xpath("//dd/a/@href").extract() 
     # item[blah]... 
     print item['url'] 
     return item 

방법은 parsestart_urls에서 링크를 얻을 수있다. 모든 링크가 포함 된 페이지가 하나 (start_urls에는 같은 URL)이므로 Rule을 사용하여 다른 페이지를 따라갈 필요가 없습니다.

parse을 오버라이드하여 해당 페이지에서 링크를 가져온 다음 Request을 사용하여 parse_item으로 콜백을 발행하십시오. 이것이 의미하는 바는 parse에있는 모든 링크에 대해 해당 링크에 "들어가서"parse_item을 실행한다는 것입니다.

이 수준의 긁힌 자국은 기술적으로 쉽고 크롤링의 대상이 아닙니다. 즉,이 수준에서는 CrawlSpider이 과도합니다.

최신 버전의 Scrapy를 사용하고 있으므로 일부 수업 및 방법은 귀하의 것과 다릅니다.

0

내가 scrapy에 의해 잘 모른다, 그래서 난이 사용 BS4를하고있는 중이 야, 당신은 유용이 당신에게 모든 링크를 제공합니다

from bs4 import BeautifulSoup 
import urllib2 
def parse_link(url): 
    soup_link = BeautifulSoup(urllib.urlopen(url).read()) 
    for x in soup_link.find_all('div','col-third'): 
     for y in x: 
      try: 
       if y.name == 'h3' or y.name == 'dl': 
        print y.get_text() 
      except:pass 

soup = BeautifulSoup(urllib2.urlopen('http://eb5info.com/regional-centers').read()) 
for x in soup.find_all('li','va va_child'): 
    parse_link('http://eb5info.com'+x.a.get('href')) 

, 다음 URL을 통과하는 함수를 호출 할 수 있습니다 찾을 희망 그것을 분석합니다. 텍스트를 얻을 수 있습니다. 인쇄 할 수있는 형식이 아니므로 지금 할 수 있습니다. 개념을 얻으시기 바랍니다. 여기 정보를 인쇄하면 저장하고 원하는 것을 할 수 있습니다.

+0

아름다운 스프 패키지를 지금 다운로드 중입니다. 나는 그것을 시도하자마자 당신에게 알려줄 것이다! 감사! –

+0

이것은 모든 링크를 검색했습니다! 고마워, 나는 그 (것)들을 방문하고 접촉을 긁는 방법을 알아 내야한다. 나는 그들이 "

(909)702-8889
"으로 저장되어 있다는 것을 알고 있습니다. 그러나 나는 올바르게 추출하는 방법을 모르겠습니다. –

+0

그것에 대해 작업합니다. – Hackaholic