pip install scrapy
有时候会有错误,cryptograph库存在问题
进入rust网站,下载自己的系统版本
https://www.rust-lang.org/tools/install
运行后,确认安装,出现
选1default,安装成功后会在自动退出,用检查版本的方式看是否安装成功
这样的话scrapy不能在虚拟环境安装,只能在自己的主环境安装,会影响一些包
可以重新建个虚拟环境继承系统环境
scrapy startproject my创建spider
可以根据上一个的提示创建,他的example是指的爬虫名字和爬虫网站主机
比如这样的,sta是名字,csdn.net是主机地址
此时的项目结构是这样的
配置文件的解析请查看:https://blog.csdn.net/qq_40558166/article/details/107882564
默认的大部分设置是注释的
主要调整ROBOTSTXT_OBEY,爬虫规则的遵守
一般也开启管道、中间件、插件、下载器的设置
在项目目录下命令行启动
scrapy crawl sta
会开始执行sta下的parse函数
##配置日志
在settings做配置
LOG_LEVEL = 'WARNING' LOG_FILE = './log.log'
这样warning级别以上的信息才会被显示,并且输入到文件
从scrapy的selector导入Selector类
声明一个类的实例
然后用xpath提取
示例:提取图片的链接
地址:https://pic.netbian.com/4kmeinv/
先修改starturls列表,加上这个地址
可以使用链式方法extract()和extract_first()方式提取文字
代码类似,也有extract的两种方法,不同的是在浏览器检查里选择复制的是selector
前面拿到的数据都可以后面接链路re(表达式)进行正则匹配
上面xpath和css取出来的值都是相当于html元素,可以在元素上继续接xpath和css取下级元素
链接传播使用如下语句传递到下一个链接,回调函数是parse函数
yield scrapy.Request(newurl,callback=self.parse)
Request里面也有别的参数可以添加
除了这个还有FormRequest方法传递表单数据,一般取method和formdata,callback三个参数
更通用的是response的follow方法
在items.py文件中定义数据字段
name= scrapy.Field()
url = scrapy.Field()
调用数据字典
在spider类的parse函数中调用
先创建类的实例
item = items.MyItem()
赋值给他就是
item['name']='xxx'
传递出去用
yield item
或者return也可以
处理数据首先要在设置中把items_pipline的设置打开
在piplines.py文件里面做处理
下面的例子是用mysql数据库检查数据是否已经存在
open_spider定义启动的操作
close_spider定义关闭的操作
process_item定义处理item的操作
还可以定义init函数,做初始化操作
最后都要return item,一般用raise DropItem来抛弃item不处理
from itemadapter import ItemAdapter
import pymysql
from scrapy.exceptions import DropItem
class FfPipeline:
def open_spider(self, spider):
self.client = pymysql.connect(
host = '127.0.0.1',
port = 3306,
user = 'root',
password = '12345678',
database = 'db1',
charset = 'utf8'
)
self.cursor = self.client.cursor()
def close_spider(self, spider):
self.cursor.close()
self.client.close()
def process_item(self, item, spider):
sname=item['sname']
age=item['age']
sql=f"select * from testtable where sname='{sname}' and age='{age}'"
print(sql)
rows=self.cursor.execute(sql)
print(rows)
if rows==0:
sql2=f"insert into testtable(sname,age) values ('{sname}','{age}')"
self.cursor.execute(sql2)
print('新增了一条数据')
self.client.commit()
return item
else:
print(f'数据({sname},{age})已存在')
raise DropItem
读取设置文件
可以用from_crawler 的类方法读取设置文件的信息,读出来是字典,可以用get方法获取指定设置的值
@classmethod
def from_crawler(cls, crawler):
settings = crawler.settings
return cls(*args, **kwargs)
Spider类中的方法
除了默认的parse方法,它还可以 有别的方法
start_requests:读取start_urls内的地址,并为每一个地址生成一个Request对象,交给Scrapy下载并返回Response,仅调用一次
make_requests_from_url:在start_requests()中调用,实际生成Request的函数。默认的回调函数为parse(),提交的方式为get
parse:默认的Request对象回调函数,处理返回的response。生成Item或者Request对象。用户必须实现这个方法
init:初始化Spider类的变量,如start_urls和alowed_domains
具体参考:https://www.cnblogs.com/derek1184405959/p/8450457.html
有两种中间件
下载器中间件和蜘蛛中间件
具体的区别参考:https://blog.csdn.net/Qwertyuiop2016/article/details/105553100?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_title~default-0.no_search_link&spm=1001.2101.3001.4242.1
蜘蛛中间件一般用于操作蜘蛛返回的request,而下载中间件用于操作向互联网发起请求的request和返回的response
将设置内的两个中间件取消注释,并将自己的中间件加入字典中,优先级取值根据需要调整
方法下载中间件的核心的方法一般有
process_request(request, spider):处理请求
process_response(request, response, spider):处理响应
process_exception(request, exception, spider):处理异常
蜘蛛中间件的核心方法有
process_spider_input(response, spider):所有请求都会调用这个方法
process_spider_output(response, result, spider):spider解析完response之后调用该方法,result就是解析的结果(是一个可迭代对象),其中可能是items也可能是request对象
process_spider_exception(response, exception, spider):处理异常
process_start_requests(start_requests, spider):同process_spider_output,不过只处理spider中start_requests方法返回的结果
共有的有from_crawler(cls, crawler),从settings.py获取配置
一般都自定义下载中间件,来实现修改 User-Agent、处理重定向、设置代理、失败重试、设置 cookies 、随机等待延迟等功能



