爬虫笔记
正则表达式
字符的表示
.
任意一个字符,除了换行[a-f]
范围内的任意一个字符\w
字母、数字和下划线组成的任意的字符
量词(数量)表示
*
0或多个+
一个以上?
0或1个 (非贪婪){}
n个{n,}
至少n个{n,m}
n~m个
分组表示
()
普通分组,多个正则分组时,如果是search().groups()返回的是一个元组(?P<name> 字符+数量)
带有名称的分组,多个正则分组时,如果是search().groupdict()返回的是一个字典
import re
text = 'sad324sdf4342'
# 普通分组
result=re.search(r'(\d+)[a-z]+(\d+)',text).groups()
print(result) # ('324', '4342')
带别名分组
result=re.search(r'(?P<n1>\d+?)[a-z]+?(?P<n2>\d+)',text).groupdict()
print(result) # {'n1': '324', 'n2': '4342'}
python中的正则模块
- re.compile() 一次生成正则对象,可以多次匹配查询
- re.match(正则对象,字符串)
- re.search()
- re.findall()
- re.sub() 替换
- re.split()
import re
text = 'sad324sdf4342'
# 将所有数字替换成120
result=re.sub(r'\d+','120',text)
print(result) # sad120sdf120
#给定列表,每一个元组中包含字母和数字,要求字母和数字分开排序如:['abc12','abc9','abc10','ac8','ac12']
# 排序后的结果是:['abc9','abc10','abc12','ac8','ac12']
arr = ['abc12','abc9','abc10','ac8','ac12']
arr2=sorted(arr,key=lambda item:re.sub(r'\d+',
re.findall(r'\d+',item)[0].rjust(2,'0'),item))
print(arr2)
() 括号的用法
p1 =re.compile("From ((?:\d{1,2}/)+\d{2,4});?")
Xpath
多条件匹配
response.xpath('//div[@class="card-wrap" and @action-type="feed_list_item"]/@mid').getall()
匹配标签下页面显示的字符串,注意string(.)要单独在一个xpath表达式中
response('//div[@class="card-wrap"]').xpath('string(.)').get()
进程和线程
multiprocessing模块(进程)
- Process 进程类
- Queue 进程间通信的队列
- put(item,timeout)
- item = get(timeout)
threading 模块(线程)
- Thread线程类
- 线程间通信(访问对象)
- queue.Queue 线程队列
- 回调函数(主线程声明,子线程调用函数)
BS4数据解析
from bs4 import BeautifulSoup
# 生成bs4根节点对象
root = BeautifulSoup(html,'lxml')
# 查找节点
root.find('标签名',class_='',id_='') # 返回单节点Tag对象
root.find_all('标签名',class_='',id_='',limit=3) # 返回limit指定数量的tag对象列表
root.select('样式选择器')
# 比如: #id , .class , 标签名 , [属性] ,div ul间接子节点,或div > ul直接字节的
- 节点的属性
- 获取文本数据
- div.text/div.string/div.get_text()
- 获取属性
- div.get(‘属性名’)
- div[‘属性名’]
- div.attrs['属性名]
- div.attrs.get(‘属性名’)
- 获取子节点
- contents 获取所有文本子节点
- descendants获取所有子节点对象
- 获取文本数据
scrapy - spiderkeeper可视化部署
环境准备
pip install scrapy scrapyd scrapyd-client spiderkeeper
第一步,启动scrapyd
scrapyd
第二步,启动SpiderKeeper
spiderkeeper
spiderkeeper [options]
-h, --help 展示帮助信息并且退出
--host=HOST host, 默认:0.0.0.0
--port=PORT port, 默认:5000
--username=USERNAME 设置用户名 ,默认: admin
--password=PASSWORD 设置密码 ,默认: admin
--type=SERVER_TYPE 接受蜘蛛服务器类型, 默认: scrapyd
--server=SERVERS 爬虫服务器, 默认: ['http://localhost:6800']
--database-url=DATABASE_URL
SpiderKeeper 数据库,默认: sqlite:home/souche/SpiderKeeper.db
--no-auth 不进行验证
-v, --verbose 日志级别
scrapy 打包egg
使用 scrapyd-client 生成 egg 文件 (进入需要上传的scrapy项目目录)
scrapyd-deploy --build-egg output.egg
scrapy - gerapy 可视化部署
https://blog.csdn.net/lm_is_dc/article/details/81087215
环境
pip3 install gerapy
基本使用方法
Usage:
gerapy init [--folder=<folder>]
gerapy migrate
gerapy createsuperuser
gerapy runserver [<host:port>]
gerapy makemigrations