一、使用
scrapy可以使用xpath
语法
创建一个项目scrapy startproject dome1
进入项目 cd dome1
指定项目开始爬取的范围scrapy genspider test1 baidu.com
运行项目scrapy crawl test1
通过交互环境测试项目scrapy shell https://www.baidu.com
单词 extract
、extract_first
、callback
连接追踪
return scrapy.Request(next_url,callback=self.parse,dont_filter=True)
1.四大模块
- spiders(蜘蛛,网页爬虫)
- 发布需求,解析下载的内容返回给item pipelines进行保存或者交给管理者继续处理。
- downloader(下载器)
- 需求下载地址
- scheduler(计划员、调度器)
- 排队等待处理
- item pipelines(项目管道)
- 对下载数据的处理(存储)
- items.py文件是对数据定义格式类型的
- pipelines.py文件是管道处数量等处理的
- 对下载数据的处理(存储)
spiders发布请求并定义请求内容,对数据进行解析;downloader是下载器进行下载,主要负责对spider的请求进行下载,然后spider会对下载回来的数据进行处理,然后将有用的数据交给item pipelines,进行保存;items.py文件是定义存储的格式的,它的使用方法与字典类似。
1.spiders
内部都是项目对应的爬虫文件
- yield函数:碰到yield函数,那么他就会去寻找yield赋值给了谁,然后执行yield对应的操作。然后再去执行yield下面的内容。
- yield返回的内容是交给了pipelines.py文件。
- 说一下json字符串
- dumps是编码成json格式
- loads是解码成python对象
2.ietms.py
定义你要爬取的字段
3.pipelines.py
开启管道:在settings里面搜索300,会发现一个ITEM_PIPELINES = { 'dome1.pipelines.Dome1Pipeline': 300,}
,把这个打开即为打开管道。
1.首先开启管道
pipelines有多个类可以多设置几个管道 settings里面修改配置文件 可以实现多线程
管道之间的数据可以共享
ITEM_PIPELINES = {
'myspider.pipelines.MyspiderPipeline': 299,
'myspider.pipelines.MyspiderPipeline': 300,
'myspider.pipelines.MyspiderPipeline': 301,
}
#权重越小,他的运行的越快
2.保存数据
将数据从spiders中提取到pipelines中并进行保存
使用:yield
主要的功能是对下载的数据进行保存
class Dome1Pipeline(object):
def process_item(self, item, spider):
with open('test2.txt','a+',encoding='utf-8') as f:
data = json.dumps(dict(item),ensure_ascii=False) + '\n'
f.write(data)
return item
这里一定要return item
告诉scrapy已经保存完了。
4.middlewares.py
pass
2.配置文件
1.设置提示信息
LOG_LEVEL = 'WARNING'
2.设置头部信息
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
#或者
3.开启管道
ITEM_PIPELINES = {
'myspider.pipelines.MyspiderPipeline': 300,
}
4.记录到本地文件
LOG_FILE = './log.log'
5.logging的使用
级别 | 级别数值 | 使用时机 |
---|---|---|
DEBUG | 10 | 详细信息,常用语调试 |
INFO | 20 | 程序正常运行中生产的一些信息 |
WARNING | 30 | 警告用户,虽然程序正常运行,可能发生的错误 |
ERROR | 40 | 由于更严重的问题,程序不能执行的功能 |
CRITICAL | 50 | 严重错误,程序不能正常运行 |
6.方法
方法 | 作用 |
---|---|
logging.warning() | 虽然有警告用户的信息,但是程序不报错,继续运行 |
这种方式可以记录下日志,但是不会指出那个文件报的错
方法 | 作用 |
---|---|
logger = logging.getLogger(__ name __) | 将logger指定为当前文件 |
logger.warning(data) | 将spider传入的data打印出来 |