Python爬虫(十七)爬虫框架scrapy数据解析

78 阅读3分钟

数据解析这是一个很重要的话题。

Scrapy框架为我们封装了xpath解析方法。用法与我们之前看到的xpath一致,只是语法稍有不同。

首先,我们先回到《Python爬虫(六)数据解析—xpath(重点)》复习一下xpath的基本使用。

然后,我们来爬取一下贝壳网二手房页面的标题以及图片。

 

1:创建一个爬虫文件beike.py

scrapy genspider beike dl.ke.com/ershoufang/

 

2:在beike.py中编写爬虫代码:

#!/usr/bin/python3  
# -*- coding: utf-8 -*-  
# @Time    : 2022/3/31 18:01  
# @Author  : camellia  
# @Email   : 805795955@qq.com  
# @File    : beike.py  
# @Software: PyCharm  
import scrapy  
# 解析贝壳二手房页面的房源图片及标题  
class BeikeSpider(scrapy.Spider):  
    name = 'beike'  
    # allowed_domains = ['www.beike.com']  
    start_urls = ['https://dl.ke.com/ershoufang/']  
  
    def parse(self, response):  
        divList = response.xpath('/html/body/div[1]/div[4]/div[1]/div[4]/ul/li[1]')  
        print(divList)  
        for item in divList:  
            imgName = item.xpath('//img[@class="lj-lazy"]/@data-original')  
            title = item.xpath('//ul[@class="sellListContent"]//img[@class="lj-lazy"]/@title')  
            print(imgName)  
            print(title)

输出文字过长,我这里就不做展示了。

For循环中输出的两项都是包含selector对象的列表,这我就不是很理解了,这是什么情况呢?

查看了一下scrapy的文档,发现只需要在xpath的语句后边加上extract()属性即可。具体代码如下图所示:

    #!/usr/bin/python3  
# -*- coding: utf-8 -*-  
# @Time    : 2022/3/31 18:01  
# @Author  : camellia  
# @Email   : 805795955@qq.com  
# @File    : beike.py  
# @Software: PyCharm  
import scrapy  
# 解析贝壳二手房页面的房源图片及标题  
class BeikeSpider(scrapy.Spider):  
    name = 'beike'  
    # allowed_domains = ['www.beike.com']  
    start_urls = ['https://dl.ke.com/ershoufang/']  
  
    def parse(self, response):  
        divList = response.xpath('/html/body/div[1]/div[4]/div[1]/div[4]/ul/li[1]')  
        print(divList)  
        for item in divList:  
            imgName = item.xpath('//img[@class="lj-lazy"]/@data-original').extract()  
            title = item.xpath('//ul[@class="sellListContent"]//img[@class="lj-lazy"]/@title').extract()  
            print(imgName)  
            print(title)

执行上方代码输出:

['ke-image.ljcdn.com/110000-insp…]

['润泽园   精装修   一室一厅  拎包入住',……]

文字太多,这里就不做过多的展示了,有想法的可以自己试一下。

 

图片链接都爬取出来了,这要是不下载一下多不好啊。我下边尝试写了一下下载。

    #!/usr/bin/python3  
#-*- coding: utf-8 -*-  
#@Time    : 2022/3/31 18:01  
#@Author  : camellia  
#@Email   : 805795955@qq.com  
#@File    : beike.py  
#@Software: PyCharm  
import time  
import scrapy  
import asyncio  
import requests  
import random  
  
# 解析贝壳二手房页面的房源图片及标题  
class BeikeSpider(scrapy.Spider):  
    name = 'beike'  
    # allowed_domains = ['www.beike.com']  
    start_urls = ['https://dl.ke.com/ershoufang/']  
  
    def parse(self, response):  
        divList = response.xpath('/html/body/div[1]/div[4]/div[1]/div[4]/ul/li[1]')  
        # print(divList)  
        for item in divList:  
            imgName = item.xpath('//img[@class="lj-lazy"]/@data-original').extract()  
            title = item.xpath('//ul[@class="sellListContent"]//img[@class="lj-lazy"]/@title').extract()  
        # print(imgName)  
        for it in imgName:  
            responce = requests.get(url=it)  
            # 3:获取响应数据,content获取二进制数据  
            content = responce.content  
            strs = ''.join(random.sample(  
                ['z''y''x''w''v''u''t''s''r''q''p''o''n''m''l''k''j''i''h''g',  
                 'f',  
                 'e''d''c''b''a'], 5))  
  
            filename = './image/' + strs + '.jpg'  
            # 4:持久化存储  
            with open(filename, 'wb'as fe:  
                fe.write(content)  
                print('爬取完成' + str(time.time()))  
  
        print(title)

执行上方代码:

爬取完成1648783667.8503244

……

['标准的南北通厅,通透的户型,大两室,采光充足。',……]

输出内容太多,这里就不做展示了。

提示,需要在爬虫项目目录创建一个image文件夹,如下图所示:

11111111.png

 

别问我为什么不把下载图片部分的代码封装成一个方法,封了,报错不好用。如上方的代码所示,我用的还是之前看到的requests请求,并没有使用scrapy封装的请求。还没看到那个位置。

 

有好的建议,请在下方输入你的评论。