使用Scrapy用单个蜘蛛抓取多个网站

2024-04-19 19:43:17 发布

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

我正在使用Scrapy从this website中获取数据。下面是蜘蛛的代码。在

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 betaSpider(CrawlSpider):
    name = "betaSpider"


    def __init__(self, *args, **kwargs): 
        super(betaSpider, self).__init__(*args, **kwargs) 
        self.start_urls = [kwargs.get('start_url')]

    rules = (Rule (LinkExtractor(unique=True, 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["job_role"] = post.select("div[@class='uu mb2px']/a/strong/text()").extract()
            item["company"] = post.select("p[1]/text()").extract()
            item["location"] = post.select("p[@class='mb5px b red']/text()").extract()
            item["desc"] = post.select("details[@class='aj mb10px']/text()").extract()
            item["read_more"] = post.select("div[@class='uu mb2px']/a/@href").extract()
            items.append(item)
            for item in items:
                yield item

以下是物料管道的代码:

^{pr2}$

这个很好用。现在,我必须使用相同的蜘蛛抓取以下网站(例如)。在

  1. http://www.freejobalert.com/government-jobs/
  2. https://www.sarkariexaam.com/

我必须刮去上述网站的所有标签,使用项目管道将其存储到CSV文件中。在

实际上,被废弃的网站名单是无穷无尽的。在这个项目中,用户将输入url并将废弃的结果返回给该用户。所以,我想要一个通用蜘蛛,可以刮任何网站。在

对于一个单一的网站来说,它运行良好。但是,对于结构不同的多个站点,如何实现呢? 破破烂烂的够解决吗?在


Tags: keytextinself网站defextractitems
2条回答

不同的spider会更好你可以使用API从脚本运行Scrapy,而不是运行Scrapy crawl的典型方式记住Scrapy是建立在Twisted异步网络库之上的,所以你需要在Twisted reactor中运行它。在

我认为你必须创建一个通用的spider来从differet获取数据网站。那可以通过添加网站一个接一个到蜘蛛和通用代码。在

如果网站完全不同,这将是非常庞大的代码。从您的要求,我们可以概括的代码,并作出蜘蛛,提供上述细节,如果任何网站是给定的。在

相关问题 更多 >