欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python简单爬虫

程序员文章站 2022-05-29 08:12:53
简单抓取网页的代码 import requests#导入requests包 from bs4 import BeautifulSoup#从bs4中导入BeauifulSoup包 import re#导入正则表达式的包 r = requests.get("http://baidu.com") r.en ......

简单抓取网页的代码

import requests#导入requests包
from bs4 import beautifulsoup#从bs4中导入beauifulsoup包
import re#导入正则表达式的包

r = requests.get("http://baidu.com")
r.encoding = 'utf-8'#就没有进行其他异常判断了,做个简单的html网页的爬虫
soup = beautifulsoup(r.text)
type(soup)#查看当前soup对象的类型
r.head#此后就可以抓取rr对象的属性了,比如head,title,body等

如果要抓取本地的静态网页的代码的话,我曾经抓取不成功,但是我想了其他的办法,还是使用上述代码,只不过url地址换成了本地的文件地址了而已,需要注意的是,我是在idea里面编写并且运行我的html代码的,并且通过idea生成了一个本地局域网的端口,复制它的路径,再导入url中,即可抓取本地静态html代码,如果我把这个浏览器或则idea关了的话,则python抓取的时候则会报错。

下面是爬虫爬取大学排名的代码:

import requests
from bs4 import beautifulsoup
alluniv = []#建立一个二维列表,存储所有表格信息
def gethtmltext(url):#获取传入的地址
    try:#进行异常的处理
        r = requests.get(url,timeout = 30)#参数1:某网页的url地址,参数2:设定每次请求超时时间为n秒
        r.raise_for_status()#如果次参数不是200,则产生异常,进入异常处理语句,否则程序继续往下走
        r.encoding = 'utf-8'#将获取的内容转码,使中文能够正常显示而不会产生乱码
        return r.text#http相应内容的字符串形式,即url对应的页面内容
    except:
        return ""
def fillunivlist(soup):
    data = soup.find_all('tr')#通过soup对象的find_all属性找到抓取的网页中的所有tr标签
    for tr in data:
        ltd = tr.find_all('td')#再在每个tr标签中找到所有的td标签
        if len(ltd) == 0:#如果这一行的tr中的td标签数为0个的话,则跳过这个tr,继续进行下一个
            continue
        singleuniv = []#将这个大学的各项信息载入列表
        for td in ltd:
            singleuniv.append(td.string)#提取已载入singleuniv列表的td标签中的信息,
        alluniv.append(singleuniv)#提取singleuniv列表中的信息到alluniv列表中
def printunivlist(num):
    print("{1:^2}{2:{0}^10}{3:{0}^6}{4:{0}^4}{5:{0}^10}".format(chr(12288),"排名","学校名称","省份","总分","培养规模"))#注意输出格式的控制
    for i in range(num):
        u = alluniv[i]
        print("{1:^2}{2:{0}^10}{3:{0}^6}{4:{0}^4}{5:{0}^10}".format(chr(12288),u[0],u[1],u[2],eval(u[3]),u[6]))
def main(num):
    url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html'#设定网页的地址
    html = gethtmltext(url)#将url地址传入函数,返回字符串形式给变量html
    soup = beautifulsoup(html,"html.parser")#生成一个soup的对象,此时soup就是一个beautifulsoup对象
    fillunivlist(soup)#将soup对象传入函数
    printunivlist(num)
main(300)
            

在代码中都有详细的注释即理解,希望对你有所帮助。

下面是搜索关键字自动提交的爬虫代码:

import requests
from bs4 import beautifulsoup
import re
import json
def getkeywordresult(keyword):
    url = 'http://www.baidu.com/s?wd='+keyword
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        r.encoding = 'utf-8'
        return r.text
    except:
        return ""
def parserlinks(html):
    soup = beautifulsoup(html, "html.parser")
    links = []
    for div in soup.find_all('div', {'data-tools': re.compile('title')}):
        data = div.attrs['data-tools']  #获得属性值
        d = json.loads(data)        #将属性值转换成字典
        links.append(d['title'])    #将返回链接的题目返回
    return links
def main():
    html = getkeywordresult('python语言程序设计基础(第2版)')
    ls = parserlinks(html)
    count = 1
    for i in ls:
        print("[{:^3}]{}".format(count, i))
        count += 1
main()

相关操作与其步骤的含义与其上的代码如出一辙,请仔细参悟

下面给出requests库的相关属性

