【问题标题】:contact info extraction by web crawling with scrapy / python通过使用scrapy / python进行网络抓取来提取联系信息
【发布时间】:2014-10-30 21:56:17
【问题描述】:

总的来说,我对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

非常感谢!

【问题讨论】:

  • 我看到您删除了自己的问题并重新发布。如果没有明显区别,请不要这样做。
  • 很抱歉,我是这个网站的新手,我不小心将一个非常无用的编辑标记为我的问题的解决方案,并且通常担心我的问题仍会被注册为已解决。

标签: python regex xcode scrapy


【解决方案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

它的工作方式是parsestart_urls 获取链接。由于只有一个页面(start_urls 中的同一 URL)包含所有链接,因此无需使用 Rule 来关注其他页面。

我们覆盖parse 以从所述页面获取链接,然后使用Requestparse_item 发出回调。这意味着对于parse 找到的每个链接,我们“进入”该链接并在其中执行parse_item

这个级别的抓取在技术上很容易,并不真正符合抓取的条件,这意味着CrawlSpider 在这个级别上是多余的。

请注意,我使用的是最新版本的 Scrapy,因此某些类和方法与您的不同。

【讨论】:

    【解决方案2】:

    我对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 的函数并对其进行解析。 我你会得到文本,我还没有格式化它以很好地打印,你现在可以做到,我希望你明白这个概念。我在这里打印信息,您可以保存它并做任何您想做的事情。

    【讨论】:

    • 现在下载漂亮的汤包。我一试就告诉你!谢谢!
    • 这检索到了所有的链接!谢谢,我只需要弄清楚如何访问他们并抓取联系人。我知道它们以“
      (909)702-8889
      ”的形式存储,但我不确定如何正确提取它们。
    • @MontreauxRodgers 代码正在运行,试试看
    • @Metatron- 您先生是一位绅士和一位学者。它有效,非常感谢!我正在检查你的工作,以了解你是如何解决这个问题的,谢谢。
    • 感谢您向我介绍美丽的汤!这肯定会派上用场,我期待更多的倾斜! @Hackaholic
    猜你喜欢
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    相关资源
    最近更新 更多