import scrapy
from scrapy.http.request import Request
from scrapy.http.response.html import HtmlResponse
from scrapy_demo.items import ForumItem class BaiduSpider(scrapy.Spider):
# name必须是唯一的,因为运行一个爬虫是通过name来选择的。
# 你需要运行命令行:scrapy crawl <name> 来执行爬虫
name = "tieba" # 爬取数据的限制范围
# 比如有时候baidu.com中就可能会加载其他域名的数据比如123.com。如果不限制scrapy会连123.com也爬。
#
allowed_domains = ["baidu.com"] # 第一次发起请求的URL,这个都是要修改的
# 默认值是你用命令行方式创建一个爬虫时指定的<domain>
# 命令行:scrapy genspider <name爬虫名> <domain(也就是start_urls的默认值)>
start_urls = ["https://tieba.baidu.com"] def parse(self, response: HtmlResponse, **kwargs):
"""
这个方法是自动生成的(你用scrapy genspider命令才会生成呀》。。)
parse方法用于定义如何处理数据的
我们主要是写这个方法.
"""
# print(response)
# print(type(response))
req = response.request # type: Request
# print(req.url) # 获取响应体
# response.body.decode("utf-8") # 二进制数据需要decode() 这个和lxml的response.content是一样的、
# print(response.text) # 使用xpath提取数据
items = response.xpath("//ul[@id='forumList']/li[@class='rcmd_forum_item']") # 使用css选择器提取数据
# -css取文本
# 'a.link-title::text'
# -css取属性
# 'img.image-scale::attr(src)'
# response.css()
# response.csss("") result = [] for item in items:
forum_name = item.xpath("./a/div[@class='rcmd_forum_info']/div[@class='forum_name']/text()").get()
forum_member = item.xpath("./a/div[@class='rcmd_forum_info']/div[@class='forum_member']/text()").get() # 以前我们都是自己构建字典来存储数据,现在可以用scrapy提供的Item模型类来存储数据
# 当然了不是说你不能使用字典存,只是建议用Scrapy提供的Item模型类来存储
# result.append({
# "forum_name": forum_name,
# "forum_member": forum_member
# }) # 使用框架的Item模型类来代替以前的字典
forum_item = ForumItem()
forum_item["forum_name"] = forum_name
forum_item["forum_member"] = forum_member
# 每执行yield一次,就会丢给pipeline来处理
yield forum_item # print(result) # parse()函数中使用yield返回数据给Pipelines,
# 注意:parse()函数中的yield能够传递的对象只能是:BaseItem, Request, dict, None
# yield {"result": result} def start_requests(self):
"""
默认爬虫第一次发起的请求是start_urls中指定的URL列表,然而默认的请求方式是GET请求
如果你第一次请求是POST,就必须重写这个方法,然后修改请求方式
"""
if not self.start_urls and hasattr(self, "start_url"):
raise AttributeError(
"Crawling could not start: 'start_urls' not found "
"or empty (but found 'start_url' attribute instead, "
"did you miss an 's'?)"
)
for url in self.start_urls:
# 修改默认的请求方式为POST
yield Request(url, dont_filter=True, method="GET")

Scrapy爬虫文件代码基本认识和细节解释的更多相关文章

  1. Python之Scrapy爬虫框架 入门实例(一)

    一.开发环境 1.安装 scrapy 2.安装 python2.7 3.安装编辑器 PyCharm 二.创建scrapy项目pachong 1.在命令行输入命令:scrapy startproject ...

  2. Scrapy 框架,爬虫文件相关

    Spiders 介绍 由一系列定义了一个网址或一组网址类如何被爬取的类组成 具体包括如何执行爬取任务并且如何从页面中提取结构化的数据. 简单来说就是帮助你爬取数据的地方 内部行为 #1.生成初始的Re ...

  3. 第十七节:Scrapy爬虫框架之item.py文件以及spider中使用item

    Scrapy原理图: item位于原理图的最左边 item.py文件是报存爬取数据的容器,他使用的方法和字典很相似,但是相比字典item多了额外的保护机制,可以避免拼写错误或者定义错误. 1.创建it ...

  4. 第十六节:Scrapy爬虫框架之项目创建spider文件数据爬取

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取所设计的, 也可以应用在获取API所返回的数据或 ...

  5. Scrapy爬虫框架(2)--内置py文件

    Scrapy概念图 这里有很多py文件,分别与Scrapy的各个模块对应 superspider是一个爬虫项目 spider1.py则是一个创建好的爬虫文件,爬取资源返回url和数据 items.py ...

  6. 第三百四十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—craw母版l创建自动爬虫文件—以及 scrapy item loader机制

    第三百四十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—craw母版l创建自动爬虫文件—以及 scrapy item loader机制 用命令创建自动爬虫文件 创建爬虫文件是根据scrap ...

  7. 第三百四十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—编写spiders爬虫文件循环抓取内容—meta属性返回指定值给回调函数—Scrapy内置图片下载器

    第三百四十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—编写spiders爬虫文件循环抓取内容—meta属性返回指定值给回调函数—Scrapy内置图片下载器 编写spiders爬虫文件循环 ...

  8. 第三百三十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—Scrapy启动文件的配置—xpath表达式

    第三百三十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—Scrapy启动文件的配置—xpath表达式 我们自定义一个main.py来作为启动文件 main.py #!/usr/bin/en ...

  9. 二十三 Python分布式爬虫打造搜索引擎Scrapy精讲—craw母版l创建自动爬虫文件—以及 scrapy item loader机制

    用命令创建自动爬虫文件 创建爬虫文件是根据scrapy的母版来创建爬虫文件的 scrapy genspider -l  查看scrapy创建爬虫文件可用的母版 Available templates: ...

  10. 二十 Python分布式爬虫打造搜索引擎Scrapy精讲—编写spiders爬虫文件循环抓取内容—meta属性返回指定值给回调函数—Scrapy内置图片下载器

    编写spiders爬虫文件循环抓取内容 Request()方法,将指定的url地址添加到下载器下载页面,两个必须参数, 参数: url='url' callback=页面处理函数 使用时需要yield ...

随机推荐

  1. CodeForces 1367D Task On The Board

    题意 给一个字符串\(t\),和一个长度为\(m\)的数组\(b[]\),要求构造一个字符串\(s\),\(s\)中的字符都出现在\(t\)中,对于\(s[i]\)而言,对于任意\(j\),如果有\( ...

  2. JavaScript中的浅拷贝与深拷贝

    前言 JavaScript中的浅拷贝和深拷贝是非常重要的概念,它们在处理对象和数组时具有不同的作用.在编程中,经常需要复制数据以便进行各种操作,但必须注意拷贝的方式,以确保得到预期的结果. 浅拷贝是创 ...

  3. C#集成ViewFaceCore人脸检测识别库

    前言 人脸检测与识别现在已经很成熟了,C# 上有 ViewFaceCore 这个很方便的库,但这种涉及到 native 调用的库,一般会有一些坑,本文记录一下开发和部署的过程. 本文的项目是 AIHu ...

  4. 文心一言 VS 讯飞星火 VS chatgpt (98)-- 算法导论9.3 4题

    四.用go语言,对一个包含n个元素的集合,假设一个算法只使用比较来确定第i小的元素,证明:无需额外的比较操作,它也能找到第 i-1 小的元素和第 n-i大的元素. 文心一言: 在这个问题中,我们要使用 ...

  5. c语言代码练习--函数

    函数: 一,概念: 1,在计算科学中,子程序(英语:Subroutione,procedure,function,rotine,method.subprogram,callable unit),是一个 ...

  6. Excel--比较两列数据的异同

    首先得到的数据分为两列,两种类型.由于在网站上搜索的时候,网站的"特殊性"会将000638-32-4 前面的0全部去掉.变成了638-32-4.基于得到了两列稍有不同的数据.由于人 ...

  7. 前端CSS五中元素定位类型

    元素想通过底部.顶部.左侧.右侧属性定位是必须先设定position的属性值 posistion属性的五个值:static.relative.fixed.absoulte.sticky static定 ...

  8. .Net Core3中微信退款证书本地调试正常读取证书,在服务器IIS中加载不到证书文件

    如图,在开发微信退款功能时,需要用到微信提供的证书文件.本地开发调试时是正常的,但放到服务器(WinServer 2012 R2)中,则报错提示找不到文件. 网上找了一堆骚操作都没什么卵用,最后在其中 ...

  9. Redis 技术整理

    认识Redis Redis官网:https://redis.io/ Redis诞生于2009年全称是Remote Dictionary Server 远程词典服务器,是一个基于内存的键值型NoSQL数 ...

  10. Redis Functions 介绍之一

    Redis提供了编程接口(programming interface)可以让你在Redis服务器端执行客户的脚本. 一个重大的变化就是从Redis 7开始,你可以选择使用Redis Functions ...