安装
除了scrapy本身还要安装两个库
pip install scrapy
pip install pywin32
pip install wheel
创建项目
在要创建项目的地方打开powershell
scrapy startproject 项目名
我们得到这样的项目结构,功能如下
- scrapy.cfg 项目的主配置信息
- items.py 设置项目模板,用于结构化数据
- piplines.py 数据的持久化处理
- seting 配置文件
- spiders 爬虫文件目录
配置信息
seeting.py下修改是否支持数据爬取修改为允许,true不允许,false允许
将这一行的内容改为false
配置浏览器请求头中的user-agent
根据网站反爬措施制定其他的配置
配置模板
items.py中照着给出的格式配置自己的数据模板
变量名 = scrapy.Field()
创建爬虫文件
指定爬取目标
回到powershell,
cd 项目名
scrapy genspider 爬虫文件名 爬取目标网址
得到这样一个文件
import scrapyclass QuotesSpider(scrapy.Spider):# 爬虫名name = "quotes"allowed_domains = ["quotes.toscrape.com"]# 爬取目标start_urls = ["https://quotes.toscrape.com/"]# 爬取动作def parse(self, response):
寻找元素和内容
在parse方法中定义爬取动作 ,参数列表中的response是爬取目标的响应对象。
具有如下属性
- url:响应的 URL 地址。
- status:HTTP 状态码,如 200 表示成功,404 表示未找到等。
- headers:响应的 HTTP 头部信息,是一个类似字典的对象。
- body:响应体,即服务器返回的内容,是一个字节串(bytes)。
- text:响应体的字符串形式,如果响应的
Content-Type
是文本类型(如 HTML),则可以直接使用此属性获取内容。 - encoding:响应的编码方式,用于将
body
转换为text
。 - meta:传递给响应的元数据信息,常用于在请求和响应之间传递数据。
- request:触发此响应的请求(
Request
)对象。
具有如下方法
- xpath():用xpass寻找元素
- css():用css寻找元素
- urljoin():构造网址
- get() 和 getall(): 这两个方法用于从
Selector
或SelectorList
对象中提取数据。get()
方法返回第一个匹配节点的文本或属性值(如果指定了属性),而getall()
方法返回所有匹配节点的文本或属性值列表。 - extract() 和 extract_first(): 这两个方法是旧版本Scrapy中用于提取数据的方法,但在新版本中,推荐使用
get()
和getall()
方法。extract()
方法返回所有匹配节点的文本列表,而extract_first()
方法返回第一个匹配节点的文本。 - re(regex, replace_entities=True) 和 re_first(regex, default=None, replace_entities=True): 这两个方法允许你使用正则表达式来提取匹配的数据。
re()
方法返回所有匹配的字符串列表,而re_first()
方法返回第一个匹配的字符串。 - attrib: 这是一个属性字典,用于访问当前节点的属性。如果当前对象是
SelectorList
,则attrib
将返回列表中第一个元素的属性字典。
使用xpath和css方法寻找元素的时候如果返回多个值的时候添加.extract()返回的是str类型列表,单个值则为.extract_first(),返回的是str类型
text = q.xpath(".//span[@class='text']/text()").extract_first()
author = q.xpath('.//span/small[@class="author"]/text()').extract_first()
tags = q.xpath('.//div[@class="tags"]/a[@class="tag"]').extract()
这样找到的元素可以直接被bs4解析并获取值。
将结果组成模板
首先导入item,并在要组成模板的位置实例化一个ScrapydemoItem对象
from scrapydemo.items import ScrapydemoItemitem = ScrapydemoItem()#在你要组成模板的位置写
为实例属性赋值
item["text"] = text
item["author"] = author
item["tags"] = tags
结束爬虫 yield类似return,但是可以循环返回
yield item
每返回一个item会写入一条数据
当然也可以不返回item,获取到下一个页面的url即可继续访问下一个页面
# 获取访问下一页地址next = response.css('.pager .next .a::attr(href)').extract_first() # 两个冒号获取属性值# 合成绝对路径url = response.urljoin(next)# 访问请求的回调函数# 第三个参数是关闭地址过滤yield scrapy.Request(url=url,callback=self.parse,dont_filter=True)
这样就可以调用自己继续访问下一页了
创建启动项
创建main.py
from scrapy import cmdlinecmdline.execute("scrapy crawl quotes -o quotes.json".split())
# scrapy crawl 爬虫名 -o代表文件流 创建quotes.json这个文件
也可以在cmd或powershell中输入字符串中的值
爬取scrapy官方靶站的示例代码:
import scrapyfrom scrapydemo.items import ScrapydemoItemclass QuotesSpider(scrapy.Spider):# 爬虫名name = "quotes"allowed_domains = ["quotes.toscrape.com"]# 爬取目标start_urls = ["https://quotes.toscrape.com/"]# 爬取动作def parse(self, response):# 获取页面中的元素返回列表quote = response.xpath('//div[@class="quote"]')# 遍历列表每个元素for q in quote:text = q.xpath(".//span[@class='text']/text()").extract_first() # 获取内容author = q.xpath('.//span/small[@class="author"]/text()').extract_first() # 获取作者tags = q.xpath('.//div[@class="tags"]/a[@class="tag"]').extract() # 获取标签# 实例化item = ScrapydemoItem()# 为实例属性赋值item["text"] = textitem["author"] = authoritem["tags"] = tags# 返回数据,相当于return,但是可以循环返回。yield item# 获取访问下一页地址next = response.css('.pager .next .a::attr(href)').extract_first() # 两个冒号获取属性值# 合成绝对路径url = response.urljoin(next)# 访问请求的回调函数# 第三个参数是关闭地址过滤yield scrapy.Request(url=url,callback=self.parse,dont_filter=True)