之前我曾使用过scrapy,但只从一个网站上抓取信息。我想使用scrapy从不同站点的目录中获取信息。在每个站点上,信息都存储在一个简单的html表中,具有相同的标题。如何校准scrapy以从每个html表中获取数据,即使表类可能因站点而异?在更大范围内,我想问的是当我想要点击可能格式不同的不同网站时如何使用scrapy。我将在下面列出几个网站的html源代码和xpath的图片。
表的字段对于每个站点目录
或多或少相同名称列
的站点1的xpath名称列
的站点2的xpath网站1的常规HTML格式,电话号码模糊
网站2的一般html格式
第三个网站的常规格式,与前两个网站不同,但仍位于包含4列的表格中
答案 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.py
或shub 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。如果您没有部署蜘蛛,请忽略上述内容。如果这样做,将为您节省几个小时的调试时间。