用python写简单爬虫,用Python写简单的爬虫

准备:

1.扒网页,根据URL来获取网页信息

importurllib.parseimporturllib.request

response= urllib.request.urlopen("https://www.cnblogs.com")print(response.read())

urlopen方法

urlopen(url, data, timeout)

url即为URL,data是访问URL时要传送的数据,timeout是设置超时时间

返回response对象

response对象的read方法,可以返回获取到的网页内容

POST方式

importurllib.parseimporturllib.request

values= {"username":"XXX","password":"XXX"}

data=urllib.parse.urlencode(values)

data= data.encode('utf-8')

url= "https://passport.cnblogs.com/user/signin?ReturnUrl=https://home.cnblogs.com/&AspxAutoDetectCookieSupport=1"response=urllib.request.urlopen(url,data)print(response.read())

GET方式

importurllib.parseimporturllib.request

values= {"itemCount":30}

data=urllib.parse.urlencode(values)

data= data.encode('utf-8')

url= "https://news.cnblogs.com/CommentAjax/GetSideComments"data=urllib.parse.urlencode(values)

response= urllib.request.urlopen(url+'?'+data)print(response.read())

2.正则表达式re模块

Python 自带了re模块,提供了对正则表达式的支持

#返回pattern对象

re.compile(string[,flag])

#以下为匹配所用函数

re.match(pattern, string[, flags]) #在字符串中查找,是否能匹配正则表达式

re.search(pattern, string[, flags]) #字符串的开头是否能匹配正则表达式

re.split(pattern, string[, maxsplit]) #通过正则表达式将字符串分离

re.findall(pattern, string[, flags]) #找到 RE 匹配的所有子串,并把它们作为一个列表返回

re.finditer(pattern, string[, flags]) #找到 RE 匹配的所有子串,并把它们作为一个迭代器返回

re.sub(pattern, repl, string[, count]) #找到 RE 匹配的所有子串,并将其用一个不同的字符串替换

re.subn(pattern, repl, string[, count])#返回 (sub(repl, string[, count]), 替换次数)

3.Beautiful Soup,是从网页抓取数据的库,使用时需要导入 bs4 库

4.MongoDB

使用的MongoEngine库

示例:

抓取博客园前20页数据,保存到MongoDB中

1.获取博客园的数据

request.py

importurllib.parseimporturllib.requestdefgetHtml(url,values):

data=urllib.parse.urlencode(values)

response_result= urllib.request.urlopen(url+'?'+data).read()

html= response_result.decode('utf-8')returnhtmldefrequestCnblogs(num):print('请求数据page:',num)

url= 'https://www.cnblogs.com/mvc/AggSite/PostList.aspx'values={'CategoryId':808,'CategoryType' : 'SiteHome','ItemListActionName' :'PostList','PageIndex': num,'ParentCategoryId': 0,'TotalPostCount' : 4000}

result=getHtml(url,values)return result

注:

打开第二页,f12,找到https://www.cnblogs.com/mvc/AggSite/PostList.aspx

5dac98416de8179379b99a2d2558e98f.png

2c0d29d54a2dc6da285ea136b2aff1a3.png

2.解析获取来的数据

deal.py

from bs4 importBeautifulSoupimportrequestimportredefblogParser(index):

cnblogs=request.requestCnblogs(index)

soup= BeautifulSoup(cnblogs, 'html.parser')

all_div= soup.find_all('div', attrs={'class': 'post_item_body'}, limit=20)

blogs=[]#循环div获取详细信息

for item inall_div:

blog=analyzeBlog(item)

blogs.append(blog)returnblogsdefanalyzeBlog(item):

result={}

a_title= find_all(item,'a','titlelnk')if a_title is notNone:

result["title"] =a_title[0].string

result["link"] = a_title[0]['href']

p_summary= find_all(item,'p','post_item_summary')if p_summary is notNone:

result["summary"] =p_summary[0].text

footers= find_all(item,'div','post_item_foot')

footer=footers[0]

result["author"] =footer.a.string

str=footer.text

time= re.findall(r"发布于 .+? .+?", str)

result["create_time"] = time[0].replace('发布于','')returnresultdeffind_all(item,attr,c):return item.find_all(attr,attrs={'class':c},limit=1)

