返回顶部
首页 > 资讯 > 后端开发 > Python >爬虫——实战完整版
  • 548
分享到

爬虫——实战完整版

爬虫完整版实战 2023-01-30 22:01:05 548人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

1 import pymonGo 2 3 #连接数据库实例(连接数据库)---》获取相应数据库---》获取相应collection集合(表) 4 client = pymongo.MongoClient(host='loca

 1 import pymonGo
 2 
 3 #连接数据库实例(连接数据库)---》获取相应数据库---》获取相应collection集合(表)
 4 client = pymongo.MongoClient(host='localhost',port=27017)
 5 
 6 db = client.test        #也可用字典形式操作,如下
 7 # db = client["test"]
 8 
 9 collection  = db.students  #也可用字典形式操作,如下
10 # collection = db["students"]
11 
12 student1 = {
13     'id':'001',
14     'name':'haha',
15     'age':20,
16     'gender':'male'
17 }
18 student2 = {
19     'id': '002',
20     'name': 'Mike',
21     'age': 41,
22     'gender': 'male'
23 }
24 #--------------------------------------------------------------------------
25         #插入 insert into students(...) values('002',...)
26         #若不指定 _id 字段,系统默认会生成一个ObjectId
27         #可插入一条或多条数据(列表形式),python3不推荐使用insert
28 # collection.insert([student1,student2])
29 # collection.insert(student1)
30 
31         #官方推荐,分开使用,返回值不是ObjectId,而是InsertOneResult对象,我们可以调用其inserted_id属性获取_id。
32 # result = collection.insert_one(student2)
33 # print(result)
34 # print(result.inserted_id)
35 
36 # result = collection.insert_many([student1,student2])
37 # print(result)
38 # print(result.inserted_ids)
39 
40 #------------------------------------------------------------------
41         #查询 select * from students where id=002
42         #查询条件使用字典,可使用多字段,find是多条查询
43 # result_find = collection.find({"name":"lijingbo","age":20})
44 # print(result_find.next())   #返回一个游标,游标相当于迭代器,可使用next()获取一条结果,或者使用循环遍历等,遍历结果是字典
45         #find_one:单个查询,返回字典类型
46 # result = collection.find_one({'age':20})
47 # print(result,type(result))
48         #结合关系符进行查询:$gt,$lt,$gte,$lte,$ne,$in,$nin
49 # result = collection.find({'age':{'$gt':18}})
50 # result = collection.find({'age':{'$in':[18,41]}})
51         #结合特殊符号查询:$regex
52 # result = collection.find({'name':{'$regex':'^M.*'}})  #正则
53 # result = collection.find({'name':{'$exists':True}})     #查询含有name属性的
54 # result = collection.find({'age':{'$mod':[5,0]}})        #求模,对5取余=0
55 # result = collection.find({'$where':'obj.age==20'})       #查询age为20的,obj是自身
56 # result = collection.find({'age':20}).count()                #统计
57 # result = collection.find().sort('age',pymongo.ASCENDING)      #按照指定字段升序排列
58 # result = collection.find().sort('age',pymongo.DESCENDING)     #按照指定字段升序排列
59 # result = collection.find().sort('age',pymongo.DESCENDING).skip(2)     #按照指定字段升序排列,偏移2个(就是把最前面两个跳过去了)
60 # result = collection.find().sort('age',pymongo.DESCENDING).skip(2).limit(5)    #限制得到5
61 # print(result)
62 # for r in result:
63 #     print(r['name'],r['age'])
64 
65 #----------------------------------------------------------
66         #更新 update students set name=haha where id=001
67         #参数1:查询条件(字典);参数2:更新值(字典,键:'$set',值:字典【也可直接使用外部字典】)
68         #其他:upsert默认为False,为True时——若更新的原数据不存在,则插入数据
69                 #multi——默认为False只更新查询到的第一条数据,为True时:更新全部查询到的数据
70         # $set:是mongoDB内置函数,覆盖原始数据
71 # collection.update({"id":"001"},{'$set':{'age':34}},upsert=True,multi=True)
72 # print(collection.find().next())
73         #上面的官方也不推荐,可以使用下面的
74 # result = collection.update_one({'name':'haha'},{'$set':{'age':18}})
75 # result = collection.update_many({'name':'haha'},{'$set':{'age':18}})
76 # print(result)   #只修改一条数据,若该数据不修改就和修改条件一样了,那有可能修改数为0
77 # print(result.matched_count,result.modified_count)
78 
79 
80 #-----------------------------------------------------
81         #删除,remove方法官方不推荐
82 # collection.remove({"id":"001"},justOne=1)
83 # result = collection.delete_one({'name':'Mike'})
84 # result = collection.delete_many({'name':'Mike'})
85 # print(result)
86 # print(result.deleted_count)
87 
88 #---------------------------------------------------
89         #组合方法
90 # result = collection.find_one_and_delete({'name':'haha'})
91 # result = collection.find_one_and_update({'name':'haha'},{'$set':{'age':45}})
92 # result = collection.find_one_and_replace({'name':'haha'})
93 # print(result)

 

