总的来说,我对scrapy和python还是很陌生,但是我真的很想学习,为此我付出了很多努力!我正在尝试抓取eb5info.com,选择每个区域中心,然后复制每个区域中心的电话号码和电子邮件。但是,当我爬网时,它通知我0个网站已爬网。任何帮助将不胜感激!

这是我的蜘蛛:

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


非常感谢!

最佳答案

诚然,为此使用Scrapy有点过于强大。我个人将requestslxmlBeautifulSoup结合使用。

无论如何,这是您的代码的有效版本。我没有理会结果。随你(由你决定。

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,因此某些类和方法与您的不同。

关于python - 通过使用scrapy/python进行网络爬取来提取联系信息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26664034/

10-12 00:15
查看更多