
正文
scrapy爬取网址,进而爬取详情页问题
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
1、最容易出现的问题是爬取到的url大多为相对路径,如果直接将爬取到的url进行二次爬取就会出现以下报错:
raise ValueError('Missing scheme in request url: %s' % self._url),该错误的意思是request的url为无效链接。
解决方法:将相对路径转换为绝对路径
# -*- coding: utf-8 -*-
import scrapy
from pyquery import PyQuery
from ..items import City10Item
from scrapy.http import Request
from scrapy.utils.response import get_base_url
from urllib.parse import urljoin class CitySpiderTest1Spider(scrapy.Spider):
name = 'city_spider_test1'
allowed_domains = ['58.com']
start_urls = ['https://cq.58.com/chuzu/'] def parse(self, response):
jpy=PyQuery(response.text)
li=jpy('body > div.mainbox > div > div.content > div.listBox > ul > li').items()
for i in li:
item=City10Item()
item['name']=i('div.des > h2 > a').text()
item['url']=i('div.des > h2 > a').attr('href') #爬取url,此时为相对路径
item['price']=i('div.listliright > div.money > b').text()
base_url = get_base_url(response) #获取相对路径前级地址
abs_url=urljoin(base_url,item['url']) #转换为绝对路径 if item['url']:
yield Request(abs_url,
callback=self.detail_parse, #回调详情页函数
meta={'item':item}, #将参数传递给meta
priority=10,
dont_filter=True #强制不过滤 ) def detail_parse(self,response):
jpy = PyQuery(response.text)
item = response.meta['item'] #接收item
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() #提取房屋亮点
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() #房屋详情地址
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() #电话号码
yield item







