python网络爬虫学习随笔

Posted sgzhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python网络爬虫学习随笔相关的知识,希望对你有一定的参考价值。

---恢复内容开始---

requests库的7个主要方法

方法 描述

requests.request()

构造一个请求,支撑以下各方法的基础方法
requests.get() 获取html网页的主要方法,对应于HTTP的GET
requests.head() 获取HTML网页头信息的方法,对应于HTTP的HEAD
requests.post() 向HTML网页提交POST请求的方法,对应于HTTPde POST
requests.put() 向HTML网页提交PUT请求的方法,对应于HTTP的PUT
requests.patch() 向HTML网页提交局部修改请求,对应于HTTP的PATCH
requests.delete() 向HTTP页面提交删除的请求,对应于HTTP的DELETE

 

爬取网页的通用代码框架

import requests
def getHTMLText(url):
    try:
        r=requests.get(url,timeout=30)
        r.raise_for_status()#如果状态不是200,引发HTTPError异常
        r.encoding=r.apparent_encoding
        return r.text
    except:
        return "产生异常"
if __name__=="__main__":
    url="http://www.baidu.com"
    print(getHTMLText(url))

连接有风险,异常处理很重要

robots协议  基本语法

#注释  *代表所有     / 代表根目录

user-agent: *

Disallow: /

访问亚马逊网页商品

  查看头部信息r.request.headers     user_agent字段为python-requests被拒绝访问,因此修改头部信息user-agent字段为模拟浏览器首先构造一个键值对

kv=user-agent:Mozilla/5.0   #重新定义user-agent的内容

通过headers字段让代码模拟浏览器放亚马逊服务器提供HTTP请求

访问亚马逊网页全代码

import requests
url = "https://www.amazon.cn/gp/product/B01M8L5Z3Y"
try:
    kv=user-agent:Mozilla/5.0   #标准浏览器
    r=requests.get(url,headers=kv)
    r.raise_for_status()
    r.encoding=r.apparent_encoding
    print(r.text[1000:2000])
except:
    print("爬取失败")

百度,360搜索关键字提交

百度搜索全代码

import requests
keyword = python
try:
    kv=wd:keyword
    r = requests.get("http://www.baidu.com/s",params=kv)
    r.raise_for_status
    print(len(r.text))
except:
    print("爬取失败")

360搜索代码只需将键值对中的键‘wd‘改为‘q‘

网络图片的爬取和存储

 

若 一个url链接是以.jpg结尾的,例如http://www.example.com/picture.jpg他就是一个图片链接,且是一个文件

图片爬取全代码

import requests
import os
url =http://image.nationalgeographic.com.cn/2017/0211/201702111061910157.jpg
root="D://pics//"
path=root+url.split(/)[-1]
try:
    if not os.path.exists(root):#判断当前根目录是否存在,如果根目录不存在,则建立目录
        os.mkdir(root)
    if not os.oath.exists(path):#判断文件是否存在,文件不存在用get方式从网上获取相关文件
        r=requests.get(url)
        with open(path,wb) as f:
            f.write(r.content)
            f.close()
            print("文件保存成功")
    else:
        print("文件已存在")
except:
    print("爬取失败")

IP地址归属地的自动查询

import requests
url = "http://m.ip138.com/ip.asp?ip="
try:
    r=requests(url+202.204.80.112)
    r.raise_for_status()
    r.encoding=r.apparent_encoding
    print(r.text[-500:])
except:
    print("爬取失败")

每一个API都对应一个URL,以爬虫的视角看待网络内容

BeautifulSoup库

demo.html

import requests
r = requests.get("http://python123.io/ws/demo.html")
demo = r.text
demo

BeautifulSoup库安装小测

from bs4 import BeautifulSoup
soup = BeautifulSoup(demo,"html.parser")
print(soup.prettify())

 

引用

from bs4 import BeautifulSoup
import bs4

理解

技术图片

BeautifulSoup 类

