scrapy爬取網址,進而爬取詳情頁問題


1、最容易出現的問題是爬取到的url大多為相對路徑,如果直接將爬取到的url進行二次爬取就會出現以下報錯:

  raise ValueError('Missing scheme in request url: %s' % self._url),該錯誤的意思是request的url為無效鏈接。

解決方法:將相對路徑轉換為絕對路徑

 1 # -*- coding: utf-8 -*-
 2 import scrapy
 3 from pyquery import PyQuery
 4 from ..items import City10Item
 5 from scrapy.http import Request
 6 from scrapy.utils.response import get_base_url
 7 from urllib.parse import urljoin
 8 
 9 
10 class CitySpiderTest1Spider(scrapy.Spider):
11     name = 'city_spider_test1'
12     allowed_domains = ['58.com']
13     start_urls = ['https://cq.58.com/chuzu/']
14 
15     def parse(self, response):
16         jpy=PyQuery(response.text)
17         li=jpy('body > div.mainbox > div > div.content > div.listBox > ul > li').items()
18         for i in li:
19             item=City10Item()
20             item['name']=i('div.des > h2 > a').text()
21             item['url']=i('div.des > h2 > a').attr('href') #爬取url,此時為相對路徑
22             item['price']=i('div.listliright > div.money > b').text()
23             base_url = get_base_url(response) #獲取相對路徑前級地址
24             abs_url=urljoin(base_url,item['url']) #轉換為絕對路徑
25 
26 
27             if item['url']:
28                 yield Request(abs_url,
29                               callback=self.detail_parse, #回調詳情頁函數
30                               meta={'item':item}, #將參數傳遞給meta
31                               priority=10,
32                               dont_filter=True #強制不過濾
33 
34                 )
35 
36     def detail_parse(self,response):
37         jpy = PyQuery(response.text)
38         item = response.meta['item']   #接收item
39         item['introduce_item'] = jpy('body > div.main-wrap > div.house-detail-desc > div.main-detail-info.fl > div.house-word-introduce.f16.c_555 > ul > li:nth-child(1) > span.a2').text()   #提取房屋亮點
40         item['address'] = jpy('body > div.main-wrap > div.house-basic-info > div.house-basic-right.fr > div.house-basic-desc > div.house-desc-item.fl.c_333 > ul > li:nth-child(6) > span.dz').text()   #房屋詳情地址
41         item['phone_number'] = jpy('body > div.main-wrap > div.house-basic-info > div.house-basic-right.fr > div.house-fraud-tip > div.house-chat-phone > span').text()   #電話號碼
42         yield item

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM