当前位置: 首页 > news >正文

做视频网站的流程整合营销沟通

做视频网站的流程,整合营销沟通,网站建设教程实训心得,网站域名购买后能修改吗目录 目标 版本 实战 搭建框架 获取图片链接、书名、价格 通过管道下载数据 通过多条管道下载数据 下载多页数据 目标 掌握Scrapy框架的搭建及使用,本文以爬取当当网魔幻小说为案例做演示。 版本 Scrapy 2.12.0 实战 搭建框架 第一步:在D:\pyt…

目录

目标

版本

实战

搭建框架

获取图片链接、书名、价格

通过管道下载数据

通过多条管道下载数据

下载多页数据


目标

        掌握Scrapy框架的搭建及使用,本文以爬取当当网魔幻小说为案例做演示。


版本

        Scrapy 2.12.0


实战

搭建框架

第一步:在D:\pytharm_workspace位置创建爬虫Scrapy项目。通过cmd在该目录执行Scrapy创建项目命令。dangdang是我的项目名称。

scrapy startproject dangdang

第二步:进入项目目录,并创建爬虫类。其中magic_novels是我自定义的爬虫程序名称,permit.mee.gov.cn表示要爬取的网站域名。

第三步:注释在settings文件中掉OBOTSTXT_OBEY协议。

#ROBOTSTXT_OBEY = True

第四步:打开Pycharm控制台,进入项目目录。设置start_urls为我们要爬取的首页。parse表示项目启动后会自动请求start_urls中的URL。所以我们在parse方法中调试输出,并运行项目。

import scrapyclass MagicNovelsSpider(scrapy.Spider):name = "magic_novels"allowed_domains = ["category.dangdang.com"]start_urls = ["https://category.dangdang.com/cp01.03.40.00.00.00.html"]def parse(self, response):print(response.url)print(response.text)

 scrapy crawl magic_novels

第五步:此时会打印很多的无用信息,我们可以在settings.py文件中设置日志级别。再次启动项目后会发现页面干净了很多。

LOG_LEVEL = "WARNING"
scrapy crawl magic_novels
注意:如果多次请求导致可能会导致缓存出现,请使用以下命令:
scrapy crawl magic_novels --set HTTPCACHE_ENABLED=False

获取图片链接、书名、价格

第一步:通过xpath爬取价格、图片、书名,我们先来打印调试。此时发现图片的链接不对,思考是否是懒加载的一个反扒策略。

    def parse(self, response):'''图片的链接:src=//ul[@id='component_59']/li//img/@src图片的名称:alt=//ul[@id='component_59']/li//img/@alt图书的价格:price=//ul[@id='component_59']/li//p[@class='price']/span考虑到所有的数据都来源于//ul[@id='component_59']/li,所以我们可以复用li对象。'''li_list = response.xpath("//ul[@id='component_59']/li")for li in li_list:print(f'图片的链接:src={li.xpath(".//img/@src").extract_first()}')print(f'图片的名称:alt={li.xpath(".//img/@alt").extract_first()}')print(f'图书的价格:price={li.xpath(".//p[@class='price']/span[1]/text()").extract_first()}')print("\n")

第二步: 刷新页面,在浏览器检查中查看第一个和最后一个,发现图片链接的初始接收属性并不是src,而是data-original,src是加载以后才代替data-original的。

第三步:修改src获取的方法,并再次运行项目。发现除了第一个图书的src为None,其他src都正常获取了。猜测:是不是第一个图书打开时没有使用懒加载。

第四步: 通过调试发现,确实如刚才的猜想一般,第一个图书的src没有使用懒加载。修改代码后再次调试,发现可以获取到第一个图书的链接。

    def parse(self, response):'''图片的链接:src=//ul[@id='component_59']/li//img/@src图片的名称:alt=//ul[@id='component_59']/li//img/@alt图书的价格:price=//ul[@id='component_59']/li//p[@class='price']/span考虑到所有的数据都来源于//ul[@id='component_59']/li,所以我们可以复用li对象。'''li_list = response.xpath("//ul[@id='component_59']/li")for i , li in enumerate(li_list):print(f'第{i+1}本书。')src = li.xpath(".//img/@data-original").get()if src is None:src = li.xpath(".//img/@src").get()alt = li.xpath(".//img/@alt").get()price = li.xpath(".//p[@class='price']/span[1]/text()").get()print(f'图片的链接:src={src}')print(f'图片的名称:alt={alt}')print(f'图书的价格:price={price}')print("\n")