将数据以字典的特性存储缓存到mongodb数据库

导入类库

import pickle,zlib  #对象序列化    压缩数据
from datetime import datetime,timedelta     #设置缓存超时间间隔
from pymongo import MongoClient
from bson.binary import Binary      #MongoDB存储二进制的类型

创建MongoCache类

  • 初始化init
    • 连接mongodb数据库
    • 连接数据库cache实例(没有则创建)
    • 连接集合WEBpage(没有则创建)
    • 创建timestamp索引,设置超时时间为30天
  • 重写__setitem__
    • 数据经过pickle序列化
    • zlib压缩
    • 经Binary转化为mongodb需要的格式
    • 添加格林威治时间
    • 网址为键_id,结果为值,存入mongodb

使用下载的url(路由)作为key,存入系统默认的_id字段,更新数据库,若存在则更新,不存在则插入,_id唯一就可实现爬取的数据去重

用字典的形式向数据库添加一条缓存(数据)

  • 重写__getitem__

    • 将缓存数据按照item作为key取出(key仍然是下载的url)
    • 根据_id(url)查找(find_one)结果
    • 解压缩,反序列化
  • 重写__contains__

    • 当调用in,not in ,会自动调用该方法判断链接对应网址是否在数据库中
    • 可通过字典的查找方式__getitem__直接查找(self[item])
    • 该函数返回布尔值
  • 方法clear

    • 清空该集合中的数据
       1 import pickle,zlib  #对象序列化    压缩数据
       2 from datetime import datetime,timedelta     #设置缓存超时间间隔
       3 from pymongo import MongoClient
       4 from bson.binary import Binary      #MongoDB存储二进制的类型
       5 from Http_ljb.tiebaspider import TiebaSpider
       6 from http_ljb.qiushispider import QiushiSpider
       7 
       8 class MongoCache:
       9     def __init__(self,client=None,expires=timedelta(days=30)):
      10         '''
      11         初始化函数
      12         :param client: 数据库连接(数据库实例)
      13         :param expires: 超时时间
      14         '''
      15         self.client = MongoClient('localhost',27017)
      16         self.db = self.client.cache     #创建名为cache的数据库
      17         web_page = self.db.webpage      #创建集合webpage并赋值给变量
      18         #创建timestamp索引,设置超时时间为30天,total_seconds会将days转为秒
      19         self.db.webpage.create_index('timestamp',expireAfterSeconds=expires.total_seconds())
      20 
      21     def __setitem__(self, key, value):
      22         '''
      23         用字典的形式向数据库添加一条缓存(数据)
      24         :param key: 缓存的键
      25         :param value: 缓存的值
      26         :return:
      27         '''
      28         #数据---》pickle序列化---》zlib压缩---》Binary转化为mondodb需要的格式,使用格林威治时间
      29         record = {'result':Binary(zlib.compress(pickle.dumps(value))),'timestamp':datetime.utcnow()}
      30         #使用下载的url(路由)作为key,存入系统默认的_id字段,更新数据库,若存在则更新,不存在则插入,_id唯一就可实现爬取的数据去重
      31         self.db.webpage.update({'_id':key},{'$set':record},upsert=True)
      32 
      33     def __getitem__(self, item):
      34         '''
      35         将缓存数据按照item作为key取出(key仍然是下载的url)
      36         :param item:键
      37         :return:
      38         '''
      39         record = self.db.webpage.find_one({'_id':item}) #查找出来就不是Binary了,不用进行转化
      40         if record:
      41             return pickle.loads(zlib.decompress(record['result'])) #解压缩,反序列化
      42         else:
      43             raise KeyError(item + 'does not exist')     #查询不到就抛出键错误异常
      44 
      45     def __contains__(self, item):
      46         '''
      47         当调用in,not in ,会自动调用该方法判断链接对应网址是否在数据库中
      48         :param item: 下载的url链接(路由)
      49         :return:
      50         '''
      51         try:
      52             self[item]      #这一步会调用__getitem__,找不到__getitem__会抛出异常,在这里进行捕获异常只返回False,否则返回True
      53         except KeyError:
      54             return False
      55         else:
      56             return True
      57 
      58     def clear(self):
      59         '''
      60         清空该集合中的数据
      61         :return:
      62         '''
      63         self.db.webpage.drop()

       

