爬虫4

mongodb:非关系型数据、在硬盘上

数据库操作:
    -创建
        -use 数据库名字 (有则进入,无则创建,如果没有数据,show dbs是看不到的)
    -删除
        -use config #先切换到要删的库下
        -db.dropDatabase() #删除当前库

集合操作(表操作)
    -创建
        -在表中插入一条数据,就自动创建了
            -db在哪个库中,db就是谁
            -db.table1.insert({"name":"lqz","age":18})# k可写可不写引号!
            -db.table1.insert({"name":"lqz","age":18,"sex":"男"})
        -show dbs  这个数据库就能看到了# 可以不省略写为show databases
        -show tables 这个表就能看到了
    -删除
        -db.table2.drop()

数据行,文档操作
    -新增
        -db.table1.insert({"name":"lqz","age":18})
        -先定义出一个对象(字典),db.table1.insert(字典名)
        -插入多条
            -db.table1.insertMany([user1,user2,user3,user4,user5])# 每一个user都是在上方定义好的,现在没写
    -查询
        注意,自动生成的id是objectid包括4个部分组成,并不是简单的数字1,2,3
        db.table1.find()
        -1、select * from db1.user where name = "egon";
            db.table1.find({name:"egon"})
        -select * from db1.user where name != "alex";
            db.table1.find({name:{"$ne":"egon"}})
        -不等于,大于,小于,大于等于,小于等于
            -$ne  $gt   $lt   $gte      $lte
        -db.table1.find({"_id":{"$gte":2,}})
        -db.table1.find({'_id':{"$mod":[2,1]}})
        db.table.find({'_id':{"$not":{"$mod":[2,1]}}})
        -db.table1.find({"age":{"$in":[20,30,31]}})
        -db.table.find({'name':/^j.*?(g|n)$/i})
        -db.table.find({'_id':3},{'_id':0,'name':0,'age':1})
        -db.table1.find({"hobbies.3":'tea'})
        -db.table1.find({"hobbies.0":'music'})
        -db.table1.find({},{'hobbies':{"$slice":-2},"age":1,"_id":0,"name":0,"addr":0})

        -db.table1.find({},{'hobbies':{"$slice":-2}})
    -db.table1.find({},{'hobbies':{"$slice":[1,2]},})
        -db.user.find().sort({"_id":1,})
        -db.user.find().sort({'_id':1}).limit(2).skip(4)
        -db.table1.find({'age':{"$gt":30}}).count()
        12   34  45

修改
    -db.user.update({'age':20},{"name":"Wxx","hobbies_count":3})  覆盖式的
    -db.table1.update({'_id':2},{"$set":{"name":"WXX",}})   不覆盖
    -db.table1.update({'_id':6},{"$set":{"name":"egon","age":18}},{"upsert":true})
    -db.table1.update({},
    {
        "$inc":{"age":-5}
    },
    {
        "multi":true
    }
    )


    select avg(salary) as avg_salary,post from db1.emp where id > 3 group by post having avg_salary > 10000;
'''

用python操作mongodb

#用python操作mongodb
from pymongo import MongoClient

#1、链接
# client=MongoClient('mongodb://root:123@localhost:27017/')
client = MongoClient('localhost', 27017)

#2、use 数据库
db=client['db2'] #等同于:client.db1
# db=client.test

#3、查看库下所有的集合
# print(db.collection_names(include_system_collections=False))#4、创建集合
# table_user=db['table1'] #等同于:db.user
table_user=db.table1
# # #5、插入文档
# import datetime
# user0={
#     "_id":1,
#     "name":"egon",
#     "birth":datetime.datetime.now(),
#     "age":10,
#     'hobbies':['music','read','dancing'],
#     'addr':{
#         'country':'China',
#         'city':'BJ'
#     }
# }

# user1={
#     "_id":2,
#     "name":"alex",
#     "birth":datetime.datetime.now(),
#     "age":10,
#     'hobbies':['music','read','dancing'],
#     'addr':{
#         'country':'China',
#         'city':'weifang'
#     }
# }
# res=table_user.insert_many([user0,user1])
# res=table_user.insert_many
# print(res)
# print(table_user.count())

#6、查找

from pprint import pprint#格式化细
# pprint(table_user.find_one())
# for item in table_user.find():
#     pprint(item)

# print(table_user.find_one({"_id":{"$gte":1},"name":'egon'}))
# table_user.find()

#7、更新.注意上下两个的区别!
# table_user.update({'_id':1},{'name':'EGON'})

#8、传入新的文档替换旧的文档
table_user.save(
    {
        "_id":2,
        "name":'egon_xxx'
    }
)

scrapy

-scrapy
	-安装
		-pip3 install scrapy
			-先装Twisted
			-装pywin32
	-新建项目
		-scrapy startproject 项目名字
	-新建爬虫
		-scrapy genspider 爬虫名 爬取的域名
	-项目目录介绍
		-spiders
			-所有的爬虫程序
		-items.py
			-类似于django的model类
		-middlewares.py
			-中间件
		-pipelines.py
			-持久化相关
		-settings.py
			-配置文件
		-scrapy.cfg
			-部署相关
	-运行爬虫
		-scrapy crawl cnblogs --nolog(--nolog不打印日志。settings中的robotstxt=False代表不遵守爬虫协议)
		
	-爬取数据
	
	//*[@id="post_list"]/div[1]页面下右键复制
运行爬虫:

注意:两点

代码:
scrapy crawl cnblogs --nolog

robotstxt=False  # settings中的robotstxt=False代表不遵守爬虫协议)
右键启动(更目录下新建main.py文件)
from scrapy.cmdline import execute
# execute(['scrapy', 'crawl', 'cnblogs','--nolog'])
execute(['scrapy', 'crawl', 'cnblogs'])

# 注意一定要打印日志,因为他是异步任务,如果程序出错,通过try是不能捕捉的(只能捕捉当前线程)
scrapy内置的数据查找(****)
div_list=response.css('.post_item')  #取出class为post_item的所有


# 获取a标签的href属性:a::attr(href)
next_url=response.css('.pager a:last-child::attr(href)').extract_first()
# 获取列表的第一个
url=div.css('.post_item_body a::attr(href)').extract_first()
获取页面的xpath方法:
右键复制即可!,直接可以粘贴过来使用

image-20191128191944603

遇到一个小小的问题:

放css查找代码书写正确,但是部分链接的图片没拿到,可能是网页又刷新了,而我浏览器的网页没有跟进!!!坑点!!

image-20191128204006404

原文地址:https://www.cnblogs.com/ZDQ1/p/11954042.html