📃个人主页:互联网阿星🧐
💬格言:选择有时候会大于努力,但你不努力就没得选
🔥作者简介:大家好我是互联网阿星,和我一起合理使用Python,努力做时间的主人
🏆如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博主哦🤞
行业资料:PPT模板、简历模板、行业经典书籍PDF
面试题库:历年经典、热乎的大厂面试真题,持续更新中…
学习资料:含Python基础、爬虫、数据分析、算法等学习视频和文档
Tips:以上资料·阿星已备好
>>戳我,空投直达🪂
阿星文章·目录
; 前言
本节,阿星将使用Scrapy获取zcool数据作为示例
Scrapy爬虫框架的应用
案例说明
通过Python爬虫基础入门,我们已经初步了解了scrapy的工作流程以及原理。
- imgLink(封面图片链接);
- title(标题);
- types(类型);
- vistor(人气);
- comment(评论数);
然后只是一个页面的item,我们还要通过翻页实现批量数据采集。
; 文件配置
目录结构
在上一篇中我们说明了新建 scrapy项目(zcool) 和 spider项目(zc),这里不再赘述,然后得到我们的目录结构如下图所示:
; start.py文件
然后为了方便运行,在zcool目录下新建start文件。并进行初始化设置。
from scrapy import cmdline
cmdline.execute('scrapy crawl zc'.split())
settings.py文件
在这个文件里我们需要做几样设置👇
避免在程序运行的时候打印log日志信息
LOG_LEVEL = 'WARNING'
ROBOTSTXT_OBEY = False
添加请求头:
item.py文件
import scrapy
class ZcoolItem(scrapy.Item):
imgLink = scrapy.Field()
title = scrapy.Field()
types = scrapy.Field()
vistor = scrapy.Field()
comment = scrapy.Field()
likes = scrapy.Field()
页面数据提取
首先我们在站酷页面使用xpath-helper测试一下:
然后zc.py文件里面初步测试一下:
def parse(self, response):
divList = response.xpath('//div[@class="work-list-box"]/div')
print(len(divList))
没有问题,然后我们对各种信息分别解析提取,
def parse(self, response):
divList = response.xpath('//div[@class="work-list-box"]/div')
for div in divList:
imgLink = div.xpath("./div[1]/a/img/@src").extract()[0]
... 2.title(标题);3 types(类型);4vistor(人气);5comment(评论数) ....
likes = div.xpath("./div[2]/p[3]/span[3]/@title").extract_first()
item = ZcoolItem(imgLink=imgLink,title=title,types=types,vistor=vistor,comment=comment,likes=likes)
yield item
解释: xpath提取数据方法:
S.N.方法 & 描述extract()返回的是符合要求的所有的数据,存在一个列表里。extract_first()返回的hrefs 列表里的第一个数据。get()和extract_first()方法返回的是一样的,都是列表里的第一个数据。getall()和extract()方法一样,返回的都是符合要求的所有的数据,存在一个列表里。
注意:
”
get() 、getall() 方法是新的方法,extract() 、extract_first()方法是旧的方法。extract() 、extract_first()方法取不到就返回None。get() 、getall() 方法取不到就raise一个错误。
“
item实例创建(yield上面一行代码)
这里我们之前在目录文件配置的item文件中已经进行了设置,对于数据存储,我们在爬虫文件中开头要导入这个类:
from zcool.items import ZcoolItem
然后使用yield返回数据。
为什么使用yield而不是return
不能使用return这个无容置疑,因为要翻页,使用return直接退出函数;而对于yield:在调用for的时候,函数内部不会立即执行,只是返回了一个生成器对象。在迭代的时候函数会开始执行,当在yield的时候,会返回当前值(i)。之后的这个函数会在循环中进行,直到没有下一个值。
翻页实现批量数据采集
通过上面的代码已经可以初步实现数据采集,只不过只有第一页的,如下图所示:
但是我们的目标是100个页面的批量数据采集,所以代码还需要修改。针对翻页这里介绍两种方式:
方式一:我们首先在页面中定位到下一页的按钮,如下图所示:
然后编写如下代码,在for循环完毕后。
next_href = response.xpath("//a[@class='laypage_next']/@href").extract_first()
if next_href:
next_url = response.urljoin(next_href)
print('*' * 60)
print(next_url)
print('*' * 60)
request = scrapy.Request(next_url)
yield request
scrapy.Request()
: 把下一页的url传递给Request函数,进行翻页循环数据采集。
注意方式一只有下一页按钮它的 href对应属性值和下一页的url一致才行。
方式二:定义一个全局变量count = 0,每获取一页数据,令其加一,构建新的url,再使用scrapy.Request() 发起请求。
如下图所示:
这两种方式在实际案例中择机采用。
数据存储
数据存储是在pipline.py中进行的,代码如下:
from itemadapter import ItemAdapter
import csv
class ZcoolPipeline:
def __init__(self):
self.f = open('Zcool.csv','w',encoding='utf-8',newline='')
self.file_name = ['imgLink', 'title','types','vistor','comment','likes']
self.writer = csv.DictWriter(self.f, fieldnames=self.file_name)
self.writer.writeheader()
def process_item(self, item, spider):
self.writer.writerow(dict(item))
print(item)
return item
def close_spider(self,spider):
self.f.close()
解释:
- line1: 打开文件,指定方式为写,利用第3个参数把csv写数据时产生的空行消除
- line2: 设置文件第一行的字段名,注意要跟spider传过来的字典key名称相同
- line3: 指定文件的写入方式为csv字典写入,参数1为指定具体文件,参数2为指定字段名
- line4: 写入第一行字段名,因为只要写入一次,所以文件放在__init__里面
- line5: 写入spider传过来的具体数值,注意在spider文件中yield的item,是一个由类创建的实例对象,我们写入数据时,写入的是 字典,所以这里还要转化一下。
- line6: 写入完返回
程序运行
因为之前创建了start.py文件,并且对它就行了初始化设置,现在运行爬虫程序不需要在控制台中输入命令:
scrapy crawl zc(爬虫项目名)
直运行start.py文件:得到如下结果:
对应于页面:
打开csv文件如下图所示:(由于csv文件在word中乱码了,此处我是用Notepad++打开)
没有问题,数据采集完毕。
小结
Scrapy爬虫框架的应用丨Python爬虫实战系列(9)
就到这了,入门案例,需要细心,主要是基础知识的巩固,以便于为进阶学习做好准备。在学爬虫的老铁记得持续关注,阿星祝你早日修炼成为爬虫大佬😎如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博主哦🤞
学习资料:含Python基础、爬虫、数据分析、算法等学习视频和文档
行业资料:添加即可领取PPT模板、简历模板、行业经典书籍PDF
面试题库:历年经典,热乎的大厂面试真题,持续更新中…
资料已备好,戳我文末名片领…√
🐌资料已备好👇戳我名片领🐱💻
Original: https://blog.csdn.net/m0_68103523/article/details/124934222
Author: 互联网阿星
Title: Scrapy爬虫框架的应用丨Python爬虫实战系列(9)
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/791064/
转载文章受原作者版权保护。转载请注明原作者出处!