requests库是一个简洁且简单的处理http请求的第三方库,它的最大优点是程序边学过程更接近正常url访问过程。requests库支持非常丰富的链接访问功能,包括国际域名和url获取、http长连接和连接缓存、http会话和cookie保持、浏览器使用风格的ssl验证、基本的摘要认证、有效的键值对cookie记录、自动解压缩、自动内容解码、文件分块上传、http(s)代理功能、连接超时处理、流数据下载等。

网络爬虫和信息提交只是requests库能支持的基本功能,requests库中的网页请求函数:

get(url,timeout = n)  对应http的get方式,获取网页最常用的方法,可以增加timeout=n参数,设定每次请求超时时间为n秒

post(url,data = {'key':'value'})  对应http的post方式,其中字典用于传递客户数据

delete(url)  对应于http的delete方式

head(url)  对应于http的head方式

options(url)  对应于http的options方式

put(url,data = {'key':'value'})  对应于http的put方式,其中字典用于传递客户数据

requests.get()代表请求过程,它返回的response对象代表响应,response对象的属性如下:

status_code:http请求的返回状态,整数,200表示连接成功,404表示失败

text:http响应内容的字符串形式,即url对应的页面内容

encoding:http响应内容的编码方式

content:http响应内容的二进制形式

response对象的方法:

json():如果http响应内容包含json格式数据,则该方法解析json数据

raise_for_status():如果不是200,则产生异常

-------------------------------------------------------------------------------------------------------------------------

beautifulsoup4库的使用

使用requests库获取html页面并将其转化成字符串后,需要进一步解析html页面格式,提取有用信息,这需要处理html和xml的函数库。beautifulsoup4库,也成为beautiful soup库或者bs4库,用于解析和处理html和xml。需要注意的是,它不是beautifulsoup库。它的最大优点是能根据html和xml语法建立解析树,进而高效解析其中的内容。beautifulsoup4库采用面向对象思想实现,简单地说,它把每个页面当作一个对象,通过<a>.<b>()的凡是调用方法(即处理函数),beautifulsoup中常用的一些属性如下:

head:html页面的<head>内容

title:html页面标题,在<head>之中,有<title>标记

body:html页面的<body>内容

p:html页面中第一个<p>内容

strings:html页面所有呈现在web上的字符串,即标签的内容

stripped_strings:html页面所有呈现在web上的非空格字符串

beautifulsoup属性与html的标签名称相同,远不止这些。

标签对象的常用属性:

name:字符串,标签的名字,比如div

attrs:字典,包含了原来页面tag所有的属性,比如href

contents:列表,这个tag下所有子tag的内容

string:字符串,tag所包围的文本,网页中真是的文字,string属性的返回值遵循如下原则:

(1)如果标签内部没有其他标签,string属性返回其中的内容。

(2)如果标签内部还有其他标签,但只有一个标签,string属性返回最里面标签的内容。

(3)如果标签内部有超过1层嵌套的标签,string属性返回none(空字符串)。

beautifulsoup其中的两个方法(这两个方法会遍历整个html文档,按照条件返回标签内容):

beautifulsboup.find_all(name,attrs,recursive,string,limit)

作用:根据参数找到对应的标签,返回列表类型。参数如下:

name:按照tag标签,名字用字符串形式表示,例如div、li。

attrs:按照tag标签属性值检索,需要列出属性名称和值,采用json表示。

recursive:设置查找层次,只查找当前标签下一层时使用recursive=false。

string:按照关键字检索string属性内容,采用string=开始。

limit:返回结果的个数,默认返回全部结果。

简单地说,beautifulsoup的find_all()方法可以根据标签名字、标签属性和内容检索并返回标签列表,通过片段字符串检索时需要使用正则表达式re函数库,re时python标准库,直接通过import re即可使用。采用re.comlile('jquery')实现对片段字符串(如‘jquery’)的检索。当对标签属性检索时,属性和对应的值采用json格式,例如:'src':re.compile('jquery'),其中,键值对中值的部分可以是字符串或者正则表达式。

除了find_all()方法,beautifulsoup类还提供一个find()方法,它们的区别只是前者返回全部结果而后者返回找到的第一个结果,find_all()函数由于可能返回更多结果,所以采用列表形式:find()函数返回字符串形式。

beautifulsoup.find(name,attrs,recursive,string)

作用:根据参数找到对应标签,采用字符串返回找到的第一个值。

参数:与find_all()方法一样。