其实,我也想过,以不一样的key去微信搜索平台进行搜索,将返回的文章,存入到mongodb数据库不一样的collection中。而后,下次以该key去抓取文章的时候,要避免重复抓取,就能够去检索mongodb数据库,该key对应的collection。html
可是有一个问题就是,不一样的key进行搜索,好比:“如何追漂亮妹子”,”如何追漂亮女生”,这两个搜索的有重复的文章。用上面的方式,相同url下的文章会放入不一样的collection中。python
虽然,本着朴实的态度,不一样的key进行搜索获得的文件应该写入到不一样数据库中,以表示这个key的搜索结果。mongodb
可是,本着为我负责的态度,(我不想看重复的信息),不一样key下的文件,若是文章url存在重复,我也不会爬取。数据库
因此,当一我的问,以一个key进行搜索的时候,查询个人mongodb数据库,极可能是少于直接使用微信搜索平台时的返回结果。好比,他问的是“如何追漂亮妹子”,可是微信搜索平台返回的文章列表呢,有些可能已经在以前key为“如何追漂亮女生”时,我为之建的mango数据库和相应的存储文件中了。因此,爬虫的时候,我就不爬了。浏览器
因此,请记住这种状况。我写爬虫纯粹是为了兴趣和为了要到本身的数据,浏览大量的信息,而不是为了什么狗屁严谨。微信
首先,我设计的终极目标就是爬取生成的本地文件,还能展现原有网页的图片。单纯的urllib获取的网页都是静态数据,一方面,某些图片的src尚未加载,还存放在data-src中。好比,亲测微信搜索平台的某篇文章,在浏览器尚未向下翻的时候,图像的地址是写在data-src。这就是一种预加载机制,避免一开始就加载大量图片致使网页总体加载速度过慢。当浏览器向下滑动的时候,图片的src会被js操做改变,从而开始加载图片。因此src中开始出现图片的真实url地址。这也是我以前开发网站的经常使用作法。网络
能够看到,经过浏览器侧边栏滑动的话,已经加载的图片,src属性会等于data-src属性。可是,若是尚未加载的话,图片的src是放在data-src中。这就是一种预加载的技术。滑动的时候,再激活src。测试
其次,我想作的是,不管预加载与否,仍是浏览器是否滑动到图片对应的位置。微信搜索平台网页设计的一个便利之处就是在于,它的图片的真实url是写在data-src中的。这样的话,咱们就可以直接读取data-src中的img地址。网站
最后,我把data-src对应的网址的图片下载到本地的目录中,而后创建从图片url到本地目录中的图片文件的映射关系。而后在整个html生成之后。直接替换掉所有的src中的数据,从数据库中取出对应的文件目录,而后将本地文件的映射加载进入src中去。这样的话,就能够实现,爬虫下来的数据,也能查看到图片。同以前在网页中浏览的同样。(这特别相似于浏览器的右键另存为网页的时候回生成一个目录,专门放各类图片)。编码
打开之后,查看源代码:
定位到第一张图片的位置:
其src是:
咱们如今复制网页源代码到sublime中,造成一个新的html。
而后将图片保存为本地的aa.jpeg
接着修改sublime中的本地html中src的为:./aa.jpg
成功了!!!
可是有一个问题:
我直接在浏览器中查看网页源代码的时候,复制出来的:怎么找都找不到src这个属性。我刚刚是手动添加的src属性。
这是由于,浏览器中直接查看源码的方式,显示的是网页最初传回的源码。那个时候,尚未触发js操做,因此只有data-src属性。因此没有。可是你在浏览器中用右键检查定位的时候,页面已经刷新了。这是浏览器的问题。
咱们能够观察用urllib获取的网页数据。看看src属性的状况。
实验验证:真正urllib爬取的也是没有src的,也是data-src。这就是静态网页的弊端。不过,这是微信搜索平台的独有特色。先加载的都是src。
weixin_article数据库
n 第一个collection:用于保存爬取网页中要加载的图片。
picture_urlMd5_filepath
包括
{
picture_url:
urlMd5:
filepath:
Count:
}
Count主要是为了记录该图片网址被爬取的次数。避免重复爬取。
其中urlMd5能够设置为惟一索引。可是我不打算显示设置惟一索引。而是在执行插入操做的时候,进行判断。若是已经有了,则不执行插入操做,count计数加1。若是没有,再执行插入操做。
n 第二个collection:用于保存爬取的网页数据
article_urlMd5_filepath
{
article_url:
title:
urlMd5:
filepath:
count:
}
一样,不显示设置urlMd5.可是又要保证urlMd5的惟一性。
数据库接口类
# coding: utf-8 from pymongo import MongoClient class MongodbClient_weixin_article(object): def __init__(self, name, host, port): self.name = name #初始化数据表名,也就是collection的名称 self.client = MongoClient(host, port) self.db = self.client.weixin_article#使用weixin_article数据库 def changeTable(self, name): self.name = name def get(self, urlMd5): data = self.db[self.name].find_one({"urlMd5":urlMd5}) return data if data != None else None def put_picture(self,picture_url,urlMd5,filepath): #urlMd5是一个主键,我不显示设置。 condition={"urlMd5":urlMd5} document=self.db[self.name].find_one(condition) if document: #更新count计数 countNum=document['count']+1 document['count']=countNum result=self.db[self.name].update_one(condition,{'$set':document}) print("文档已经存在!!!准备插入urlMd5:{}的文档".format(urlMd5)) return None else: document={ "picture_url":picture_url, "urlMd5":urlMd5, "filepath":filepath, "count":1 } result=self.db[self.name].insert(document) print("插入urlMd5:{}的文档,操做的结果是:{}".format(urlMd5,result)) return result def put_article(self,article_url,urlMd5,title,filepath): #urlMd5是一个主键,我不显示设置。 condition={"urlMd5":urlMd5} document=self.db[self.name].find_one(condition) if document: #更新count计数 countNum=document['count']+1 document['count']=countNum result=self.db[self.name].update_one(condition,{'$set':document}) print("文档已经存在!!!准备插入urlMd5:{}的文档".format(urlMd5)) return None else: document={ "article_url":article_url, "urlMd5":urlMd5, "title":title, "filepath":filepath, "count":1 } result=self.db[self.name].insert(document) print("插入urlMd5:{}的文档,操做的结果是:{}".format(urlMd5,result)) return result def delete(self, urlMd5): result=self.db[self.name].remove({"urlMd5": urlMd5}) print("删除urlMd5:{}的文档,操做结果是:{}".format(urlMd5,result)) return result def exists(self, urlMd5): return True if self.db[self.name].find_one({"urlMd5":urlMd5}) != None else False def getNumber(self): return self.db[self.name].count()
测试代码
# -*- coding: utf-8 -*- """ Created on Fri Jul 20 08:23:55 2018 @author: a """ import MongodbClient_weixin_article import hashlib article_urls=['http://mp.weixin.qq.com/s?src=3×tamp=1532049733&ver=1&signature=0q2qr46UEAp9lSI*yPIN5WoBijEOPhSwZpjbQjQpEiJQyZgy2-5C-L0O3emN-hX0jh79aT3URKtB5s2Se4rL6FuWyfbYPLWnCdDqKNHmRe*TeI4kts0amlyrHgKiK0ixrAP--AHNEt2t-n-9Z7OaxyRTQknx86DkCwPXiKwVY2M=', 'http://mp.weixin.qq.com/s?src=11×tamp=1532049733&ver=1009&signature=egTLXKVBalu7VMZP*77RccSBwkRPNGpWUJqfRs0kBuDfZ8TwbjFoeGuKBQQ4A9bgOpkf4xqhEC2hgRHBYJCyqXwOfyshabHq*F2JjteYIiOyLSLj3eUdK-2WXNqzZHoO&new=1', 'http://mp.weixin.qq.com/s?src=3×tamp=1532049733&ver=1&signature=CsL2-HvpsfVTOhEZM27-LQk5se5W34dAjYuTKkKqNZfBacO55kTVqn*LOBhk6onEQxPMVZ94hWG7WHQ*diKBnEvvzo-0ZN042ly2ORTfEz7T2JLQ3n3L2xe2F3MoEyhpzV0BcVRyMJRGpx3auh8ExL1wkkMj*LTFU5BtpGO6S-0=', 'http://mp.weixin.qq.com/s?src=3×tamp=1532049733&ver=1&signature=VNtNZKptsswWABF3clr725M-y2pg45SZRgqasg8L0wi6r3yzpr43GoAjfpAcIS4LvplqaSRoOqZuMaFBl4z6ILZZpwtj--Bd4V3JBcyiSJ5W9AfsPDRkWGn9G5r148qKxqKW9feJIQ8DDe77rL05xD0QittWApKDOPMiUB8TpkQ=', 'http://mp.weixin.qq.com/s?src=11×tamp=1532049733&ver=1009&signature=O-T3B1RdiF5UUVlreIOsDXInOIb4xRa*W2fo6TH1Bj2NwFZM3ZTe0s6JiR8CCytqCjBbd3OgX7pXGEvh-6ErfIIGiYPMwaIvU*QN3Fjaq0UCehePhKJb67Cohd0rh-U0&new=1', 'http://mp.weixin.qq.com/s?src=3×tamp=1532049733&ver=1&signature=Xt9s5upxnYga-ipwcmVcERz5YqKxwyCSHPCzaicjjqNVwyZ3cO-nPVcDThmlBUlBj9PEU-t9Cm*KwrbYn-2A2719INbLAnViyxGJLTSxXmH1agQOteUr5PYUOi-xjSXDXQvTjySjfnw398n6VE-TqA==', 'http://mp.weixin.qq.com/s?src=3×tamp=1532049733&ver=1&signature=vSyrKJ46Wba0820nEylGfBMVL8Zif6Lj2hiOS49q-46Ik3AihVS1aghAUP4EPf9vmdsD2MJiutX1w7iBavF6TrXLrv6cIwDAK-zpssizzEGmnb6qkJHbFiPLQ87ehmMJzMWDS3Rlkbaze2HbX80W0g==', 'http://mp.weixin.qq.com/s?src=11×tamp=1532049733&ver=1009&signature=5*fJWC70b49HJpfvLnE0vGjQvGjtitjna9ObOpL6i2QAzR9wZdRoaWY0d7DxSEbxmo1LEDYF7Zz0MZyh8jd1Zzh4jIDj7XgFFdPRaERg4mR9yaoCWak1lHPAZu3q3bCs&new=1', 'http://mp.weixin.qq.com/s?src=3×tamp=1532049733&ver=1&signature=n5Yd0nWrycz23WZAj-I3tCi0LmoRs4PLgtcoLoK1bmMgZJcxF*f*rIOt9z3UobXHhvjVpIbbXD1ljjMFCvW*V-XA0eL74LgM4Xdox-9cd58m0qmUObfvlB6Yp7J6hIZMtoY-9Ay3aFerB7-iBDi-fQ==', 'http://mp.weixin.qq.com/s?src=11×tamp=1532049733&ver=1009&signature=wv02IRQ65jrVpoaBW9HHvpWsHXOf61ageled59cpyOzTdJ1w4tjY8aQ-JvgYqfYRlF7YlKiyIrXLbBEqc-9YKkxe8weaG8zOGgfykYEam9BoKWWqI65SMAIoRGj-JNNh&new=1'] db=MongodbClient_weixin_article.MongodbClient_weixin_article("article_urlMd5_filepath","localhost",27017) #db.changeTable("picture_urlMd5_filepath") for i in range(len(article_urls)): m = hashlib.md5() url=article_urls[i].encode() m.update(url) urlMd5=m.hexdigest() title="love you baby" filepath="./测试地址" db.put_article(article_urls[i],urlMd5,title,filepath) print (db.exists("b6c825349ce9c94d1d56c3c628bfc223")) print (db.get("b6c825349ce9c94d1d56c3c628bfc223")) print (db.getNumber()) for i in range(len(article_urls)): m = hashlib.md5() url=article_urls[i].encode() m.update(url) urlMd5=m.hexdigest() title="love you baby" filepath="./测试地址" db.put_article(article_urls[i],urlMd5,title,filepath) for i in range(len(article_urls)): m = hashlib.md5() url=article_urls[i].encode() m.update(url) urlMd5=m.hexdigest() filepath="./测试地址" db.delete(urlMd5)
runfile('G:/精通python网络爬虫/针对目标网站的爬虫/测试url和md5映射的mongodb数据库.py', wdir='G:/精通python网络爬虫/针对目标网站的爬虫') 插入urlMd5:4dc6c2896ee7bd96dcc27b561eafb709的文档,操做的结果是:5b514560b61e0913b060af49 插入urlMd5:b6c825349ce9c94d1d56c3c628bfc223的文档,操做的结果是:5b514560b61e0913b060af4a 插入urlMd5:18a5ee6e623b3b76d96e6cec2e2db1ad的文档,操做的结果是:5b514560b61e0913b060af4b 插入urlMd5:f31d114c5ea5e6d37adbc7048531fc76的文档,操做的结果是:5b514560b61e0913b060af4c 插入urlMd5:d1a8faad9d00bbf2966dc3db75d6f128的文档,操做的结果是:5b514560b61e0913b060af4d 插入urlMd5:731b7e7074c969ffd36685300abe7b0e的文档,操做的结果是:5b514560b61e0913b060af4e 插入urlMd5:011821ee4b366a7a396ccc6958a091d3的文档,操做的结果是:5b514560b61e0913b060af4f 插入urlMd5:ea185627b10b0b4b66fe2da7bcec3974的文档,操做的结果是:5b514560b61e0913b060af50 插入urlMd5:b0edcbdb3d4171aea30f1c28e2db10ea的文档,操做的结果是:5b514560b61e0913b060af51 插入urlMd5:d4759df2c6c3c4973db3d4ddcd37bed2的文档,操做的结果是:5b514560b61e0913b060af52 True {'_id': ObjectId('5b514560b61e0913b060af4a'), 'article_url': 'http://mp.weixin.qq.com/s?src=11×tamp=1532049733&ver=1009&signature=egTLXKVBalu7VMZP*77RccSBwkRPNGpWUJqfRs0kBuDfZ8TwbjFoeGuKBQQ4A9bgOpkf4xqhEC2hgRHBYJCyqXwOfyshabHq*F2JjteYIiOyLSLj3eUdK-2WXNqzZHoO&new=1', 'urlMd5': 'b6c825349ce9c94d1d56c3c628bfc223', 'title': 'love you baby', 'filepath': './测试地址', 'count': 1} 10 文档已经存在!!!准备插入urlMd5:4dc6c2896ee7bd96dcc27b561eafb709的文档 文档已经存在!!!准备插入urlMd5:b6c825349ce9c94d1d56c3c628bfc223的文档 文档已经存在!!!准备插入urlMd5:18a5ee6e623b3b76d96e6cec2e2db1ad的文档 文档已经存在!!!准备插入urlMd5:f31d114c5ea5e6d37adbc7048531fc76的文档 文档已经存在!!!准备插入urlMd5:d1a8faad9d00bbf2966dc3db75d6f128的文档 文档已经存在!!!准备插入urlMd5:731b7e7074c969ffd36685300abe7b0e的文档 文档已经存在!!!准备插入urlMd5:011821ee4b366a7a396ccc6958a091d3的文档 文档已经存在!!!准备插入urlMd5:ea185627b10b0b4b66fe2da7bcec3974的文档 文档已经存在!!!准备插入urlMd5:b0edcbdb3d4171aea30f1c28e2db10ea的文档 文档已经存在!!!准备插入urlMd5:d4759df2c6c3c4973db3d4ddcd37bed2的文档 删除urlMd5:4dc6c2896ee7bd96dcc27b561eafb709的文档,操做结果是:{'n': 1, 'ok': 1.0} 删除urlMd5:b6c825349ce9c94d1d56c3c628bfc223的文档,操做结果是:{'n': 1, 'ok': 1.0} 删除urlMd5:18a5ee6e623b3b76d96e6cec2e2db1ad的文档,操做结果是:{'n': 1, 'ok': 1.0} 删除urlMd5:f31d114c5ea5e6d37adbc7048531fc76的文档,操做结果是:{'n': 1, 'ok': 1.0} 删除urlMd5:d1a8faad9d00bbf2966dc3db75d6f128的文档,操做结果是:{'n': 1, 'ok': 1.0} 删除urlMd5:731b7e7074c969ffd36685300abe7b0e的文档,操做结果是:{'n': 1, 'ok': 1.0} 删除urlMd5:011821ee4b366a7a396ccc6958a091d3的文档,操做结果是:{'n': 1, 'ok': 1.0} 删除urlMd5:ea185627b10b0b4b66fe2da7bcec3974的文档,操做结果是:{'n': 1, 'ok': 1.0} 删除urlMd5:b0edcbdb3d4171aea30f1c28e2db10ea的文档,操做结果是:{'n': 1, 'ok': 1.0} 删除urlMd5:d4759df2c6c3c4973db3d4ddcd37bed2的文档,操做结果是:{'n': 1, 'ok': 1.0}
断点下在删除操做前: