像烧瓶一样的网络爬行框架。
requests_spider的Python项目详细描述
<img src="./spider.png">
</div>
## 描述
requests_spider 是一个轻量级的异步爬虫框架,基于requests_html进行二次开发,类似flask
## 安装
pip install requests_spider
## 依赖
python: > 3.6
uvloop
包含(@class,"odd")]/td[2]',first=false)
port=xfield(rule='//tr[contains(@class,"odd")]/td[3]',first=false)
async def process(self,response:response):
with open('proxy1.txt',"a+")作为文件:
用于self.merge()中的结果:
file.write(json.dumps(result)+'\n')
spider=spider('proxy',workers=15)
spider.domains=['www.xicidaili.com']
spider.init_requests=[
请求(url='http://www.xicidaili.com/nn/{}'。范围(1,
spider.async-asc-spider.async-asc-limit=5
if-if-upu-name'u-main'buu-main'
spider.run
/>``` python3
从spider导入random
import re
字段,异步
mid={mid}"\
"&pagesize=30&tid=0&page={page}&keyword=&order=pubdate"
HTML5=1"
mid
av戋url="https://www.bilibili.com/video/av{aid}"
av类(模型):
url=rfield(规则='"url":"(*?),"backup_url"',first=false)
cid=rfield(规则='cid=(*?)&;aid=')
aid=rfield(规则='&aid=(*?)&;pre_ad=')
mid=rfield(规则='"所有者":{"mid":(.*?),')
异步定义进程(self,响应:响应):
打印(self['url'])
打印(self['cid'])
打印(self['aid'])
打印(self['mid'])
如果self['mid']和self['aid']和self['url']和self['cid']:
#推荐视
屈服请求(url=recomment搐url.format(cid=self['cid',aid=self['aid',model=recomment)
model=userinfo,not_filter=true)
meta={'name':self['aid']+''\str(order)},模型=视频)
类用户信息(模型):
mid=field()
name=field()
sex=field()
rank=field()
face=field()
regtime=field()
birthday=field()
sign=field()
level\info=field()
async def过程(自我,响应:响应:
status=response.json().get('status')
if status:
data=response.json().get('data')
for k in self.keys():
if k in data:
self[k]=data[k]
with open('user\+str(self['mid'])+'.txt','w')作为f:
f.write(self.dumps()+'\n')
类建议(模型):
异步定义进程(self,响应:响应):
对于响应中的数据。json():
屈服请求(av url.format(aid=data[1]),model=av)
class videoinfo(model):
async def process(self,response:response):
status=response.json().get('status')
如果状态:
data=response.json().get('data')
pattern='mid=(\d+?)&页面大小=30&tid=0&page=(\d+?)&;keyword=&;order=pubdate'
patn=re.findall(pattern,response.url)[0]
print(patn)
yield request(url=视频url.format(mid=patn[0],page=int(patn[1])+1,model=videoinfo),
对于v in data['vlist']:
屈服请求(url=av_url.format(aid=v.get('aid'),model=av)
class video(model):
async def process(self,响应:响应:
file_name=response.current_request.meta.get('name')
如果file_name and response.status_code==200:
打开(file_name+'.mp4','wb')作为f:
对于响应中的内容。iter_content(chunk_size=512):
f.写入(内容)
f.flush()
spider=spider('bilibili',workers=5)
]
spider.async_limit=5
@spider.middleware('request')
async def test(request):
print(request.url)
if request.url.startswith('https://space.bilibili.com/'):
request.info.update({headers':{referer':'https://space.bilibili.com/'})
否则:
request.info.update({headers':{referer':'https://bilibili.com/'})
asyncio.sleep(round(random.random()*5))
return request
spider.run()
```
爬取bilibili用户视频,用户资料,视频资料,利用中间组件进行切换headers
## API
#### Spider
继承requests_html的HTMLSession
- **Spider.async_limit**
利用asyncio.Semaphore限制并发数量
- 蜘蛛网排队超时
br/>
-**蜘蛛域**
-蜘蛛网规则**
响应,无
中间件('response'),响应,请求,响应,None
##### Model
Model类似一个字典的数据模型
- **Model.keys**
类似字典的keys
- **Model.values**
类似字典的values
- **Model.items**
类似字典的items
- **Model.json**
获取所有Field的字典形式
- **Model.dumps**
获取所有的Field的字符串
- **Model.merge**
当所有的Field从响应数据获取的数据是列表的时候,将获取的列表合并成为json数据
- **Model.process**
处理响应数据
##### Field
- **Field**
不处理或待处理数据项
- **XField**
利用xpath从响应数据中获取数据
- **CField**
利用css获取数据
- **RField**
请求用于Spider.rules
- **RRequest**
利用正则,用于Spider.rules
## 例子
examples目录下
bilibili.py 爬取哔哩哔哩用户信息、视频信息和视频
qidian.py 爬取起点小说月票排行包括评分
proxy.py IP许可证