爬虫学习小记

1.requests库安装

pip install requests

举例:

>>> import requests
>>> r = requests.get("http://www.baidu.com")
>>> r.status_code
200   #200表示成功
>>> r.encoding = "utf-8"
>>> r.text   #打印网页内容
'<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn"></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write(\'<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=\'+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ \'" name="tj_login" class="lb">登录</a>\');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>\r\n

这样,百度的主页已经成功被抓取下来了。

requests的7个主要的方法


image.png

2.requests库的get()方法

image.png

image.png

requests库get方法的源代码


image.png

所以,requests库的get()方法实际上是调用requests库的request的方法来实现的
所以,虽然requests库有7中方法,但是实际上可以把它理解成一种方法,也就是request的方法。


image.png

重点看一下response对象

image.png
image.png

image.png

image.png

原则上,r.apparent_encoding 是比r.encoding更为准确的一种形式

3.爬取网页的通用代码框架
6种常见的requests库的连接异常


image.png

image.png

image.png

image.png

通用代码框架使得用户爬取网页更加可靠,有效,稳定

3.HTTP协议以及request库方法

HTTP协议:超文本传输协议


image.png

简单的说,就是用户发起请求,服务器发生响应,这就是简单的请求与响应模式


image.png

image.png

image.png

image.png

image.png

image.png
image.png

r.headers反馈得到的头部信息
当试图展示全部内容,用r.text,结果为空


image.png
image.png
image.png

4.requests库主要方法的解析

image.png

image.png

image.png

image.png
image.png

image.png
image.png

image.png

image.png
image.png

image.png

image.png

image.png

image.png

image.png

image.png

5.爬取实例

(1)京东商品页面的爬取


image.png

(2)亚马逊商品页面的爬取


image.png

image.png
image.png

亚马逊的服务器识别了这次访问是由requests库的爬虫引起的
所以
先构建一个键值对


image.png

重新定义了user-agent,使它等于Mozilla/5.0


image.png

对headers进行修改


image.png

这时候,user-agent就变成了Mozilla/5.0
返回的结果


image.png

image.png

(3)百度360搜索关键词提交
image.png

image.png

image.png

image.png

(4)网络图片的爬取和储存


image.png
image.png

(5)IP地址归属地的自动查询

6.Beautiful Soup库的安装

pip install beautifulsoup4
image.png

image.png

两种方式获取源代码
1是可以直接浏览器上查看网页源代码


image.png

2是可以用requests
image.png

除了给出demo,还需要给出一个解析demo的解释器,这里的解释器是html.parser,也就是说我们这里是对demo进行html的解析


image.png

beautifulsoup库只需要2行代码


image.png

7.Beautiful Soup库的基本元素

image.png

任何的html文件都是由一组尖括号组成的标签组织起来的,每一对尖括号构成一个标签,而标签之间存在上下游关系,形成一个标签树


image.png

image.png
image.png

image.png

image.png
image.png
image.png

使用soup.title可以获得title信息
使用soup.a获得a标签的tag
当html中包含多个相同的tag时,使用soup.tag是会获得第一个tag信息


image.png

soup.a.name获得a标签的名字
soup.a.parent.name获得a标签的父亲的名字,也就是包含a标签的上一级标签的名字
soup.a.parent.parent.name同理,获得的是上上级标签的名字


image.png

tag.attrs获取tag的属性信息,可以看出来它是一个字典,存在键值对
因此,可以用
tag.attrs['class']来获得class属性的值
tag.attrs['href']来获得href属性的值
type(tag.attrs)可以获得属性的类型,它是一个dict

type(tag),获取tag的类型信息


image.png

soup.a.string获得tag a的NavigableString
可以看出,p标签中还包含一个b标签
因此,soup.tag.string可以跨标签获得标签的NavigableString
比如
image.png

image.png

beautiful soup的comment信息

8.基于bs4库的HTML内容的遍历方法

image.png

image.png
image.png

要注意的是,contents返回的是列表,而children和descendants返回的是迭代类型,需要for循环输出


image.png

image.png
image.png

image.png

image.png

