前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >初识Scrapy框架+爬虫实战(7)-爬取链家网100页租房信息

初识Scrapy框架+爬虫实战(7)-爬取链家网100页租房信息

原创
作者头像
秦子帅
修改2019-08-19 17:07:37
1.1K0
修改2019-08-19 17:07:37
举报
文章被收录于专栏:秦子帅秦子帅

Scrapy简介

Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。

Scrapy项目结构

scrapy.cfg: 项目的配置文件

lianjia/: 该项目的python模块。之后您将在此加入代码。

lianjia/items.py: 项目中的item文件.

lianjia/pipelines.py: 项目中的pipelines文件.

lianjia/settings.py: 项目的设置文件.

lianjia/spiders/: 放置spider代码的目录.

下面主要说一下几个比较重要的:

**item.py**

Item 是保存爬取到的数据的容器。比如我下面将要爬取的链家网租房信息的地点、平米数、价格,我会在item.py文件中定义相应的字段。

代码语言:txt
复制
from scrapy import  Item,Field



class LianjiaItem(Item):

    # define the fields for your item here like:

    # name = scrapy.Field()

    place=Field()    #爬取链家租房信息的-地点

    size=Field()     #爬取链家租房信息的-房屋平米数

    price = Field()  # 爬取链家租房信息的-价格

**spider.py**

此文件是我们在spiders文件下自己创建的,用来写爬虫的代码的,非常重要。

我们需要创建一个Spider,必须继承scrapy.Spider,并有下面三个属性:

**name:** 用于区别Spider。 该名字必须是唯一的,您不可以为不同的Spider设定相同的名字。

**start_urls:** 包含了Spider在启动时进行爬取的url列表。 因此,第一个被获取到的页面将是其中之一。 后续的URL则从初始的URL获取到的数据中提取。

**parse()** 是spider的一个方法。 被调用时,每个初始URL完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数。 该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。

**pipelines.py**

主要作用是为爬取下的数据的做处理。比如txt或者存入数据库的操作。

**settings.py**

主要是对爬虫项目的设置

Scrapy框架爬虫实战

今天主要爬取一下链家网租房主页的前一百页数据,也是为了带大家去入门熟悉一下Scrapy框架。

创建项目

命令行切换到你想创建Scrapy项目的路径,我是在D盘pycharm文件夹创建的

输入:

代码语言:txt
复制
scrapy startproject 项目名称

然后我们用PyCharm导入:File-->Open

爬取链家网详解

1.编写item.py,定义爬取的字段。我们爬取链家网条目的租房地点、平米数以及价位,所以定义三个字段,代码如下:

代码语言:txt
复制
from scrapy import  Item,Field



class LianjiaItem(Item):

    # define the fields for your item here like:

    # name = scrapy.Field()

    place=Field()    #爬取链家租房信息的-地点

    size=Field()     #爬取链家租房信息的-房屋平米数

    price = Field()  # 爬取链家租房信息的-价格



    pass

2.在spiders文件夹下创建spider.py,用来爬取代码。代码如下:

代码语言:txt
复制
import scrapy

from scrapy.http import Request

from lianjia.items import LianjiaItem



class LianjiaSpider(scrapy.Spider):#必须继承scrapy.Spide



    name = "lianjia"   #名称

    start\_urls = ['https://tj.lianjia.com/zufang/']   #URL列表





    def parse(self, response):

        item=LianjiaItem()



        infos=response.xpath('//div[@class="info-panel"]')



        for info  in infos:

            # 获取地点

            place = info.xpath('div/div/a[@class="laisuzhou"]/span/text()').extract()[0].replace('\xa0','')

            # 获取平米数

            size = info.xpath('div/div/span[@class="meters"]/text()').extract()[0].replace('\xa0','')

            # 获取价格

            price = info.xpath('div/div[@class="price"]/span/text()').extract()[0] + info.xpath(

                'div/div[@class="price"]/text()').extract()[0]



            item['place']=place

            item['size'] = size

            item['price'] = price



            yield  item   #返回数据



        #从新设置URL,从第2页到第100页  回调parse方法

        for i in   range(2,101):

            url = 'https://tj.lianjia.com/zufang/pg{}/'.format(str(i))

            yield Request(url, callback=self.parse)  ## 回调

通过代码我们会发现,Item字段是通过Selector选择器提取的。

它有四个基本的方法:

**xpath():** 传入xpath表达式,返回该表达式所对应的所有节点的selector list列表 。

**css():** 传入CSS表达式,返回该表达式所对应的所有节点的selector list列表.

**extract(): **序列化该节点为unicode字符串并返回list。

**re():** 根据传入的正则表达式对数据进行提取,返回unicode字符串list列表。

另外也可以在Shell中调试xpath等,具体的操作在下面,慢慢看。

3.txt形式存储

pipelines.py就是对爬取下的数据做处理的,所以我们可以在此文件中写txt或者数据库存储等等,今天就以TXT存储为例:

代码语言:txt
复制
class LianjiaPipeline(object):



    def process\_item(self, item, spider):

        try:

            place = str(item['place'])

            size = str(item['size'])

            price = str(item['price'])

            fb = open("C:/Users/qzs/Desktop/qinzishuai.txt", "a+")

            fb.write(place + size + price + '\n')

            fb.close()

        except:

            pass



        return item

另外还需要在settings.py中配置一下,名称一定要换成你的项目名称:

代码语言:txt
复制
ITEM\_PIPELINES = {

    'lianjia.pipelines.LianjiaPipeline': 300,    #保存到txt文件

}

4.运行

运行scrapy项目两种方式:

(1).在Terminal输入命令运行,也就是在项目路径的命令行输入:

代码语言:txt
复制
scrapy crawl 项目名称

(2).在Pycharm中运行。我们要在scrapy.cfg同层目录下建一个begin.py文件,输入代码:

代码语言:txt
复制
from scrapy import cmdline



cmdline.execute("scrapy crawl lianjia".split())

然后再点击Run-->Edit Configurations...

然后我们就可以运行了。

**强调:**第一次运行的时候,我遇到no module named win32API错误,这是因为Python没有自带访问windows系统API的库的,需要下载第三方库。

直接在pip安装即可:

代码语言:txt
复制
pip install pypiwin32

安装完成后运行成功,查看TXT:

Scrapy Shell调试xpath

快捷命令:

shelp() - 打印可用对象及快捷命令的帮助列表

fetch(request_or_url) - 根据给定的请求(request)或URL获取一个新的response,并更新相关的对象

view(response) - 在本机的浏览器打开给定的response。 其会在response的body中添加一个 <base> tag ,使得外部链接(例如图片及css)能正确显示。 注意,该操作会在本地创建一个临时文件,且该文件不会被自动删除。

在命令行输入:

代码语言:txt
复制
scrapy shell "爬取的URL"

然后会显示你能内容如下,说明成功进入shell:

下面主要说一下response.xpath调试,为了判断我们的xpath是否正确。

例如我们想调试一下链家网租房的地点信息,输入:

代码语言:txt
复制
response.xpath('//div/div/a[@class="laisuzhou"]/span/text()').extract()

结果显示:

说明我们的xpath没有问题。

再可以输入:

代码语言:txt
复制
view.(response)

效果如下:

****

希望对大家有所帮助!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Scrapy简介
  • Scrapy项目结构
  • Scrapy框架爬虫实战
    • 创建项目
      • 爬取链家网详解
      • Scrapy Shell调试xpath
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档