像烧瓶一样的网络爬行框架。

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)

请求(url=videos_url.format(mid='35789774',page=1),model=videoinfo),
]
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许可证

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何调试Quarkus/SmallRye客户端请求   安卓找不到R.layout。主要活动中的主要活动。JAVA   java使复制的图像都独立旋转   java需要一双新眼睛来找出为什么我的四边形没有被着色   java记录方法调用,包括参数,以便在程序执行后可以执行这些参数   JavaSpringMVC+AngularJS向数据库添加多个条目   java删除具有重复字段值的entrySet对象   为什么我们无法解密使用ECB/PKCS1使用RSA加密在python中加密的java数据   并行处理java。util。同时发生的拒绝执行异常,等待终止   java/groovy使用指定的值从列表中收集元素   java在spring webproject中使用CSS和JS   在以下任何来源中都找不到java插件[id:'com.gradle.enterprise',版本:'3.2']   在java中知道时间是否已经过去的日期   java如何在JavaFX中为两个节点之间的2D曲线箭头设置动画   JAVAsql。SQLException:第1行“IdentitCAT”列的整数值“Guitare”不正确   如何获取使用数组删除的元素详细信息。使用couchbase Java SDK的asList(remove())?   ssl得到了JAVA例外:JAVA。安全spec.InvalidKeySpecException:未知的KeySpec类型   多线程Java扫描器输入在单独的线程中