调用贴吧爬取代码和百科爬取代码,使用mongodb存储爬取数据

 

  • 导入爬取类
  • 创建新类并继承自爬取类
  • 重写保存方法
    • 创建MongoCache对象
    • 网址为键,数据为值,以字典形式存入mongodb
  • 重写run方法
    • 在保存时,需多传一个网址参数(为了在保存方法中对应保存)
        1 import pickle,zlib  #对象序列化    压缩数据
        2 from datetime import datetime,timedelta     #设置缓存超时间间隔
        3 from pymongo import MongoClient
        4 from bson.binary import Binary      #MongoDB存储二进制的类型
        5 from http_ljb.tiebaspider import TiebaSpider
        6 from http_ljb.qiushispider import QiushiSpider
        7 
        8 class MongoCache:
        9     def __init__(self,client=None,expires=timedelta(days=30)):
       10         '''
       11         初始化函数
       12         :param client: 数据库连接(数据库实例)
       13         :param expires: 超时时间
       14         '''
       15         self.client = MongoClient('localhost',27017)
       16         self.db = self.client.cache     #创建名为cache的数据库
       17         web_page = self.db.webpage      #创建集合webpage并赋值给变量
       18         #创建timestamp索引,设置超时时间为30天,total_seconds会将days转为秒
       19         self.db.webpage.create_index('timestamp',expireAfterSeconds=expires.total_seconds())
       20 
       21     def __setitem__(self, key, value):
       22         '''
       23         用字典的形式向数据库添加一条缓存(数据)
       24         :param key: 缓存的键
       25         :param value: 缓存的值
       26         :return:
       27         '''
       28         #数据---》pickle序列化---》zlib压缩---》Binary转化为mondodb需要的格式,使用格林威治时间
       29         record = {'result':Binary(zlib.compress(pickle.dumps(value))),'timestamp':datetime.utcnow()}
       30         #使用下载的url(路由)作为key,存入系统默认的_id字段,更新数据库,若存在则更新,不存在则插入,_id唯一就可实现爬取的数据去重
       31         self.db.webpage.update({'_id':key},{'$set':record},upsert=True)
       32 
       33     def __getitem__(self, item):
       34         '''
       35         将缓存数据按照item作为key取出(key仍然是下载的url)
       36         :param item:键
       37         :return:
       38         '''
       39         record = self.db.webpage.find_one({'_id':item}) #查找出来就不是Binary了,不用进行转化
       40         if record:
       41             return pickle.loads(zlib.decompress(record['result'])) #解压缩,反序列化
       42         else:
       43             raise KeyError(item + 'does not exist')     #查询不到就抛出键错误异常
       44 
       45     def __contains__(self, item):
       46         '''
       47         当调用in,not in ,会自动调用该方法判断链接对应网址是否在数据库中
       48         :param item: 下载的url链接(路由)
       49         :return:
       50         '''
       51         try:
       52             self[item]      #这一步会调用__getitem__,找不到__getitem__会抛出异常,在这里进行捕获异常只返回False,否则返回True
       53         except KeyError:
       54             return False
       55         else:
       56             return True
       57 
       58     def clear(self):
       59         '''
       60         清空该集合中的数据
       61         :return:
       62         '''
       63         self.db.webpage.drop()
       64 
       65 class TiebaMongo(TiebaSpider):
       66     def save_result(self, result,url_str):
       67         """
       68         重写父类的该方法,将数据保存到数据库
       69         :param result:
       70         :param url_str:
       71         :return:
       72         """
       73         mc = MongoCache()
       74         mc[url_str] = result
       75 
       76     def run(self):
       77         url_lists = self.make_url()
       78         for url_str in url_lists:
       79             result_str = self.download_url(url_str)
       80             self.save_result(result=result_str,url_str=url_str)
       81 
       82 # class QiushiMongo(QiushiSpider):
       83 #     def save_result(self, result,url_str):
       84 #         mc = MongoCache()
       85 #         mc[url_str] = result
       86 #
       87 #     def run(self):
       88 #         url_lists = self.make_url()
       89 #         for url_str in url_lists:
       90 #             result_str = self.download_url(url_str)
       91 #             self.save_result(result=result_str,url_str=url_str)
       92 
       93 # if __name__ == '__main__':
       94         #爬取贴吧并存到MongoDB
       95     # test = TiebaMongo('lol')
       96     # test.run()
       97         #爬取糗事并存到MongoDB
       98     # qiushi = QiushiMongo()
       99     # qiushi.run()
      100         #查询MongoDB
      101     # mc = MongoCache()
      102     # print(mc['https://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=2'])
      103     # print('https://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=3' in mc)
      104     # cha = MongoCache()
      105     # print(cha[test.url_base])
      106     # print(mc["https://www.qiushibaike.com/8hr/page/2/"])

       

 

