zhangsun2008 2021-01-06 14:45 采纳率: 0%
浏览 11

scrapy 在爬取下级链接列表时,url内容会多出很多未知字符

import scrapy
from ajk.items import AjkItem
class AjkDataSpider(scrapy.Spider):
     name = 'ajk_data'
     #allowed_domains = ['suzhou.anjuke.com']
     start_urls = ['https://suzhou.anjuke.com/sale/gaoxinsz/']
     #高新区一级解析 获取
     def parse(self, response):
        #解析:名称和内容
        li_list = response.xpath('//ul[@id="houselist-mod-new"]/li')
        #all_data = []#存储所有解析到数据
        for li in li_list:
            item = AjkItem()
            item['house_type'] = li.xpath('./div[2]/div[2]/span[1]/text()').extract()        #房屋户型
            item['floorage'] = li.xpath('./div[2]/div[2]/span[2]/text()').extract()          #建筑面积
            item['storey'] = li.xpath('./div[2]/div[2]/span[3]/text()').extract()            #所在楼层
            item['Construction_time'] = li.xpath('./div[2]/div[2]/span[4]/text()').extract() #建筑时间
            item['Total_price'] =li.xpath('./div[3]/span[1]/strong/text()').extract()        #房屋总价
            li_url = li.xpath('./div[2]/div[1]/a/@href').extract()[0] #这个地方爬取url内容会自动多出很多不存在字符
            print(li_url)
            yield scrapy.Request(url=li_url,meta={'item':item},callback=self.parse_two)
     #详细页解析
     def parse_two(self, response):
         item = response.meta['item']
         item['Unit_Price'] =response.xpath('//*[@id="content"]/div[3]/div[1]/div[3]/div/div[1]/ul/li[3]/div[2]/text()').extract()
         item['community'] = response.xpath('//*[@id="content"]/div[3]/div[1]/div[3]/div/div[1]/ul/li[1]/div[2]/a/text()').extract()
         item['position'] = response.xpath('//*[@id="content"]/div[3]/div[1]/div[3]/div/div[1]/ul/li[4]/div[2]/p/a[2]/text()').extract()
         item['House_category'] = response.xpath('//*[@id="content"]/div[3]/div[1]/div[3]/div/div[1]/ul/li[10]/div[2]/text()').extract()
         item['property_right'] = response.xpath('//*[@id="content"]/div[3]/div[1]/div[3]/div/div[1]/ul/li[13]/div[2]/text()').extract()
         item['renovation'] = response.xpath('//*[@id="content"]/div[3]/div[1]/div[3]/div/div[1]/ul/li[12]/div[2]/text()').extract()
         item['Housing_years'] = response.xpath('//*[@id="content"]/div[3]/div[1]/div[3]/div/div[1]/ul/li[15]/div[2]/text()').extract()
         yield item

Li_url 列表内容是这样的

这个到导致我的parse_two 里边的标签内容获取不到

问题1:我这个获取不到数据是否是这个原因引起

问题2:如果是 是我编写代码问题吗

问题3:li_url 列表中的网址,只是提取‘?’之前数据,再存储 这个提取怎样操作,谢谢

 

  • 写回答

1条回答 默认 最新

  • 李佑辰 2023-05-21 13:24
    关注

    这种情况可能是因为在获取子链接的时候,没有对链接中的特殊字符进行处理,导致链接中包含一些未知字符。可以使用 urllib.parse 模块中的 quote 和 unquote 函数对链接进行编码和解码,避免链接中出现特殊字符。

    具体来说,可以在 Spider 的代码中使用 quote 和 unquote 函数进行编码和解码。示例代码如下:

    import scrapy
    from urllib.parse import urljoin, quote, unquote
    
    class MySpider(scrapy.Spider):
        name = "myspider"
        start_urls = ["http://example.com/"]
    
        def parse(self, response):
            # 获取子链接
            sub_links = response.xpath("//a/@href")
            for url in sub_links:
                # 对链接进行编码和解码
                url = urljoin(response.url, url)
                encoded_url = quote(url, safe=":/")
                decoded_url = unquote(encoded_url)
                # 处理链接
                # ...
                yield scrapy.Request(decoded_url, callback=self.parse_subpage)
    
        def parse_subpage(self, response):
            # 处理子页面
            # ...
    

    在上面的代码中,我们使用了 quote 函数对链接进行编码,并使用 unquote 函数将编码后的链接解码回来。使用 safe 参数指定哪些字符不需要编码,保留它们在链接中的含义。

    通过对链接进行处理,可以避免链接中出现特殊字符,从而避免在爬取过程中出现未知字符。

    评论

报告相同问题?

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度