爬取链家网租房图 使用ImagesPipeline保存图片

# 爬虫文件

# -*- coding: utf-8 -*-
import scrapy
import os
from urllib import request
from lianjia.items import LianjiaItem
class LianjiaspiderSpider(scrapy.Spider):
    name = ‘lianjiaSpider‘
    # allowed_domains = [‘www.xxx.com‘]
    start_urls = [‘https://bj.lianjia.com/zufang/l1rp5/#contentList ‘]

    def parse(self, response):
        div_list = response.xpath(‘//div[@class="content__list"]/div[@class="content__list--item"]‘)
        # print(len(div_list))
        for div in div_list:
            title = div.xpath(‘.//div[@class="content__list--item--main"]/p[1]/a/text()‘).get()
            title = title.strip()
            detail_url = div.xpath(‘.//div[@class="content__list--item--main"]/p[1]/a/@href‘).get()
            detail_url = "https://bj.lianjia.com" + detail_url
            # print(detail_url)
            location = div.xpath(‘.//div[@class="content__list--item--main"]/p[2]//text()‘).getall()
            location = list(map(lambda x:x.replace("\n","").replace("-","").replace("/","").strip(),location))
            location = "".join(location)
            # print(location)
            price = div.xpath(‘.//div[@class="content__list--item--main"]/span//text()‘).getall()
            price = price[0]+price[1]
            # print(price)

            yield scrapy.Request(url=detail_url, callback=self.parse_detail,meta={‘info‘:(title,location,price,detail_url)})

        # 2-100页的url
        for i in range(2,101):
            next_url = "https://bj.lianjia.com/zufang/pg%dl1rp5/#contentList" % i
            yield scrapy.Request(url=next_url, callback=self.parse)

    def parse_detail(self,response):
        title,location,price,detail_url = response.meta.get("info")
        # pic_src = response.xpath("//div[@class=‘content__thumb--box‘]/ul/li[2]/img/@src").get()
        pic_srcs = response.xpath("//div[@class=‘content__thumb--box‘]/ul//img/@src").getall()
        # print(‘户型图链接:‘,pic_srcs)
        print(‘房源链接:‘,detail_url)

        item = LianjiaItem()
        item["title"] = title
        item["location"] = location
        item["price"] = price
        item[‘detail_url‘]=detail_url
        # item[‘pic_srcs‘] = pic_srcs
        item[‘image_urls‘] = pic_srcs
        yield item
# 管道文件
# 保存图片
# 普通方法保存图片

import os
from urllib import request

class LianjiaPipeline(object):
    def __init__(self):
        # 获取当前pipeline文件所在的目录路径 os.path.dirname(__file__)
        # 获取最外层bmw的路径os.path.dirname(os.path.dirname(__file__))
        # 在最外层bmw目录下创建一个文件夹 images, 获取images的路径
        self.path = os.path.join(os.path.dirname(os.path.dirname(__file__)), ‘images‘) # 生成images文件夹
        if not os.path.exists(self.path):
            print("images文件夹不存在")
            os.mkdir(self.path)  # 创建images文件夹

    def process_item(self, item, spider):
        location = item[‘location‘]
        urls = item[‘pic_srcs‘]
        per_house_pic_path = os.path.join(self.path,location)
        # path2=self.path  # G:\Crawler and Data\21days_spider\lianjia\images

       # 处理路径拼接  打印出来的是一个斜杠的  但是系统里是两个斜杠的, 会报错
        per_house_pic_path = per_house_pic_path.replace(‘/‘,‘\\‘)
        print(‘每一个户型图的保存路径:‘,per_house_pic_path)

        if not os.path.exists(per_house_pic_path):
            os.mkdir(per_house_pic_path)
        for url in urls:
            # 每个图片的url
            url = url.replace(‘126x86.jpg‘,‘780x439.jpg‘)  # 更改保存图片的大小
            # 切割图片url  拼接图片的名称  防止图片保存被覆盖 不然最后爬下的始终只有一张图片
            pic_name = url.split(‘.‘)[2][-9:-1]  # 防止图片被覆盖

            # os.path.join 的两个参数:户型图文件夹 和 图片的名称 拼接出来图片路径
            request.urlretrieve(url=url,filename=os.path.join(per_house_pic_path,pic_name+‘.png‘))
        return item

# item文件
class LianjiaItem(scrapy.Item):
    # define the fields for your item here like:

    # 普通的字段
    title = scrapy.Field()
    detail_url = scrapy.Field()
    location = scrapy.Field()
    price = scrapy.Field()
    pic_srcs = scrapy.Field()

# setting中
ITEM_PIPELINES = {
   ‘lianjia.pipelines.LianjiaPipeline‘: 300,

}
# 使用scrapy中的 image pipleline方法保存图片
import os
from urllib import request
from scrapy.pipelines.images import ImagesPipeline
from lianjia import settings

class LjImagesPipeline(ImagesPipeline):
    # 这个方法是下载请求前调用的, 就是发送下载请求的时候调用
    def get_media_requests(self,item,info):
        request_objs = super(LjImagesPipeline,self).get_media_requests(item,info)
        for request_obj in request_objs:
            request_obj.item = item   # 把item绑定到request上面,为了下面的方法可以通过request获取item
        return request_objs

    def file_path(self,request,response=None,info=None):
        # 这个方法是图片被存储的时候调用,来获取这个图片存储的路径
        path = super(LjImagesPipeline,self).file_path(request,response,info)
        location = request.item.get(‘location‘)
        # 获取图片存储路径    images文件夹路径
        images_store = settings.IMAGES_STORE
        # 判断这里有没有目录   每个房源的目录(这里面存房子图片)
        per_house_pic_path = os.path.join(images_store, location)
        if not os.path.exists(per_house_pic_path):
            os.mkdir(per_house_pic_path)
        image_name = path.replace(‘full/‘,‘‘) # 加个斜杠/是把full删除
        # print(‘image_name:‘,image_name)  #c554f76249059833f3a454830ec2cc2067465968.jpg

        image_path = os.path.join(per_house_pic_path,image_name)
        return image_path

# 对应的item文件
class LianjiaItem(scrapy.Item):
    # define the fields for your item here like:

    # 普通的字段
    title = scrapy.Field()
    detail_url = scrapy.Field()
    location = scrapy.Field()
    price = scrapy.Field()
    # pic_srcs = scrapy.Field()

    # 使用Images Pipeline需要的字段
    image_urls=scrapy.Field()
    images = scrapy.Field()

#settings文件
ITEM_PIPELINES = {
   # ‘lianjia.pipelines.LianjiaPipeline‘: 300,
   # "scrapy.pipelines.images.ImagesPipeline":1 #不执行管道文件

  ‘lianjia.pipelines.LjImagesPipeline‘: 1,   #执行管道文件里重写的两个方法
}

# 图片下载的路径 供image.pipelines使用
import os
# 图片存储路径
IMAGES_STORE = os.path.join(os.path.dirname(os.path.dirname(__file__)), ‘images‘) # 生成images文件夹
# 总结:
1.  def process_item()方法中 self.path 获取到的是images文件夹的路径, 要在这个文件下面保存每一个户型图的图片

2.  在window系统的路径拼接, os.path.join() 生成的路径通过print打印出来是一个斜杠/, 但是系统找路径的时候是找的双斜杠//, 这个时候就会报错.

原文地址:https://www.cnblogs.com/kenD/p/11143563.html

时间: 2024-10-31 21:12:06

爬取链家网租房图 使用ImagesPipeline保存图片的相关文章

Python的scrapy之爬取链家网房价信息并保存到本地

因为有在北京租房的打算,于是上网浏览了一下链家网站的房价,想将他们爬取下来,并保存到本地. 先看链家网的源码..房价信息 都保存在 ul 下的li 里面 ? 爬虫结构: ? 其中封装了一个数据库处理模块,还有一个user-agent池.. 先看mylianjia.py # -*- coding: utf-8 -*- import scrapy from ..items import LianjiaItem from scrapy.http import Request from parsel i

python 学习 - 爬虫入门练习 爬取链家网二手房信息

import requests from bs4 import BeautifulSoup import sqlite3 conn = sqlite3.connect("test.db") c = conn.cursor() for num in range(1,101): url = "https://cs.lianjia.com/ershoufang/pg%s/"%num headers = { 'User-Agent': 'Mozilla/5.0 (Windo

爬取链家任意城市租房数据(北京朝阳)

1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2019-08-16 15:56 4 # @Author : Anthony 5 # @Email : [email protected] 6 # @File : 爬取链家任意城市租房数据.py 7 8 9 import requests 10 from lxml import etree 11 import time 12 import xlrd 13 import os

python爬虫:爬取链家深圳全部二手房的详细信息

1.问题描述: 爬取链家深圳全部二手房的详细信息,并将爬取的数据存储到CSV文件中 2.思路分析: (1)目标网址:https://sz.lianjia.com/ershoufang/ (2)代码结构: class LianjiaSpider(object): def __init__(self): def getMaxPage(self, url): # 获取maxPage def parsePage(self, url): # 解析每个page,获取每个huose的Link def pars

Python爬虫项目--爬取链家热门城市新房

本次实战是利用爬虫爬取链家的新房(声明: 内容仅用于学习交流, 请勿用作商业用途) 环境 win8, python 3.7, pycharm 正文 1. 目标网站分析 通过分析, 找出相关url, 确定请求方式, 是否存在js加密等. 2. 新建scrapy项目 1. 在cmd命令行窗口中输入以下命令, 创建lianjia项目 scrapy startproject lianjia 2. 在cmd中进入lianjia文件中, 创建Spider文件 cd lianjia scrapy genspi

Python爬取链家二手房数据——重庆地区

最近在学习数据分析的相关知识,打算找一份数据做训练,于是就打算用Python爬取链家在重庆地区的二手房数据. 链家的页面如下: 爬取代码如下: import requests, json, time from bs4 import BeautifulSoup import re, csv def parse_one_page(url): headers={ 'user-agent':'Mozilla/5.0' } r = requests.get(url, headers=headers) so

爬取链家任意城市二手房数据(天津)

1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2019-08-16 12:40 4 # @Author : Anthony 5 # @Email : [email protected] 6 # @File : 爬取链家任意城市二手房数据.py 7 8 9 import requests 10 from lxml import etree 11 import time 12 import xlrd 13 import o

43.scrapy爬取链家网站二手房信息-1

首先分析:目的:采集链家网站二手房数据1.先分析一下二手房主界面信息,显示情况如下: url = https://gz.lianjia.com/ershoufang/pg1/显示总数据量为27589套,但是页面只给返回100页的数据,每页30条数据,也就是只给返回3000条数据. 2.再看一下筛选条件的情况: 100万以下(775):https://gz.lianjia.com/ershoufang/pg1p1/(p1是筛选条件参数,pg1是页面参数) 页面返回26页信息100万-120万(47

使用python抓取并分析数据—链家网(requests+BeautifulSoup)(转)

本篇文章是使用python抓取数据的第一篇,使用requests+BeautifulSoup的方法对页面进行抓取和数据提取.通过使用requests库对链家网二手房列表页进行抓取,通过BeautifulSoup对页面进行解析,并从中获取房源价格,面积,户型和关注度的数据. 准备工作 首先是开始抓取前准备工作,导入需要使用的库文件,这里主要使用的是requests和BeautifulSoup两个.Time库负责设置每次抓取的休息时间.这里并非全部,后续还会在过程中导入新的库. 抓取列表页 开始抓取