有一段时间没出来活动了闲来无事弄个玩玩O(∩_∩)O哈哈~
想必学过Scrapy框架的人都知道如何创建Scrapy和运行,那么我这里呢现将我创的框架展示一下
scrapy startproject pachong2(创一个pachong2的文件)
cd pachong2 #进入创的文件
scrapy genspider aijia wx.5i5j.com #生成名叫aijia的爬虫
然后就生成了这些
打开我爱我家的首页进入到二手房页面https://wx.5i5j.com/ershoufang下面就开始编程爬虫程序了
找到创建的aijia项目已经自动生成了一些网址
import scrapy
class AijiaSpider(scrapy.Spider):
name = 'aijia'
allowed_domains = ['www.5i5j.com']
start_urls = ['http://www.5i5j.com/']
def parse(self, response):
pass
因为爬的是二手房所以start_urls后面的网址就需要变动,然后再看网页的翻页格式n2、n3等等。所以只需要改n后面的数字实现翻页再列一个循环后的网址形式如下
start_urls = ['https://wx.5i5j.com/ershoufang/n' + str(x) for x in range(1,6)]
我们需要在items里面定义爬取的名称数据所以在items的定义为:
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class Pachong2Item(scrapy.Item):
# define the fields for your item here like:
title = scrapy.Field() #户型标题
danjia = scrapy.Field() #单价
zongjia = scrapy.Field() #总价
house = scrapy.Field() #户型
floor = scrapy.Field() # 楼层
area = scrapy.Field() #面积
renovation = scrapy.Field() #装修
chaoxiang = scrapy.Field() #朝向
xiaoqu = scrapy.Field() #所属小区
jingjiren = scrapy.Field() #经纪人
date = scrapy.Field() #发布时间
下面就开始编写我们的爬虫吧F12找到全部的list右键Copy Xpath
定义一个总的list列表titles将Copy的内容放入做一个循环使得可以得到该页面下的所有list
titles = response.xpath('/html/body/div[6]/div[1]/div[2]/ul/li')
for bt in titles:
item = Pachong2Item()
之后可以将该页面的重要信息爬取出来也可以点击进入到详细页面
所以这里就需要提取出详细页面中的URL
利用scrpy.Request请求url后生成一个Request对象,通过meta参数,把item这个字典赋值给meta字典的’item’键, 即meta={‘item’:item},这个meta参数会被放在Request对象里一起发送给detail()函数即
def parse(self, response):
titles = response.xpath('/html/body/div[6]/div[1]/div[2]/ul/li')
for bt in titles:
item = Pachong2Item()
url = 'https://wx.5i5j.com' + bt.xpath('div[2]/h3/a/@href').extract()[0] #详细页面URL
yield scrapy.Request(url,meta = {
'item':item},callback = self.detail)
进入到详细页面后只需要将需要的东西一个一个拉出来就好
def detail(self,response):
item = response.meta['item']#这个response已含有上述meta字典,此句将这个字典赋值给item,完成信息传递。这个item已经和parse中的item一样了
item['house'] = response.xpath('//*[@class="house-infor clear"]/div[1]/p[1]/text()').extract_first() #户型
item['floor'] = response.xpath('//*[@class="house-infor clear"]/div[1]/p[2]/text()').extract_first() # 楼层
item['area'] = response.xpath('//*[@class="house-infor clear"]/div[2]/p[1]/text()').extract_first() #面积
item['area'] = item['area'] + response.xpath('//*[@class="house-infor clear"]/div[2]/p[1]/span/text()').extract_first()
item['renovation']= response.xpath('//*[@class="house-infor clear"]/div[2]/p[2]/text()').extract_first()#装修
item['chaoxiang'] = response.xpath('//*[@class="house-infor clear"]/div[3]/p/text()').extract_first() #朝向
item['xiaoqu'] = response.xpath('//*[@class = "zushous"]/ul/li[1]/a/text()').extract_first() #所属小区
item['jingjiren'] = response.xpath('/html/body/div[5]/div[2]/div[2]/div[3]/ul/li[2]/h3/a/text()').extract_first() #经纪人
item['date'] = response.xpath('/html/body/div[5]/div[3]/div[3]/div[1]/div/div/ul/li[3]/span/text()').extract_first() #发布时间
yield item
当然我们不能这样盲目的爬取还要有一些应对反爬的措施这时我们就需要给它添加IP代理和User-Agent用户代理,分别在settings
和middlewares
中设置
那么设置IP代理需要修改的文件如下:
在settings中手动添加IP池代理IP可在https://www.xicidaili.com/中挑选
IPPOOL=[