注:

分析html结构

e4f4ea787f80e1345bb235908e910dde.png

3.将处理好的数据保存到MongoDB

db.py

from mongoengine import *connect('test', host='localhost', port=27017)importdatetimeclassBlogs(Document):

title= StringField(required=True, max_length=200)

link= StringField(required=True)

author= StringField(required=True)

summary= StringField(required=True)

create_time= StringField(required=True)defsavetomongo(contents):for content incontents:

blog=Blogs(

title=content['title'],

link= content['link'],

author=content['author'],

summary=content['summary'],

create_time=content['create_time']

)

blog.save()return "ok"

defhaveBlogs():

blogs=Blogs.objects.all()return len(blogs)

4.开始抓取数据

test.py

importdbimportdealprint("start.......")for i in range(1, 21):

contents=deal.blogParser(i)

db.savetomongo(contents)print('page',i,'OK.')

counts=db.haveBlogs()print("have",counts,"blogs")print("end.......")

ae45720df59c5db1f2ff3e8e9dfe21a2.png

注:

当前使用的Python版本是3.6.1

可以在可视化工具中查看(可是化工具 介绍 )

c2765f7915e12a235e75f8b9c410128d.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单元测试(二)基本使用争议篇

介绍常用的单元测试是测试方法、API等,下面我们来演示一下Xunit测试框架的简单使用,有些是为了演示而写的单元测试。最下面有反转,一定要看到最后操作创建单元测试项目本次文章还在原来项目的基础上进行操作,右键解决方案添加单元…

听说你趁我不在家,欺负我老婆?

1 听说你趁我不在家欺负我老婆了?▼2 当男生们聚在一起时他们都会做什么?▼3 其实我是广西人,每顿要嗦1吨粉▼4 山西人的饮水机里放的都是醋?▼5 可现实中又有几个总裁没有啤酒肚呢?▼6 开学考试,一考…

RHEL5.3下MRTG+SNMP的搭建