from bs4 import BeautifulSoup
soup = BeautifulSoup(<htnl>data</html>,""html.parser")
soup2 = BeautifulSoup(open(D://demo.html),"html.parser")

BeautifulSoup类对应一个HTML/XML文档的全部内容

BeautifulSoup库解析器

技术图片

BeautifulSoup类的基本元素

技术图片

Tag:任何存在于HTML语法中的标签都可以用soup.<tag>访问获得,当html文档中存在多个相同<tag>对应内容时,soup.<tag>返回第一个。

Name:每个<tag>都有自己的名字,通过<tag>.name获取,字符串类型。

Attributes:一个<tag>可以有0个或多个属性,字典类型。

Navigablestring:可以跨越多个层次。

Comment:特殊类型(注释)。

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

<>.....</>构成了所属关系,形成了标签的属性结构

标签树的下行遍历

技术图片

for child in soup.body.children:
    print(child)      #遍历儿子节点
for child in soup.body.descendant:
    print(child)    #遍历子孙节点

标签树的上行遍历

技术图片

soup = BeautifulSoup(demo,"html.parser")
for parent in soup.a.parents:
    if parent is None:
        print(parent)
    else:
        print(parent.name)

遍历所有先辈节点,包括soup本身,所以要区别判断。

 运行结果

p
body
html
[document]

标签树的平行遍历

技术图片

平行遍历的条件:所有的平行遍历必须发生在同一个父节点下,如果不是同一个父亲节点下的标签之间不构成平行遍历关系。

注意:

在标签树中,尽管树形结构采用的是标签的形式来组织,但是标签之前的Navigablestring也构成了标签树的节点。即任何一个节点的平行标签他的儿子标签是可能存在Navigablestring类型的,所以不能想当然地认为平行遍历获得的下一个节点一定是标签类型。

for sibling in soup.a.next_siblings:
    print(sibling)         #遍历后续节点 
for sibling in soup.a..previous_siblings:
    print(sibling)        #遍历前序节点

基于bs4库的HTML格式输出

prettify()方法:

  可以为HTML文本的标签以及内容增加换行符,也可以对每一个标签做相关处理

bs4库将任何读入的HTML或字符串都转换为utf-8编码,python3.x默认支持编码是utf-8,解析无障碍

form bs4 import BeautifulSoup
soup = BeautifulSoup(demo,"html.parser")
soup.prettify()
print(soup.prettify())

 信息标记的三种形式

XML

技术图片

JSON(键值对),

使用有类型的键值将信息组织起来,值的地方有多个地方与键相对应,采用 [ ]形式,将新的键值对作为值的一部分放在键值对中,采用 形式进行嵌套

技术图片

YMAL:

无类型的键值对组织信息,兼职之间无“ ”,用缩进来表示所属相关关系。- 表达并列关系,| 表达整块数据,# 表示注释信息,键值对之间可以嵌套

技术图片

三种信息标志形式的比较

xml:每个信息域定义相关的标签,并且采用嵌套的形式组织起来(大多数信息被标签占用)

技术图片

json:键值之间用“ ”来表达类型

技术图片

ymal

技术图片

技术图片

技术图片

信息提取的一般方法

技术图片

技术图片

技术图片

技术图片

基于bs4的html内容查找方法

find_all()

技术图片

技术图片

技术图片

技术图片

技术图片

技术图片

等价形式:

  <tag>(..)等价于<tag>.find_all(..)

  soup(..)等价于soup.find_all(..)

 

扩展方法

技术图片

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

代码实现

import requests
from bs4 import BeautifulSoup
import bs4
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):#检测标签类型,若标签类型不是bs4库定义的Tag类型将被过滤掉
            tds = tr(td)
            ulist.append([tds[0].string,tds[1].string,tds[3].string])

def printUnivList(ulist,num): #利用数据结构展示并输出结果
    tplt = "0:^10\\t1:3^10\\t2:^10"  #输出结果中中文对齐问题,当中文字符宽度不够采用西文字符填充;中西文宽度不同,采用中文字符的空格填充 chr(12288)
    print(tplt.format("排名","学校名称","总分",chr(12288)))
    for i in range (num):
        u=ulist[i]
        print(tplt.format(u[0],u[1],u[2],chr(12288)))
    print("Suc"+str(num))

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

显示结果

技术图片

 

---恢复内容结束---

以上是关于python网络爬虫学习随笔的主要内容,如果未能解决你的问题,请参考以下文章

学习《从零开始学Python网络爬虫》PDF+源代码+《精通Scrapy网络爬虫》PDF

python爬虫之基础学习

小白如何学习Python网络爬虫?

python教程入门学习Python爬虫入门学习:网络爬虫是什么

1Python网络爬虫《Python网络爬虫相关基础概念》

爬虫学习 04.Python网络爬虫之requests模块