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

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测试访问令牌过滤器   close()上的java Apache POI运行时异常   java为什么Eclipse中的GWT总是显示错误404?   java从socket python服务器接收消息   java mediaRecorder:start()函数失败   不关闭DB连接可能是Tomcat上Java堆溢出的原因吗?   java JFrame无法关闭   java BigQuery加载本地文件不起作用,位置有问题   java可以在递归任务中使用吗?   servlets如何从JSESSIONID加载Java HttpSession?   java将JFileChooser与PDFBox一起使用时,文件不会另存为pdf,但保存时不带扩展名   java将处理结果存储在表中   java算法发现循环世界中重叠间隔的持续时间(24小时)   在windows 10上双击Eclipse安装程序可执行文件(eclipseinstjrewin64.exe)后,java不会发生任何事情   java编译和部署自定义Solr请求处理程序   Java/Android崩溃ApacheCommonsio2。4.jar   spring web应用程序中的java集成收件箱功能   java Grizzly、Jersey和Spring自动布线问题   java如何在pom中添加jar文件依赖项。xml   关于Android中大量GUI更新编码的java概念(GUI处理程序)