请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

老师, 我现在有这样一个需求:给定一批网站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) 来控制

正在回答 回答被采纳积分+3

2回答

提问者 慕尼黑7546459 2020-08-29 11:34:01
111
0 回复 有任何疑惑可以回复我~
bobby 2020-08-29 11:18:59
  1. allowed_domains配置成当前的网站 就不会去爬取其他网站了

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

0 回复 有任何疑惑可以回复我~
  • 提问者 慕尼黑7546459 #1
    老师好,
    1. 因为我是重写start_request方法,对三千多多个网站url遍历,所以爬取时,url是动态的,rules是一个Class变量,如何动态设置Rule里面的allow_domains是当前爬取的网站域名呢?
    
    2. 虽然是3000多个网站,因为不需要精确爬取具体字段,只需要爬取图片和文字。我目前图片是通过提取img标签;文字是通过remove_tag方法对网页做提取和进一步清洗实现。
    其实,这样是不太精准的,或者,老师有什么更好的方案吗?
    
    3.  还发现一个问题,对一个网站爬取到一半,把服务停了,再重新启动(爬虫名字不变),它似乎会从上次的地方爬取。我没设置断点续爬啊
    回复 有任何疑惑可以回复我~ 2020-08-29 11:38:10
  • bobby 回复 提问者 慕尼黑7546459 #2
    1. https://stackoverflow.com/questions/5161815/dynamically-add-to-allowed-domains-in-a-scrapy-spider 看这个
    如果只是简单解析的话 一个爬虫代码就够了,你命令启动的时候传递一下参数进去,这样就可以才参数中指定抓取什么网站了
    3. 你是如何确定是从上次抓取的地方抓取的?有可能是scrapy的新爬虫已经开始支持断点抓取了
    回复 有任何疑惑可以回复我~ 2020-08-30 14:35:43
  • 提问者 慕尼黑7546459 回复 bobby #3
    1. 好的,谢老师,我回头试一下。
    3.  是我之前测试时,发现start_urls有 A、B两个url,比如爬取B到一半,我停掉了;
    然后把B 去掉,重启爬虫,发现它还是爬取url B。然后我换了个爬虫名字,就正常只爬A url了。
    回复 有任何疑惑可以回复我~ 2020-08-30 14:51:52
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信