用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,一经查实,立即删除!

相关文章

换种方式去分页(转)

为什么要换种方式分页,一个字:太慢了 分页要传入的参数,1:页号,2:行数 分页要取到的数据, 1:总行数,2:单页数据 http://www.cnblogs.com/mikedeng/p/be…

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

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

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

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

热像仪 二次开发 c++_一种全新的红外热像仪——“可编程红外热像仪”

如 今,红外热像仪对于很多人而言已经不是一个新鲜事物了,它利用红外探测器对被测目标的红外辐射进行探测,并加以光电转换和信号处理等手段,将被测目标的温度分布转换为我们人眼可以直观识别的图像。受益于这种温度可见的技术&…

RHEL5.3下MRTG+SNMP的搭建

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

SQL Express自动备份

--第一步 --在master库中建立一个备份数据库的存储过程. USE master GO CREATE PROC p db_name sysname, --数据库名 bk_path NVARCHAR(1024) --备份文件的路径 AS IF ISNULL(db_name,) SET db_namedb_name() ; DECLARE dt VARCHAR(50) ; SET dtdb_name_CONVERT(V…

php server 连接字符串,sqlServer 数据库常用连接字符串

sqlServer 数据库常用连接字符串 用户名和密码验证的方式去连接到数据库服务器 add name"conStr" connectionString"Data Source服务器名;Initial Catalog数据库名; User Id用户名;Password密码"/ add name"conStr" connectionString"Serve…

linux下ip命令用法

配置数据转发,可以通过 1、路由转发即用用路由器实现; 2、使用NAT转发; 简单的说: 路由表内的信息只是指定数据包在路由器内的下一个去处。并不能改变数据包本身的地址信息。即它只是“换条路而已,目的地不变”&#x…

BeetleX.WebFamily之Markdown编辑器

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

如何逃离「信息茧房」?

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

python为何排名越来越前_为何python现在越来越多的人在用了?

曾几何时,python这门语言我并没有听过,那个时候只知道C,后来学了C,用了C Builder和VS,再后来学了C#的皮毛,继之是Lua,觉得差不多了。但是最近买了本python的书之后,觉得python处理问…

python怎么获取lol皮肤名称_LOL手游免费皮肤获得方法 LOL手游皮肤怎么获得

LOL手游国际服已经于10月27日开服(苹果为10月28日开服),LOL手游官方为大家准备了开服活动。各位玩家可以通过参与活动获得免费皮肤。为了迎接新玩家的到来,LOL手游官方推出了新手活动《WILDRIFTACADEMY》,玩家需要用五天时间完成该活动&#…

网页编码格式

以前一直对utf、unicode、ascII还有GBK编码方式不太了解,只知道如果有中文的话一般用utf-8或GBK存储,今天正好又接触到了这个问题就google了下。 ASCII是用来表示英文的一种编码规范,表示的最大字符数为256个,每个字符占1个字…

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…