基于scray/python的web抓取方法提取联系人信息

2024-10-02 14:23:17 发布

您现在位置:Python中文网/ 问答频道 /正文

一般来说,我对scrapy和python很陌生,但我真的很想学习,我为此付出了很多努力!我想爬eb5信息网,选择每个单独的区域中心,并复制每个中心的电话号码和电子邮件。然而,当我爬网时,它通知我有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)

这是我的物品档案:

^{pr2}$

非常感谢你!在


Tags: fromimportfieldresponseitemsitemcontrib中心
2条回答

我知道的东西不多,所以我用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的函数并对其进行解析。 我你会得到文本,我还没有格式好打印,你现在可以做了,我希望你得到概念。我在这里打印信息,你可以保存它,做任何你想做的事。在

诚然,使用Scrapy来实现这一点有点太强大了。我个人会把requestslxml或{}结合使用。在

无论如何,这里有一个你的代码的工作版本。我没有费心清理结果。这取决于你。在

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找到的每个链接,我们“进入”该链接并在其中执行parse_item。在

这一级别的刮擦在技术上很简单,并不真正符合爬网的条件,这意味着{}在这个级别上是过度杀戮的。在

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

相关问题 更多 >