1.修改方法
一 语法
里面有三个大的语句:一个是查询条件;一个是修改字段;一个是其他参数(目前就有两个)
db.table.update(
条件,
修改字段,
其他参数
)
update db1.t1 set id=10 where name="egon";#这是sql语句的更新使用
db.table.update(
{},#这是查询条件
{"age":11},
{
"multi":true,#这是删除查询到的所有数据
"upsert":true#这是如果找不到这个数据,就新插入
}
)
1、update db1.user set age=23,name="武大郎" where name="wupeiqi";
#覆盖式更新就是替换掉查询到的数据,只能替换掉一个查询数据
db.user.update(
{"name":"wupeiqi"},
{"age":23,"name":"武大郎"}
)
#局部修改:$set就是只更改这里面显示的字段。
db.user.update(
{"name":"alex"},
{"$set":{"age":73,"name":"潘金莲-alex"}}
)
#改多条
db.user.update(
{"_id":{"$gte":1,"$lte":2}},
{"$set":{"age":53,}},
{"multi":true}
)
#有则修改,无则添加
db.user.update(
{"name":"EGON"},
{"$set":{"name":"EGON","age":28,}},
{
"multi":true,
"upsert":true
}#这个就是参数
)
#修改嵌套文档
db.user.update(
{"name":"潘金莲-alex"},
{"$set":{"addr.country":"Japan"}}#如果需要查询到里面有嵌套的数据用.就可以查到。
)
#修改数组
db.user.update(
{"name":"潘金莲-alex"},
{"$set":{"hobbies.1":"Piao"}}#如果需要查询到里面有嵌套的数据用.就可以查到。
)
#删除字段
db.user.update(
{"name":"潘金莲-alex"},
{"$unset":{"hobbies":""}}#删除一个字段
)
2、$inc
db.user.update(
{},
{"$inc":{"age":1}},#增加用的,如果是正数就说明是增加,如果是负数,就是减少
{"multi":true}
)
db.user.update(
{},
{"$inc":{"age":-10}},
{"multi":true}
)
3、$push, $pop $pull#对某个字段的添加或删除
db.user.update(
{"name":"yuanhao"},
{"$push":{"hobbies":"tangtou"}},#对某一个字段是数组添加一个值
{"multi":true}
)
db.user.update(
{"name":"yuanhao"},
{"$push":{"hobbies":{"$each":["纹身","抽烟"]}}},#对某一个字段是数组添加多个值别忘了用$each
{"multi":true}
)
#从头删-1,从尾删1
db.user.update(
{"name":"yuanhao"},
{"$pop":{"hobbies":-1}},#从开始删除
{"multi":true}
)
db.user.update(
{"name":"yuanhao"},
{"$pop":{"hobbies":1}},#从后面删除
{"multi":true}
)
#按条件删
db.user.update(
{"name":"yuanhao"},
{"$pull":{"hobbies":"纹身"}},#"$pull" 把符合条件的统统删掉,而$pop只能从两端删
{"multi":true}
)
#3、$addToSet#添加数据,不重复添加
db.t3.insert({"urls":[]})
db.t3.update(
{},
{"$addToSet":{"urls":{"$each":[
"http://www.baidu.com",
"http://www.baidu.com",
"http://www.baidu.com",
"http://www.baidu.com",
"http://www.baidu.com"
]}}},
{"multi":true}
)
View Code
2.删除方法
db.user.deleteOne({"_id":{"$gte":3}})#在这种方法可以删除查询到的一个
db.user.deleteMany({"_id":{"$gte":3}})#这种方法可以删除查询到的所有值
db.user.deleteMany({})#删除所有的的数据
View Code
3.聚合方法
View Code
4.使用pymongo模块连接数据库
View Code
爬虫提高方法的使用:
1.同步调用
import requests
#同步或者异步是指提交数据的方式
#同步是值原地等待提交任务返回结果
#异步是指一个任务提交完了,直接提交下一个任务。
def parse_page(res):
print('PARSE %s' %(len(res)))
def get_page(url):
print('GET %s' %url)
response=requests.get(url)
if response.status_code == 200:
return response.text
if __name__ == '__main__':
urls=[
'https://www.baidu.com',
'https://www.taobao.com',
'https://www.openstack.org',
]
for url in urls:
res=get_page(url)
parse_page(res)
View Code
2.多线程与多进程
View Code
3.线程池与进程池
import requests
from threading import current_thread#这个是打印出来现在是哪个线程。
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
def parse_page(res):
res=res.result()
print('%s PARSE %s' %(current_thread().getName(),len(res)))
def get_page(url):
print('%s GET %s' %(current_thread().getName(),url))
response=requests.get(url)
if response.status_code == 200:
return response.text#返回的是字符串。
if __name__ == '__main__':
urls=[
'https://www.baidu.com',
'https://www.taobao.com',
'https://www.openstack.org',
]
pool=ThreadPoolExecutor(50)#线程池
for url in urls:
pool.submit(get_page,url).add_done_callback(parse_page)
pool.shutdown(wait=True)#这个是不在往里面放任务。
View Code
4.协程
from gevent import joinall,spawn,monkey;monkey.patch_all()#协程
import requests
from threading import current_thread
def parse_page(res):
print('%s PARSE %s' %(current_thread().getName(),len(res)))
def get_page(url,callback=parse_page):
print('%s GET %s' %(current_thread().getName(),url))
response=requests.get(url)
if response.status_code == 200:
callback(response.text)
if __name__ == '__main__':
urls=[
'https://www.baidu.com',
'https://www.taobao.com',
'https://www.openstack.org',
]
tasks=[]
for url in urls:
tasks.append(spawn(get_page,url))
joinall(tasks)
View Code
5.使用asyncio
import requests
import asyncio
import uuid
User_Agent='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
def parse_page(res):
with open('%s.html' %uuid.uuid1(),'wb') as f:
f.write(res)
@asyncio.coroutine
def get_page(host,port=80,url='/',ssl=False,callback=parse_page):
#1、建立连接
if ssl:
port=443
print('下载:https:%s:%s:%s' %(host,port,url))
recv,send=yield from asyncio.open_connection(host=host,port=port,ssl=ssl)
#2、封装请求头
request_headers="""GET %s HTTP/1.0\r\nHost: %s\r\nUser-Agent: %s\r\n\r\n""" %(url,host,User_Agent)
request_headers=request_headers.encode('utf-8') # socket发送的是bytes类型转成字节形式
#3、发送请求头
send.write(request_headers)
yield from send.drain() #这是发送
#4、接收响应头
while True:
line=yield from recv.readline()
if line == b'\r\n':
break
print('%s 响应头: %s' %(host,line))
#5、接收响应体
text=yield from recv.read()
# print(text)
#6、执行回调函数完成解析
callback(text)
#7、关闭
send.close()
if __name__ == '__main__':
tasks=[
get_page(host='www.baidu.com',url='/s?wd=美女',ssl=True),
get_page(host='www.cnblogs.com',url='/linhaifeng/articles/7806303.html',ssl=True)
]
loop=asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
View Code