如何编写scrapy以获取不同格式的html表

时间:2016-03-15 16:04:41

标签: python html dom web-scraping scrapy

之前我曾使用过scrapy,但只从一个网站上抓取信息。我想使用scrapy从不同站点的目录中获取信息。在每个站点上,信息都存储在一个简单的html表中,具有相同的标题。如何校准scrapy以从每个html表中获取数据,即使表类可能因站点而异?在更大范围内,我想问的是当我想要点击可能格式不同的不同网站时如何使用scrapy。我将在下面列出几个网站的html源代码和xpath的图片。

表的字段对于每个站点目录1]

或多或少相同

名称列2]

的站点1的xpath

名称列3]

的站点2的xpath

网站1的常规HTML格式,电话号码模糊4]

网站2的一般html格式5]

第三个网站的常规格式,与前两个网站不同,但仍位于包含4列6]的表格中

2 个答案:

答案 0 :(得分:1)

我通过创建一个scrapy项目来实现这一点,每个站点都有一个蜘蛛,并为所有不同的蜘蛛使用相同的项目类。

答案 1 :(得分:1)

是的 - 必须为每个网站编写蜘蛛都有点​​痛苦,特别是如果有100个,并且Item对所有网站都是相同的。< / p>

如果它符合您的需要,您可能希望为文件中的每个站点存储XPath,例如一个csv file。然后你可以从csv中获取URL和表达式并在你的蜘蛛中使用它们(改编自here):

def start_requests(self):
    with open(getattr(self, "file", "todo.csv"), "rU") as f:
        reader = csv.DictReader(f)
        for line in reader:
            request = Request(line.pop('url'))
            request.meta['fields'] = line
            yield request

def parse(self, response):

    xpath = response.meta['fields']['tablexpath']
    ... use xpath it to extract your table

如果您需要将蜘蛛释放到例如scrapyd或scrapinghub,您需要将.csv文件与代码一起打包。为此,您必须修改setup.pyshub deploy生成的scrapyd-client并添加:

setup(
...
    package_data={'myproject': ['my_csv.csv']}
)

同样在你的蜘蛛中,你应该使用open而不是直接用from pkg_resources import resource_stream f = resource_stream('myproject', 'my_csv.csv') 打开文件。

  <nav class="navbar navbar-default navbar-static-top">
    <div class="container">
    <!-- Brand and toggle get grouped for better mobile display -->
    <div class="navbar-header">
      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
      <span class="sr-only">Toggle navigation</span>
      <span class="icon-bar"></span>
      <span class="icon-bar"></span>
      <span class="icon-bar"></span>
      </button>
      <a class="navbar-brand" href="#">Brand</a>
    </div>

    <!-- Collect the nav links, forms, and other content for toggling -->
    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
      <ul class="nav navbar-nav">
      <li class="active"><a href="#">Homepage <span class="sr-only">(current)</span></a></li>
      <li class="dropdown">
        <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Forum <span class="caret"></span></a>
        <ul class="dropdown-menu">
        <li><a href="#">Action</a></li>
        <li><a href="#">Another action</a></li>
        <li><a href="#">Something else here</a></li>
        <li role="separator" class="divider"></li>
        <li><a href="#">Separated link</a></li>
        <li role="separator" class="divider"></li>
        <li><a href="#">One more separated link</a></li>
        </ul>
      </li>
        <li><a href="#">Become a Moderator</a></li>
        <li><a href="#">Contact</a></li>
        <li><a href="#">Donate</a></li>
      </ul>
      <ul class="nav navbar-nav navbar-right"><!-- *****move here *****-->
      <li><button type="button" class="btn btn-info navbar-btn">Sign in</button></li>
      </ul>      
    </div><!-- /.navbar-collapse -->

    </div><!-- /.container-fluid -->
  </nav>

这里是example。如果您没有部署蜘蛛,请忽略上述内容。如果这样做,将为您节省几个小时的调试时间。