基于CrawlSpider,同一份代码爬取多个网站的数据,如果限制不爬取外链网站数据

来源:7-4 Rule和LinkExtractor使用

慕尼黑7546459

2020-08-27

老师, 我现在有这样一个需求:给定一批网站url(大概3000多个),对各个网站进行爬取全站的文本和图片。

我的实现:基于 CrawlSpider 实现,代码如下:`class LagouSpider(CrawlSpider):
name = ‘website’

# allowed_domains = ['www.u12group.com']
# start_urls = ['https://www.u12group.com']
allowed_domains = ['www.chemexpress.com']
start_urls = ['http://www.chemexpress.com/']
rules = (
    Rule(LinkExtractor(), callback='parse_item', follow=True),
)

def start_requests(self):
    # TODO start_urls 从文件中读取
    for start_url in self.start_urls:
        return [scrapy.Request(url=start_url, dont_filter=True, )]

def parse_item(self, response):
    item_loader = WebsiteItemLoader(item=WebsiteItem(), response=response)

    item_loader.add_value("domain", extract_domain(response.url))
    item_loader.add_value("url", response.url)
    img_urls = response.xpath("//img/@src").extract()
    item_loader.add_value("img_urls", self.get_img_url(response, img_urls))

    item_loader.add_xpath("text", "/html/body//*")
    item_loader.add_value("crawl_time", datetime.now())

    job_item = item_loader.load_item()

    return job_item

def get_img_url(self, response, img_urls):
    return [parse.urljoin(response.url, url) for url in img_urls]`

问题:
1、在爬取每个网站的时候,怎么只爬取当前域名下的数据呢,因为有的网站外链了其他公司的网站,如果不做限制,就没完没了了。

2、因为有3000多个网站,不可能每个单独写一份代码,也就是没办法 通过allowed_domains 或 LinkExtractor(allowed_domains = xxx) 来控制

写回答

2回答

慕尼黑7546459

提问者

2020-08-29

111
0
0

bobby

2020-08-29

  1. allowed_domains配置成当前的网站 就不会去爬取其他网站了

  2. 每个网站的解析规则也是不一样的啊,那你是要将3000个网站的解析规则都放到一个文件中吗?

0
3
慕尼黑7546459
回复
bobby
1. 好的,谢老师,我回头试一下。 3. 是我之前测试时,发现start_urls有 A、B两个url,比如爬取B到一半,我停掉了; 然后把B 去掉,重启爬虫,发现它还是爬取url B。然后我换了个爬虫名字,就正常只爬A url了。
2020-08-30
共3条回复

Scrapy打造搜索引擎 畅销4年的Python分布式爬虫课

带你彻底掌握Scrapy,用Django+Elasticsearch搭建搜索引擎

5795 学习 · 6290 问题

查看课程