爬取书虫

一、机制:例如在浏览器中输入www.baidu.com回车,实际是由浏览器找到这个网址所对应的IP地址,向IP地址的服务器发送一个请求,服务器会给一个响应,通过HTTP协议进行通讯。

二、HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是从WWW 服务器传输超文本到本地浏览器的传送协议 

      HTTP最初的目的是为了提供一种发布和接收HTML页面的方法,HTTP是一个客户端和服务器端请求和应答的标准(TCP)。客户端是终端用户,服务器端是网站。通过使用Web流量器、网络爬虫或者其它的工具,客户端发起一个到服务器上指定端口的HTTP请求。

三、爬虫爬取数据的原理:

  1. 构造一个请求
  2. 发送请求,获取服务器端的响应
  3. 从响应内容里提取我们所需要的特定数据

四、爬虫的作用和应用场景:

       在信息时代,面对海量数据,我们需要一种高效便捷的手段来帮助我们进行数据分析和获取。

五、原代码:

 #!/usr/bin/python
 #coding:utf-8
 '''
 爬取书籍
 '''
 
 import urllib2
 
 import re
 
 from bs4 import BeautifulSoup

 #根据指定url获取服务器端响应
 def OpenPage(url):
     Myheaders = {}
     #urllib2.Request 构造请求
     req = urllib2.Request(url,headers=Myheaders)
     #相当于,在浏览器的地址栏,输入了网址,url是网址,headers=Myheaders用关键字参数赋值(因为Request不只2个参数,如果不用关键字参数赋值,有可能会赋到别的参数上)
 
     #激活请求,获取响应,获取类文本文件对象
     f = urllib2.urlopen(req)
     #服务器端响应类文本对象,通过read()方法读取响应内容
     data = f.read()
     #ignore replace xml..replace
     return data.decode("GBK",errors="ignore").encode("utf-8")
 
 def Test1():
     url = "http://www.shengxu6.com/book/2967.html"
     print OpenPage(url)
 
 #从主页解析数据,获取各个章节的跳转链接url
 def ParseMainPage(page):
     #调用爬虫库提供的相关方法,进行数据分析
 
 #print type(page)#解析之前打印标签格式(是字符串)
 
     #html.parser, python自带的html解析引擎,Beaut ifulSoup是爬虫库的一种
     soup = BeautifulSoup(page,"html.parser")
 #print type(soup)#解析之后打印标签格式(格式化之后变成BeautifulSoup类)格式化目的是给我们提供操作方法html
 
     #find_all方法在全文内容里搜索符合内容的标签,返回一个列表
     #检索所有的href属性(键值对)值中包含read字符串的标签
     GetA = soup.find_all(href=re.compile("read"))#compile是正则表达式对象编译成字符串
     #因为标签内部属性是键值对的方式href=""
 #print GetA[0]["href"]打印href属性值,不管什么属性都可以取
 
     #UrlList = []空的是可以往里面追加
     #for item in GetA:遍历item,取到遍历元素的类
     #UrlList.append("http://www.shengxu6.com" + item["href"])
     #return UrlList
     return ["http://www.shengxu6.com" + item["href"] for item in GetA]#和上面4行一个意思,等价
 
 def Test2():
     url = "http://www.shengxu6.com/book/2967.html"
     page = OpenPage(url)
     print ParseMainPage(page)
 
 #解析一个章节内容,获取标题和正文
 def ParseDetailPage(page):
     #先进行格式化
     soup = BeautifulSoup(page,"html.parser")
 
  #find_all方法在全文内容里搜索符合内容的标签,返回一个列表
     #get_text() 方法,用于获取标签正文
     Title = soup.find_all(class_="panel-heading")[0].get_text()
     Content = soup.find_all(class_="content-body")[0].get_text() #正文
 #<div class="panel-body content-body content-ext">正文</div>
 #Div标签,class类=“panel-body”
     return Title,Content
 
 def Test3():
     url = "http://www.shengxu6.com/read/2967_2008175.html"
     page = OpenPage(url)
     print ParseDetailPage(page)
 
 #写到文件
 def WriteDataToFile(data):
     #f = open("output.txt","a+")
     #f.close()
 #忘记关闭文件,提供一个上下文管理器with open()as f
     with open("output.txt","a+") as f:#用追加写(原因是不可能只有一个章节)
         f.write(data)
 
 def Test4():
     WriteDataToFile("dnaidnasod")
 
 if __name__ == "__main__":
     url = raw_input("请输入要爬取的小说地址:")
     #打开主页获取主页内容
     page = OpenPage(url)#根据指定url获取服务器端响应
     print "Clone Begin"#打印开始爬取
     UrlList = ParseMainPage(page)#从主页解析数据,获取各个章节的跳转链接url
     for item in UrlList:#遍历
         #每个item都是一个章节的url地址
         detail = OpenPage(item)#打开每一个章节
         #解析章节内容,获取标题和正文
         Title,Content = ParseDetailPage(detail)
         print "Clone " + Title#打印进度,爬到哪一章
         data = "\n\n" + Title + "\n\n" + Content#“\n\n”空格,串起来有问题,Title Content在网页上响应的内容是Unicode码,我们自己写的是ascii码“\n\n”
         #将数据写入文件
         WriteDataToFile(data.encode("utf-8"))#解决上面问题
     print "Clone Done"#打印关闭爬取

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值