一、MRTG的简介 Mrtg(Multi Router Traffic Grapher,MRTG)是一个监控网络链路流量负载的工具软件,它通过snmp协议从设备得到设备的流量信息,并将流量负载以包含PNG格式的图形的HTML文档方式显示给用户,以非常直观的形式显示流量负载(可以在网…

BeetleX.WebFamily之Markdown编辑器

组件的新版集成一款Markdown编辑器ToastUIEditor,通过它可以快速地构建编写Markdown文本内容功能。集成后的ToastUIEditor支持图表,表格,文件管理插入等功能。新建一个控制台项目,通过Nuget引用组件后编写以下代码class Program {…

如何逃离「信息茧房」?

全世界只有3.14 % 的人关注了爆炸吧知识智能算法、内容推荐,当我们滑动屏幕的时候,映入眼帘的总是我们想看的内容。不过,这样的内容选择或许会让我们陷入「信息茧房」:只注意自己选择的、让自己愉悦的资讯,久而久之和蚕…

oracle表存储表空间,Oracle的存储信息-表空间信息记录

经过前面的介绍,我们已经能够对Oracle的存储结构有了深入的了解,总结一下前面的内容:Oracle最小的数据存储单位是数据块(Block),如果以单个数据块进行对象空间分配,那么显然分配将过于频繁,所以Oracle使用多…

排序算法java实现

1. 插入排序 原理:遍历到第N个元素的时候前面的N-1个元素已经是排序好的了,那么就查找前面的N-1个元素把这第N个元素放在合适的位置,如此下去直到遍历完序列的元素为止。 算法的复杂度也是简单的,排序第一个需要1的复杂度&…

FusionChart完全入门手册 -2

今天主要探讨下,数据文件的生成方式,只做探讨。 其实funsioncharts提供了多种数据展现方式,除了前一节采用的直接的DATAFile的方式外,还有官方提供的标准的c#实现方式。 看个截图 但是总感觉使用官方提供的InfoSoftGlobal不是很灵…

BeetleX.WebFamily之ElasticSearch搜索集成

组件在最新版本中集成了基于ElasticSearch的文档搜索功能,通过这一功能可以快速地构建文档查询的webapi服务和web搜索应用。接下来介绍一下如果使用组件的ElasticSearch组件来进行文档构建和查询。ElasticSearch要求组件支持7.x和6.x两个版本的ElasticSearch服务&am…

直男们给我看清楚!这才是小姐姐的真面目......

1 这才是化妆的真相!▼2 听说,这就是当年Tom劈过得那棵树▼3 等一下!这题真的有正确答案吗?▼4 这是一只长大成熟的猫咪了▼5 想当年上学的时候转书、转笔都一门灵,就是脑子不会转▼6 猫的四肢和尾巴仿佛都有独立…

模型部署到移动端_谷歌开源 MobileNetV3:新思路 AutoML 改进计算机视觉模型移动端...

雷锋网 AI 开发者按:谷歌从 17 年发布 MobileNets 以来,每隔一年即对该架构进行了调整和优化。现在,开发者们对 MobileNetV3 在一次进行了改进,并将 AutoML 和其他新颖的思想融入到该移动端的深度学习框架中。谷歌发布了相关文章对…

c++中stringstream_文史哲与艺术中的数学_智慧树章节答案

文史哲与艺术中的数学_智慧树章节答案更多相关问题His mother told me that he ______ read quite well at the age of five. A) should B) would C)在三角形ABC中,a,b,c分别是角A,B,C的对边,且满足m(2b&am…

将.net framework 4 部署在docker中的全过程(支持4.0 到 4.8,3.5应该也可以)

前言:docker自从诞生之初,就是运行在linux系统中,后来windows上也可以运行docker了,但是微软是通过自身的hyper-v技术,在你的windows系统中虚拟出来了一个小的linux虚拟主机,在它上面跑了个docker环境让你用…

有图有真相!这世界上,竟有人跟你长得一模一样!

全世界只有3.14 % 的人关注了爆炸吧知识你相信这个世界上有和你长得一模一样的人吗?我本来不信的看到这个摄影师的作品后真!香!冥冥之中,在平行宇宙在地球的另一端真的有另外一个你和你长得一模一样在生活,在呼吸老牌人…

两条线段的夹角 cesium_《原本》命题1.10 一条线段可以被分成两条相等的线段

命题1.10一条线段可以被分成两条相等的线段设:AB为一条直线。求作:平分为两条相等的线段。作等边三角形ABC(命题1.1)命题1.1已知一条线段可作一个等边三角形。作∠ACB的角平分线CD(命题1.9)命题1.9一个角可以切分成两个相等的角。那么:D 点就…

Minimal API Todo Sample

Minimal API Todo SampleIntro.NET 6 Preview 4 开始引入了 Minimal API 到如今的 RC1,Minimal API 也完善了许多并且修复了很多BUG,之前也写过文章介绍,可以参考:ASP.NET Core 6 Minimal API ,不过只是写了一个 Hello World, 最早…

WPF基础到企业应用系列7——深入剖析依赖属性(三)

八. 只读依赖属性 我们以前在对简单属性的封装中,经常会对那些希望暴露给外界只读操作的字段封装成只读属性,同样在WPF中也提供了只读属性的概念,如一些 WPF控件的依赖属性是只读的,它们经常用于报告控件的状态和信息,…

Web的结构组件

位于Web浏览器与Web服务器之间还有一些用于帮助他们进行事物处理的应用程序,如下所示。 代理 代理位于客户端和服务器之间,接受所有客户端的HTTP请求,并将这些请求转发给服务器。 缓存 Web缓存或代理缓存是一种特殊HTTP代理服务器&#xff0c…

从没想过从上帝视角看地球,竟美得如此震撼!

全世界只有3.14 % 的人关注了爆炸吧知识“ 当你从另一个角度俯瞰地球,你就能发现不一样的世界 。。。试想你现在飘起来了飘得越来越高,地球在你眼里慢慢变小现在,你看见的是此生从未见过的景色——《极简宇宙史》当想象力带我走向未知脑海…

双目三维重建_【光电视界】简单介绍双目视觉三维重构

今日光电有人说,20世纪是电的世纪,21世纪是光的世纪;知光解电,再小的个体都可以被赋能。欢迎来到今日光电!----与智者为伍 为创新赋能----1、三维重构1.1、三维重构到底是什么?首先要了解立体匹配算法&…