通过管道下载数据

第一步:打开items.py文件,配置字段。

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.htmlimport scrapyclass DangdangItem(scrapy.Item):# 图片src = scrapy.Field()# 书名name = scrapy.Field()# 价格price = scrapy.Field()

第二步:将item类导入到爬虫程序。

import scrapyfrom dangdang.items import DangdangItemclass MagicNovelsSpider(scrapy.Spider):name = "magic_novels"allowed_domains = ["category.dangdang.com"]start_urls = ["https://category.dangdang.com/cp01.03.40.00.00.00.html"]def parse(self, response):'''图片的链接:src=//ul[@id='component_59']/li//img/@src图书的名称:alt=//ul[@id='component_59']/li//img/@alt图书的价格:price=//ul[@id='component_59']/li//p[@class='price']/span考虑到所有的数据都来源于//ul[@id='component_59']/li,所以我们可以复用li对象。'''li_list = response.xpath("//ul[@id='component_59']/li")for i , li in enumerate(li_list):print(f'第{i+1}本书。')src = li.xpath(".//img/@data-original").get()if src is None:src = li.xpath(".//img/@src").get()alt = li.xpath(".//img/@alt").get()price = li.xpath(".//p[@class='price']/span[1]/text()").get()print(f'图片的链接:src={src}')print(f'图书的名称:alt={alt}')print(f'图书的价格:price={price}')print("\n")#该对象要通过管道去下载,通过yield可以在每次获得book后立刻返回book给管道。book=DangdangItem(src=src, alt=alt, price=price);yield book

第三步:在settings.py中开启管道配置。管道可以有很多个并且有优先级,值越大优先级越小。

ITEM_PIPELINES = {"dangdang.pipelines.DangdangPipeline": 300,
}

第四步:来到pipelines.py文件,其中process_item方法中的item就是我们刚才在爬虫程序配置的boot对象。我们可以打印测试效果。

class DangdangPipeline:def process_item(self, item, spider):print(type(item))print(str(item))return item
scrapy crawl magic_novels

思考:我们通过process_item可以获取到数据,但是每次循环获取数据再重新打开文件、写入数据,关闭文件明显不符合开发规范。

第五步:在pipelines.py文件中配置open_spider和close_spider方法,分别表示在爬虫程序执行前执行的方法和在爬虫程序执行之后执行的方法。我们可以打印日志测试。

class DangdangPipeline:#在爬虫文件开始之前就执行的方法def open_spider(self, spider):print("++++")def process_item(self, item, spider):print(type(item))print(str(item))return item#在爬虫文件执行之后再执行的方法def close_spider(self, spider):print("----")
scrapy crawl magic_novels

第六步: 下载JSON数据。

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
import json# useful for handling different item types with a single interface
from itemadapter import ItemAdapterclass DangdangPipeline:#在爬虫文件开始之前就执行的方法def open_spider(self, spider):self.fp=open("book.json","w",encoding="utf-8")self.fp.write("[")def process_item(self, item, spider):line = json.dumps(dict(item), ensure_ascii=False) + ",\n"self.fp.write(line)return item#在爬虫文件执行之后再执行的方法def close_spider(self, spider):# 删除最后一个多余的逗号,并关闭 JSON 数组self.fp.seek(self.fp.tell() - 3, 0)  self.fp.write("\n]")self.fp.close()
scrapy crawl magic_novels

 


通过多条管道下载数据

第一步:在pipelines.py文件中定义新的管道类。

#下载图片
class DangdangDownloadImgPipeline:# 在爬虫文件开始之前就执行的方法def open_spider(self, spider):passdef process_item(self, item, spider):print(item.get('src'))url="http:"+item.get('src')filename='C:/Users/Administrator/Desktop/test/'+sanitize_filename(item.get("alt"))+'.jpg'urllib.request.urlretrieve(url=url,filename=filename)return item# 在爬虫文件执行之后再执行的方法def close_spider(self, spider):passdef sanitize_filename(filename):"""替换 Windows 文件名中不合法的字符为下划线。"""# 定义 Windows 文件名不允许的字符invalid_chars = r'[\\/:*?"<>|]'# 使用正则表达式将非法字符替换为下划线return re.sub(invalid_chars, '_', filename)

第二步:在settings.py中定义该管道类的优先级。

