使用Scrapy/Python进行网页爬虫提取联系信息

2 投票
2 回答
2086 浏览
提问于 2025-04-30 18:00

我刚接触scrapy和python,还是个新手,但我真的很想学习,并且已经花了很多精力在这上面!我想爬取eb5info.com网站,选择每个区域中心,然后复制每个中心的电话号码和电子邮件。不过,当我开始爬取时,它告诉我没有爬取到任何网站。任何帮助都会非常感谢!

这是我的爬虫代码:

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

非常感谢你们!

暂无标签

2 个回答

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'))

这个代码会给你所有的链接,然后你可以调用一个函数,把网址传进去,进行解析。你会得到文本,我没有格式化得很好,你可以自己调整一下格式,我希望你能明白这个概念。我在这里打印出信息,你可以保存这些信息,随便怎么处理都可以。

1

老实说,用 Scrapy 来做这个有点儿大材小用。我个人会选择用 requests,再配合 lxml 或者 BeautifulSoup 来处理。

无论如何,这里有你代码的一个可用版本。我没有去整理结果,那个你自己来处理吧。

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 中的同一个网址)包含了所有链接,所以不需要用 Rule 去跟踪其他页面。

我们重写了 parse,从那个页面获取链接,然后用 Request 来调用 parse_item。这意味着,对于 parse 找到的每一个链接,我们都会“进入”那个链接,并在里面执行 parse_item

这种级别的抓取技术上来说很简单,实际上并不算真正的爬虫,所以用 CrawlSpider 在这个层面上有点儿过了。

注意,我使用的是最新版本的 Scrapy,所以有些类和方法可能和你的不一样。

撰写回答