2014-10-30 86 views
2

我對scrapy和python一般都很新,但我真的很想學習,並且我已經給了這個很大的努力!我正在嘗試抓取eb5info.com,選擇每個區域中心,然後複製每個區域的電話號碼和電子郵件。但是,當我抓取時,它通知我有0個網站被抓取。任何幫助將非常感謝!通過web抓取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 2014-10-30 22:00:59

+0

我的歉意是,對這個網站不熟悉,我無意中將一個極其無用的編輯標記爲我的問題的解決方案,並且一般擔心我的問題仍然會被註冊爲已解決。 – 2014-10-30 22:08:57

回答

1

無可否認,使用Scrapy這個有點過於強大。我個人會使用requests加上lxmlBeautifulSoup

無論如何,這裏是你的代碼的工作版本。我沒有打擾清理結果。這取決於你。

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 

它的工作方式是parse得到來自start_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')) 

這會給你所有的鏈接,那麼你可以調用網址傳遞函數並解析它。 我會得到的文本,我沒有格式化它打印很好,你現在可以做到,我希望你能得到這個概念。我在這裏打印信息,你可以保存它,做你想做的事。

+0

現在下載美麗的湯包。我會盡快給你通知你!謝謝! – 2014-10-30 22:28:06

+0

這檢索了所有的鏈接!謝謝,我只需要弄清楚如何訪問它們並刪除聯繫人。我知道他們存儲爲「

(909)702-8889
」,但我不知道如何正確提取它們。 – 2014-10-30 22:41:29

+0

正在工作我會讓你知道 – Hackaholic 2014-10-30 22:42:35