def process_response(self, url_obj, flag, extract_url_list=None): """ 线程任务后期回调函数: 解析HTML源码,获取下一层URLs 放入checking_url Args: extract_url_list : 返回抽取出的urls集合 url_obj : 被下载页面所处的url链接对象 flag : 页面下载具体情况的返回标志 - 0 : 表示下载成功且为非pattern页面 - 1 : 表示下载成功且为符合pattern的图片 - -1 : 表示页面下载失败 - 2 : depth >= max_depth 的非target - URL """ if self.lock.acquire(): if flag == -1: self.error_url.add(url_obj) elif flag == 0: self.checked_url.add(url_obj) # link add into Checking_Url for ex_url in extract_url_list: next_url_obj = url_object.Url(ex_url, int(url_obj.get_depth()) + 1) if not self.is_visited(next_url_obj): self.checking_url.put(next_url_obj) elif flag == 1: self.checked_url.add(url_obj) self.checking_url.task_done() self.lock.release()
def test_has_visited_(self): """ test True for func - is_visited() """ url = url_object.Url("http://www.baidu.com") self.minispider.error_url.add(url) self.assertTrue(self.minispider.is_visited(url))
def process_response(self, url_obj, flag, extract_url_list=None): """ 线程任务 response 回调函数: 解析 HTML 源码,获取下一层 URLs 放入 checking_urls Args: extract_url_list: 返回抽取出的urls集合 url_obj: 被下载页面所处的url链接对象 flag: 页面下载具体情况的返回标志 - 0 : 表示下载成功且为非pattern页面 - 1 : 表示下载成功且为符合pattern的图片 - -1 : 表示页面下载失败 - 2 : depth >= max_depth 的非 target URL """ # 多个线程可能同时访问 self.checking_urls, self.checked_urls 和 self.error_urls # 需要加锁 if self.lock.acquire(): if flag == -1: self.error_urls.add(url_obj) elif flag == 0: self.checked_urls.add(url_obj) for ex_url in extract_url_list: next_url_obj = url_object.Url(ex_url, int(url_obj.get_depth()) + 1) if not self.is_url_visited(next_url_obj): self.checking_urls.put(next_url_obj) elif flag == 1: self.checked_urls.add(url_obj) # Queue.task_done()函数向任务已经完成的队列发送一个信号 # 可以理解为,每 task_done 一次,就从队列里删掉一个元素 self.checking_urls.task_done() self.lock.release()
def get_seed_url(self): """ get seed url from seedUrlFile Returns: True / False : 存在种子文件返回True, 否则返回 False """ if not os.path.isfile(self.url_list_file): logging.error(' * seedfile is not existing !!!') self.program_end('there is no seedfile !') return False with open(self.url_list_file, 'rb') as f: lines = f.readlines() for line in lines: if line.strip() == '': continue url_obj = url_object.Url(line.strip(), 0) self.checking_url.put(url_obj) return True
def test_not_visited(self): """ test False for func - is_visited() """ url = url_object.Url("http://www.baidu.com") self.assertFalse(self.minispider.is_visited(url))