# 爬虫文件

# -*- 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打印出来是一个斜杠/, 但是系统找路径的时候是找的双斜杠//, 这个时候就会报错.

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

  1. Scrapy实战篇(一)之爬取链家网成交房源数据(上)

    今天,我们就以链家网南京地区为例,来学习爬取链家网的成交房源数据. 这里推荐使用火狐浏览器,并且安装firebug和firepath两款插件,你会发现,这两款插件会给我们后续的数据提取带来很大的方便. ...

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

    因为有在北京租房的打算,于是上网浏览了一下链家网站的房价,想将他们爬取下来,并保存到本地. 先看链家网的源码..房价信息 都保存在 ul 下的li 里面 ​ 爬虫结构: ​ 其中封装了一个数据库处理模 ...

  3. Scrapy实战篇(九)之爬取链家网天津租房数据

    以后有可能会在天津租房子,所以想将链家网上面天津的租房数据抓下来,以供分析使用. 思路: 1.以初始链接https://tj.lianjia.com/zufang/rt200600000001/?sh ...

  4. Scrapy实战篇(二)之爬取链家网成交房源数据(下)

    在上一小节中,我们已经提取到了房源的具体信息,这一节中,我们主要是对提取到的数据进行后续的处理,以及进行相关的设置. 数据处理 我们这里以把数据存储到mongo数据库为例.编写pipelines.py ...

  5. 适合初学者的Python爬取链家网教程

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: TinaLY PS:如有需要Python学习资料的小伙伴可以加点击下 ...

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

    import requests from bs4 import BeautifulSoup import sqlite3 conn = sqlite3.connect("test.db&qu ...

  7. Python——Scrapy爬取链家网站所有房源信息

    用scrapy爬取链家全国以上房源分类的信息: 路径: items.py # -*- coding: utf-8 -*- # Define here the models for your scrap ...

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

    本次实战是利用爬虫爬取链家的新房(声明: 内容仅用于学习交流, 请勿用作商业用途) 环境 win8, python 3.7, pycharm 正文 1. 目标网站分析 通过分析, 找出相关url, 确 ...

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

    1.问题描述: 爬取链家深圳全部二手房的详细信息,并将爬取的数据存储到CSV文件中 2.思路分析: (1)目标网址:https://sz.lianjia.com/ershoufang/ (2)代码结构 ...

随机推荐

  1. WPF 4 Ribbon 开发 之 应用程序菜单(Application Menu)

    原文:WPF 4 Ribbon 开发 之 应用程序菜单(Application Menu)      在上一篇中我们完成了快捷工具栏的开发,本篇将讲解应用程序菜单开发的相关内容.如下图所示,点击程序窗 ...

  2. 关于WPF XAML 中 Trigger的反向ExitActions

    触发器,顾名思义,就是当满足一定条件时,会触发一些操作,比如:改变控件的透明度,显隐,宽高等等,触发器本身做了一些操作,就是触发器触发条件不符合的时候,会自动把在触发器中更改的属性还原.但,并不是所有 ...

  3. 重启网卡的几种方法(命令行,API,

    1.重启windows网卡命令 rem 禁用网卡netsh interface set interface 本地连接 disabledrem 启用网卡 netsh interface set inte ...

  4. Android adb你真的会用吗?

    前言 本文基于Android官方文档, 以及个人工作的使用经验, 总结下adb的常用用法, 备忘. 1.adb 简介 adb全名Andorid Debug Bridge. 顾名思义, 这是一个Debu ...

  5. DELPHI美化界面(2009开始TPanel增加了ParentBackGround)

    1.透明问题. 要重新调整界面确实很麻烦,以前用DELPHI开发的界面都很土,和WEB真是没办法比.(我以前用的是DELPHI7),现在回想起来,DELPHI难做的原因是:没有透明控件.所有控件都是不 ...

  6. [机器学习]SVM原理

    SVM是机器学习中神一般的存在,虽然自深度学习以来有被拉下神坛的趋势,但不得不说SVM在这个领域有着举足轻重的地位.本文从Hard SVM 到 Dual Hard SVM再引进Kernel Trick ...

  7. qt的demo中,经常可以看到emum

    最近开始看QT的文档,发现了很多好东西,至少对于我来说 收获很多~~~ 当然很多东西自己还不能理解的很透彻,也是和朋友讨论以后才渐渐清晰的,可能对于QT中一些经典的用意我还是存在会有些认识上的偏差,欢 ...

  8. WPF全局异常捕获

    跟着<WPF专业编程开发指南>这书打的代码的,自己在正式项目中测试通过,可以抓取到全局的异常,用的log4net来记录日志 核心代码: 写在App.xaml.cs中 /// <sum ...

  9. Windows窗体原理及控件WM_DRAWITEM和子类化重绘演示文件

    http://download.csdn.net/detail/wenzhou1219/6783959

  10. python中的变量,字符串,用户交互,if语句

    一:python介绍 python的创始人为吉多·范罗苏姆,创始时间是1989年. 1python是一门什么样的语言 python是一门解释型弱类型语言★ 弱类型:弱类型的变量可以变,强类型的变量不能 ...