--结束END--

本文标题: 爬虫——实战完整版

本文链接: https://lsjlt.com/news/179720.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 爬虫——实战完整版
    1 import pymongo 2 3 #连接数据库实例(连接数据库)---》获取相应数据库---》获取相应collection集合(表) 4 client = pymongo.MongoClient(host='loca...
    99+
    2023-01-30
    爬虫 完整版 实战
  • Nodejs实现定时爬虫的完整实例
    目录事件起因使用 Node Schedule 实现定时任务一、安装 node-schedule二、基本用法三、高级用法四、终止任务总结事件起因 前两天要帮朋友B站舰长群审核,一个个...
    99+
    2024-04-02
  • python-爬虫实战
    想看看最近的电影院播放的今日影视,就以这个网址https://movie.douban.com/people/1166776/为例,先使用urllib.request模块抓取整个网页,再使用re模块获取影视信息 编写simpleCrawle...
    99+
    2023-01-30
    爬虫 实战 python
  • Python3网络爬虫实战-10、爬虫框
    我们直接用 Requests、Selenium 等库写爬虫,如果爬取量不是太大,速度要求不高,是完全可以满足需求的。但是写多了会发现其内部许多代码和组件是可以复用的,如果我们把这些组件抽离出来,将各个功能模块化,就慢慢会形成一个框架雏形,久...
    99+
    2023-01-31
    爬虫 实战 网络
  • Python3网络爬虫实战-17、爬虫基
    爬虫,即网络爬虫,我们可以把互联网就比作一张大网,而爬虫便是在网上爬行的蜘蛛,我们可以把网的节点比做一个个网页,爬虫爬到这就相当于访问了该页面获取了其信息,节点间的连线可以比做网页与网页之间的链接关系,这样蜘蛛通过一个节点后可以顺着节点连线...
    99+
    2023-01-31
    爬虫 实战 网络
  • Python3网络爬虫实战-11、爬虫框
    ScrapySplash 是一个 Scrapy 中支持 JavaScript 渲染的工具,本节来介绍一下它的安装方式。ScrapySplash 的安装分为两部分,一个是是 Splash 服务的安装,安装方式是通过 Docker,安装之后会...
    99+
    2023-01-31
    爬虫 实战 网络
  • Python3网络爬虫实战-15、爬虫基
    在写爬虫之前,还是需要了解一些爬虫的基础知识,如 HTTP 原理、网页的基础知识、爬虫的基本原理、Cookies 基本原理等。 那么本章内容就对一些在做爬虫之前所需要的基础知识做一些简单的总结。 在本节我们会详细了解 HTTP 的基本原理...
    99+
    2023-01-31
    爬虫 实战 网络
  • 爬虫---scrapy爬虫框架(详细+实战)
    ​ 活动地址:CSDN21天学习挑战赛 爬虫---scrapy爬虫框架 爬虫---scrapy爬虫框架一、简介1、基本功能2、架构3、scrapy项目的结构 二、scrapy环境搭...
    99+
    2023-10-27
    爬虫 scrapy 数据挖掘 python
  • python网络爬虫实战
    目录一、概述二、原理三、爬虫分类1、传统爬虫2、聚焦爬虫3、通用网络爬虫(全网爬虫)四、网页抓取策略1、宽度优先搜索:2、深度优先搜索:3、最佳优先搜索:4、反向链接数策略:5、Pa...
    99+
    2024-04-02
  • Python爬虫完整代码拿走不谢
    对于新手做Python爬虫来说是有点难处的,前期练习的时候可以直接套用模板,这样省时省力还很方便。 使用Python爬取某网站的相关数据,并保存到同目录下Excel。 直接上代码: import re...
    99+
    2023-09-03
    python 爬虫 开发语言 爬虫入门 爬虫基础
  • Python3网络爬虫实战-6、APP爬
    除了 Web 网页,爬虫也可以对 APP 的数据进行抓取,APP 中的页面要加载出来,首先需要获取数据,那么这些数据一般是通过请求服务器的接口来获取的,由于 APP 端没有像浏览器一样的开发者工具直接比较直观地看到后台的请求,所以对 APP...
    99+
    2023-01-31
    爬虫 实战 网络
  • Python3网络爬虫实战-9、APP爬
    Appium 是移动端的自动化测试工具,类似于前面所说的 Selenium,利用它我们可以驱动 Android、iOS 等设备完成自动化测试,比如模拟点击、滑动、输入等操作,其官方网站为:http://appium.io/,本节来了解一下 ...
    99+
    2023-01-31
    爬虫 实战 网络
  • Python3网络爬虫实战-7、APP爬
    MitmProxy 是一个支持 HTTP 和 HTTPS 的抓包程序,类似 Fiddler、Charles 的功能,只不过它是一个控制台的形式操作。同时 MitmProxy 还有两个关联组件,一个是 MitmDump,它是 MitmProx...
    99+
    2023-01-31
    爬虫 实战 网络
  • Python3网络爬虫实战-8、APP爬
    MitmProxy 是一个支持 HTTP 和 HTTPS 的抓包程序,类似 Fiddler、Charles 的功能,只不过它是一个控制台的形式操作。同时 MitmProxy 还有两个关联组件,一个是 MitmDump,它是 MitmProx...
    99+
    2023-01-31
    爬虫 实战 网络
  • Python爬虫实战之爬取携程评论
    目录一、分析数据源二、分析数据包三、采集全部评论一、分析数据源 这里的数据源是指html网页?还是Aajx异步。对于爬虫初学者来说,可能不知道怎么判断,这里辰哥也手把手过一遍。 提示...
    99+
    2024-04-02
  • 【Python-爬虫实战01】top250获取
    文章目录 1. 导入库2. 发送HTTP请求获取页面内容3. 解析HTML内容4. 定位和提取电影信息5. 存储数据6. 反爬虫策略及应对方法完整代码及运行结果 网络爬虫是一种获...
    99+
    2023-09-20
    python 开发语言 爬虫
  • Python爬虫实战之xpath解析
    XPath 是一门在 XML 文档中查找信息的语言,最初是用来搜寻 XML 文档的,但是它同样适用于 HTML 文档的搜索。 所以在Python爬虫中,我们经常使用xpath解析这种高效便捷的方式来提...
    99+
    2023-09-23
    python 爬虫 开发语言
  • Python3网络爬虫实战-30、PyQ
    在上一节我们介绍了 BeautifulSoup 的使用,它是一个非常强大的网页解析库,可有没有觉得它的一些方法使用有点不适应?有没有觉得它的 CSS 选择器功能没有那么强大? 如果你对 Web 有所涉及,如果你比较喜欢用 CSS 选择器,如...
    99+
    2023-01-31
    爬虫 实战 网络
  • Python3网络爬虫实战-18、Ses
    在浏览网站的过程中我们经常会遇到需要登录的情况,有些页面只有登录之后我们才可以访问,而且登录之后可以连续访问很多次网站,但是有时候过一段时间就会需要重新登录。还有一些网站有时在我们打开浏览器的时候就自动登录了,而且很长的时间都不会失效,这种...
    99+
    2023-01-31
    爬虫 实战 网络
  • Python3网络爬虫实战-16、Web
    我们平时用浏览器访问网站的时候,一个个站点形形×××,页面也各不相同,但有没有想过它是为何才能呈现出这个样子的?那么本节我们就来了解一下网页的基本组成、结构、节点等内容。 网页可以分为三大部分,HTML、CSS、JavaScript,我们...
    99+
    2023-01-31
    爬虫 实战 网络
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作