ITEM_PIPELINES = {"dangdang.pipelines.DangdangPipeline": 300,"dangdang.pipelines.DangdangDownloadImgPipeline": 300,
}

第三步:执行下载操作,可以看到JSON数据和图片都下载成功了。

scrapy crawl magic_novels


下载多页数据

思考:目前我们只是下载了第一页的数据,能否通过配置页码下载多个页面的数据呢?

第一步:去页面点击下一页,发现链接都差不多,区别在于pg后面的跟的页码。

https://category.dangdang.com/pg2-cp01.03.40.00.00.00.html
https://category.dangdang.com/pg3-cp01.03.40.00.00.00.html

第二步:在爬虫程序中,设置基础的url和页码,页码初始化为第一页。

class MagicNovelsSpider(scrapy.Spider):name = "magic_novels"allowed_domains = ["category.dangdang.com"]start_urls = ["https://category.dangdang.com/cp01.03.40.00.00.00.html"]base_url="https://category.dangdang.com/pg"page_num=1;

第三步:在parse方法中递归请求当当网,每次请求都将url的页码改变。注意:递归逻辑写在循环之外。

import scrapyfrom dangdang.items import DangdangItemclass MagicNovelsSpider(scrapy.Spider):name = "magic_novels"allowed_domains = ["category.dangdang.com"]start_urls = ["https://category.dangdang.com/cp01.03.40.00.00.00.html"]base_url="https://category.dangdang.com/pg"page_num=1;def parse(self, response):'''图片的链接:src=//ul[@id='component_59']/li//img/@src图书的名称:alt=//ul[@id='component_59']/li//img/@alt图书的价格:price=//ul[@id='component_59']/li//p[@class='price']/span考虑到所有的数据都来源于//ul[@id='component_59']/li,所以我们可以复用li对象。'''li_list = response.xpath("//ul[@id='component_59']/li")for i , li in enumerate(li_list):print(f'第{i+1}本书。')src = li.xpath(".//img/@data-original").get()if src is None:src = li.xpath(".//img/@src").get()alt = li.xpath(".//img/@alt").get()price = li.xpath(".//p[@class='price']/span[1]/text()").get()print(f'图片的链接:src={src}')print(f'图书的名称:alt={alt}')print(f'图书的价格:price={price}')print("\n")#该对象要通过管道去下载,通过yield可以在每次获得book后立刻返回book给管道。book=DangdangItem(src=src, alt=alt, price=price);yield bookif self.page_num<3:self.page_num+=1url=self.base_url+str(self.page_num)+"-cp01.03.40.00.00.00.html";#GET请求yield scrapy.Request(url=url, callback=self.parse)

第四步:运行项目。发现可以正常下载前三页的数据。

http://www.hkea.cn/news/231705/

相关文章:

  • 北京网站设计多少钱微信引流推广
  • 网站建设实施背景分析百度指数里的资讯指数是什么
  • 小程序定制开发深圳公司网站的优化seo
  • 构建一个网站域名查询平台
  • 蚌埠网站关键词优化推广下载
  • 看房地产的app在哪看aso安卓优化
  • 网站与域名的区别扬州整站seo
  • 哪些网站可以进行域名注册公司关键词seo
  • 如何申请一个网站 做视频百度小说搜索热度排行榜
  • 天津做网站选择津坤科技b重庆seo教程搜索引擎优化
  • 什么网站做热能表好百度一下电脑版首页网址
  • 点击图片直接进入网站怎么做如何使用免费b站推广网站
  • 手机网站建设软件怎么在百度上做广告推广
  • 南京做网站团队手机app免费制作平台
  • 17173游戏网搜索优化指的是什么
  • 公司做网站需要给百度交钱吗百度竞价推广方案
  • 网站建设的关键seo推广小分享
  • 写小说的小网站百度关键词排名优化
  • 制作网站的成本规划公司如何建立网站
  • html语言做网站石嘴山网站seo
  • 做最好的言情网站官网seo优化
  • 云南建设监理协会网站营销失败案例分析
  • 怎么样做淘宝优惠券网站搜索引擎营销的优缺点
  • wordpress动态订单seo社区
  • 网站域没到期不能续费吗google谷歌搜索
  • 厦门好的做网站公司网络营销推广方式都有哪些
  • 重庆市建设工程信息官网站自己做网站的流程
  • 网站建设公司怎么做网络营销网站推广
  • 360应用商店seo服务套餐
  • 废橡胶网站建设个人博客网页设计