案例
-
需求:增量式爬取电影网站中最近更新的数据
-
分析:
-
代码实现
-
打开redis客户端:注意要修改编码格式为’UTF-8‘,不然中文显示出来都是16进制的,具体操作如下:
-
临时修改:只作用于当前窗口,先进入cmd命令窗口(快捷键win键+R)
-
直接输入“chcp 65001”,回车键(Enter键)执行,这时候该窗口编码已经是UTF-8编码了。
-
然后进入redis安装的目录下
- 输入
flushall
: 清空redis的数据
-
-
创建一个工程:
scrapy startproject moviePro
-
进入到工程目录中:
cd moviePro
-
scrapy genspider -t crawl movie www.xxx.com
-
编写爬虫文件movie.py
import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from moviePro.items import MovieproItem from redis import Redis class MovieSpider(CrawlSpider): name = 'movie' # allowed_domains = ['www.xxx.com'] start_urls = ['https://www.4567kp.com/frim/index1.html'] rules = ( Rule(LinkExtractor(allow=r'/frim/index1-\d+\.html'), callback='parse_item', follow=True), ) # 创建redis链接对象 conn = Redis(host='127.0.0.1', port=6379) # 用于解析每个页码对应页面中的电影详情页的url def parse_item(self, response): li_list = response.xpath('/html//div[1]/div/div/div/div[2]/ul/li') print(len(li_list)) for li in li_list: # 获取详情页的url detail_url = 'https://www.4567kp.com' + li.xpath('./div/a/@href').extract_first() # 将详情页的url存入redis的set中 ex = self.conn.sadd('urls', detail_url) # ex == 1 :字符串插入成功 # ex == 0 :插入的字符串重复了,利用redis的set集合去重 if ex == 1: print("该url没有被爬取过,可以进行数据爬取") yield scrapy.Request(url=detail_url, callback=self.parse_detail) else: print("数据还没有更新,暂无新数据可爬取!") # 解析详情页中的电影名称和简介,进行持久化存储 def parse_detail(self, response): item = MovieproItem() item['name'] = response.xpath('/html//div[1]/div/div/div/div[2]/h1/text()').extract_first() item['desc'] = response.xpath('/html//div[1]/div/div/div/div[2]/p[5]/span[2]/text()').extract() item['desc'] = ''.join(item['desc']) yield item
-
在items.py中创建两个属性
import scrapy class MovieproItem(scrapy.Item): # define the fields for your item here like: name = scrapy.Field() desc = scrapy.Field()
-
class MovieproPipeline: conn = None def open_spider(self, spider): self.conn = spider.conn def process_item(self, item, spider): dic = { 'name': item['name'], 'desc': item['desc'] } # print(dic) self.conn.lpush('movieData', dic) return item
-
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36' # Obey robots.txt rules # True:遵从robots协议 ROBOTSTXT_OBEY = False # 显示指定的类型的日志信息 LOG_LEVEL = 'ERROR' ITEM_PIPELInes = { 'moviePro.pipelines.MovieproPipeline': 300, }
-
在终端中输入:
scrapy crawl movie
,即可- 第一次爬取数据的时候,结果如下
- 第二次爬取该网站数据时,结果如下
-
在redis中查看存储情况
-
keys * : 查看数据存储结果列表
-
smembers urls : 查看urls存储内容
-
llen movieData:查看数据大小
-
lrange movieData 0 4:查看前5条样例数据
-
-
-
报错
参考链接
如果本文对你有帮助,记得“点赞、收藏”哦~
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。