image.png

image.png

image.png
image.png
image.png

9.基于bs4库的HTML格式输出

image.png

image.png

image.png

print之后都分行显示


image.png

image.png

10.信息标记的三种形式

image.png

image.png

image.png

image.png

image.png

image.png

image.png
image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

11.三种信息标记形式的比较

image.png

image.png

image.png

image.png

image.png

12.信息提取的一般方法

image.png

image.png

image.png

image.png

image.png

13.基于bs4库的HTML内容查找方法

image.png

image.png

image.png

如果给find_all的参数是True,将返回所有的标签信息


image.png

image.png

image.png

image.png
image.png

image.png

image.png

image.png

image.png

image.png

14.中国大学排名定向爬虫实例

(1)实例介绍


image.png

image.png

image.png

image.png

image.png

image.png

(2)中国大学排名定向爬虫实例代码编写

import requests
import bs4
import requests
import bs4
import requests
import bs4
from bs4 import BeautifulSoup
def getHTMLText(url):
   try:
      r = requests.get(url,timeout = 30)
      r.raise_for_status()
      r.encoding = r.apparent_encoding
      return r.text
   except:
      return ""

def fillUnivList(ulist,html):
   soup = BeautifulSoup(html,'html.parser')
   for tr in soup.find('tbody').children:
      if isinstance(tr,bs4.element.Tag):
         tds = tr("td")
         ulist.append([tds[0].string,tds[1].string,tds[2].string])


def printUnivList(ulist,num):
   print("{:^10}\t{:^6}\t{:^10}".format("排名","学校名称","总分"))
   for i in range (num):
     u = ulist[i]
     print ("{:^10}\t{:^6}\t{:^10}".format(u[0],u[1],u[2]))

def main():
   uinfo = []
   url = "http://www.zuihaodaxue.com/zuihaodaxuepaiming2016.html"
   html = getHTMLText(url)
   fillUnivList(uinfo,html)
   printUnivList(uinfo,20)
main()

结果如下

排名       学校名称       总分    
    1        清华大学      北京市    
    2        北京大学      北京市    
    3        浙江大学      浙江省    
    4       上海交通大学     上海市    
    5        复旦大学      上海市    
    6        南京大学      江苏省    
    7       中国科学技术大学       安徽省    
    8       哈尔滨工业大学    黑龙江省   
    9       华中科技大学     湖北省    
    10       中山大学      广东省    
    11       东南大学      江苏省    
    12       天津大学      天津市    
    13       同济大学      上海市    
    14      北京航空航天大学       北京市    
    15       四川大学      四川省    
    16       武汉大学      湖北省    
    17      西安交通大学     陕西省    
    18       南开大学      天津市    
    19      大连理工大学     辽宁省    
    20       山东大学      山东省    

(3)中国大学排名定向爬虫实例优化
问题:


image.png

结果的中文不对齐


image.png

image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,601评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,367评论 1 305
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,249评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,539评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,967评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,929评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,098评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,825评论 0 207
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,609评论 1 249
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,796评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,282评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,603评论 3 261
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,277评论 3 242
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,159评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,959评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,079评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,874评论 2 277

推荐阅读更多精彩内容

  • 声明:本文讲解的实战内容,均仅用于学习交流,请勿用于任何商业用途! 一、前言 强烈建议:请在电脑的陪同下,阅读本文...
    Bruce_Szh阅读 12,594评论 6 28
  • 关于bs4,官方文档的介绍已经非常详细了,传送:Beautifulsoup 4官方文档,这里我把它组织成自己已经消...
    徐薇薇阅读 5,228评论 0 1
  • BeautifulSoup 是一个非常优秀的Python扩展库,可以用来从HTML或XML文件中提取我们感兴趣的数...
    siyu8023阅读 1,100评论 0 2
  • Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实...
    LitOrange阅读 5,162评论 0 4
  • 下面的场景你是否觉得非常熟悉 场景一: 男:在干嘛呢? 女:看电视 男:看什么? 女:韩剧 男:好看吗? 女:还行...
    林汐然阅读 687评论 4 7