我正在写一个烧瓶应用程序,运行刮泥蜘蛛爬行给定的网站。Flask应用程序提供了一个UI,它接受要废弃的URL和要废弃的项(比如website的职称)。在
现在,问题是,spider如何自动检测用户给定项的Xpath????在
以下是spider的代码(使用硬编码的Xpath):
class StackItem(scrapy.Item):
def __setitem__(self, key, value):
if key not in self.fields:
self.fields[key] = scrapy.Field()
self._values[key] = value
class newAppSpider(CrawlSpider):
name = "appSpider"
def __init__(self, *args, **kwargs):
super(newAppSpider, self).__init__(*args, **kwargs)
self.start_urls = [kwargs.get('start_url')]
rules = (Rule (SgmlLinkExtractor(allow=('.*\?id1=.*',),restrict_xpaths=('//a[@class="prevNext next"]',))
, callback="parse_items", follow= True),)
def parse_items(self, response):
hxs = HtmlXPathSelector(response)
posts = hxs.select("//article[@class='classified']")
items = []
for post in posts:
item = StackItem()
item[self.settings['MY_PROPERTY']] = post.select("div[@class='uu mb2px']/a/strong/text()").extract()
items.append(item)
for item in items:
yield item
因为你要在一个节点集中找到一个文本(每个职位公告),你必须迭代你发布的节点,看看这个节点是否包含你需要的文本。在
如果您想让XPath非常通用,这是一个很大的问题。在
但是,如果特定的帖子包含此文本,则可以使用以下内容:
以及进入spider的
^{pr2}$find_text
函数(这可以进一步改进):注意XPath的
contains
区分大小写。这意味着职务不等于职务。在但是,如果你看一下这个网站,你会发现“职务”会带来一个小问题,因为这个标签不仅仅包含了职位名称。在
还有一件事
因为您使用了规则,
^{3}$start_url
不会被解析。这是显而易见的,如果你输入“职位”作为搜索文本,它会找到更深的职位描述与此文本在其中。要解决此问题,必须重写spider的parse_start_url
函数:对于启动错误
在您从烧瓶网站获得的价值周围加上引号:
相关问题 更多 >
编程相关推荐