数据解析这是一个很重要的话题。
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文件夹,如下图所示:
别问我为什么不把下载图片部分的代码封装成一个方法,封了,报错不好用。如上方的代码所示,我用的还是之前看到的requests请求,并没有使用scrapy封装的请求。还没看到那个位置。
有好的建议,请在下方输入你的评论。