LinkExtractor 深度爬取url中含有中文关键字

scrapy 默认的是utf-8的格式进行编码,在利用链接提取器LinkExtractor进行深度爬取的时候, 返回的Response中的url链接中可能会含有中文关键字,如果不进行处理的情况下scrapy会自动的将中关键字以utf-8的格式进行编码后再去请求这个url,但是网站的解析格式可能不是utf-8, 比如百度就是gbk格式,这时候可以利用LinkExtractor中的process_links 指定特定的函数对返回的url进行处理

rules = (Rule(LinkExtractor(restrict_xpaths='//div[@class="showpagelist"]/a'), callback="parse_item", follow=True,process_links="encode_url"),)
def encode_url(self, links):
    """
        因为网页是以gbk的形式编码,但是在scrapy中是以utf-8的形式编码,需要修改url中的中文字符的编码格式
        :param links:经过解析后的返回的url
        :return:
        """

    for each in links:
        serach_keys = re.search(r"search_key=(.*?)&.*", each.url )
        if serach_keys:
            serach_key = serach_keys.group(1)
            if self.check_contain_chinese(serach_key):
                encoded_search_key = quote(serach_key.encode("gbk"))
                each.url = re.sub(r'%s'%serach_key, encoded_search_key, each.url)
    return links

def check_contain_chinese(self, check_str):
    # 判断字符串是不是中文
    for ch in check_str:
        if u'\u4e00' <= ch <= u'\u9fff':
            return True

    return False

 

posted @ 2019-04-03 17:54  苜蓿椒盐  阅读(566)  评论(0)    收藏  举报