首页 > 编程 > Python > 正文

3.python开源——scrapy爬虫获取周边新楼盘房源(CSDN)

2019-11-06 07:10:06
字体:
来源:转载
供稿:网友

目标:

爬出房源的名字、价格、地址和url

需要爬取的数据

import scrapy

class TutorialItem(scrapy.Item):

    # define the fields for your item here like:

    # name = scrapy.Field()

    FANGJIA_ADDRESS = scrapy.Field()  # 住房地址

    FANGJIA_NAME = scrapy.Field()       # 名字

    FANGJIA_PRICE = scrapy.Field()      # 房价

    FANGJIA_URL = scrapy.Field()        # 房源url

目标城市

http://hz.lianjia.com/ 

或者新楼盘:

http://hz.fang.lianjia.com/loupan/nht1/ 

分析网页源码

先抓取url,再进入具体网页抓取想要的数据。

href="http://hz.fang.lianjia.com/" ><span>新房</span>

XPATH抓取上面a  标签中的href

抓取一个页面的所有的url集合,遍历上面的集合,请求具体页面

fang_links = response.xpath('//div[@class="list-wrap"]/ul[@id="house-lst"]/li/div[@class="pic-panel"]/a/@href').extract()

代码如下:(PS:类名字使用之前豆瓣,忽视之)

import scrapy

from tutorial.items import TutorialItem

from scrapy.selector import Selector

from scrapy.http import Request

headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'}

class Douban(scrapy.Spider):  

    name = "fangjia"

    allowed_domins = ["http://hz.fang.lianjia.com/"]

    start_urls = []

    def start_requests(self):

        global headers

        urlhead = 'http://hz.fang.lianjia.com/loupan/'

        for i in range(18):

            url = urlhead+'pg%snht1' % i

            self.start_urls.append(url)

        for url in self.start_urls:

            print (url)

            yield scrapy.Request(url, headers=headers, callback=self.parse)

    def parse(self, response):

        global headers

        fang_links = response.xpath('//div[@class="list-wrap"]/ul[@id="house-lst"]/li/div[@class="pic-panel"]/a/@href').extract()

        if fang_links:

            for fang_link in fang_links:

                url = 'http://hz.fang.lianjia.com'+fang_link

                yield scrapy.Request(url, headers=headers, callback=self.parse_fangjia)

    def parse_fangjia(self, response):  

        item = TutorialItem()

        name = response.xpath('//div[@class="name-box"]/a/@title').extract()[0]

        url = response.xpath('//div[@class="name-box"]/a/@href').extract()[0]

        price = response.xpath('//p[@class="jiage"]/span[@class="junjia"]/text()').extract()[0]

        address = response.xpath('//p[@class="where"]/span/@title').extract()[0]

        item['FANGJIA_NAME'] = name

        item['FANGJIA_ADDRESS'] = address

        item['FANGJIA_PRICE'] = price

        item['FANGJIA_URL'] = 'http://hz.fang.lianjia.com'+url

        print (item['FANGJIA_NAME'])

        print (item['FANGJIA_ADDRESS'])

        print (item['FANGJIA_PRICE'])

        print (item['FANGJIA_URL'])

        yield item

爬虫代码说明:

allowed_domins 可选。包含了spider允许爬取的域名(domain)列表(list)。

name 定义spider名字的字符串(string)。

start_urls URL列表。当没有制定特定的URL时,spider将从该列表中开始进行爬取。 因此,第一个被获取到的页面的URL将是该列表之一。

start_requests() 该方法必须返回一个可迭代对象(iterable)。该对象包含了spider用于爬取的第一个Request。当spider启动爬取并且未制定URL时,该方法被调用。 当指定了URL时,make_requests_from_url() 将被调用来创建Request对象。 该方法仅仅会被Scrapy调用一次,因此您可以将其实现为生成器。

该方法的默认实现是使用 start_urls 的url生成Request。

如果您想要修改最初爬取某个网站的Request对象,您可以重写(override)该方法。

本例中该函数主要是获取start_urls列。然后每个url都调用parse函数。

for url in self.start_urls:

            print (url)

            yield scrapy.Request(url, headers=headers, callback=self.parse)

parse(response)

当response没有指定回调函数时,该方法是Scrapy处理下载的response的默认方法。

parse 负责处理response并返回处理的数据以及(/或)跟进的URL。 Spider 对其他的Request的回调函数也有相同的要求。该方法及其他的Request回调函数必须返回一个包含 Request 及(或) Item 的可迭代的对象。

本例中,主要是处理每个URL,拼接URL,然后调用parse_fangjia函数。

parse_fangjia函数

该函数是真实爬取的主函数,从最后拼接的URL中获取名字、地址、加个和URL,并输出。

    总体过程小总,首先框架调用由start_requests函数,生成需要爬的初始URL,18个,

然后18次循环,每次循环中每个URL触发parse函数,将所爬URL中的URL提取出来并拼接形成新的URL组。然后再次循环遍历新的URL组中URL,调用parse_fangjia函数。

爬虫

保存成CSV格式

#scrapy crawl ganglia -o ganglia.csv -t csv

Safari显示网页源码:

新版的Safari在菜单栏里看不到“查看网页源码”的菜单了

点击Safari菜单栏,选择“偏好设置”

在弹出来的窗口中,选择 “高级”页签,勾选 “在菜单栏里显示开发菜单”

回到要查看源码的页面,点击上方开发菜单


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表