python爬虫学习(二):定向爬虫例子-->使用BeautifulSoup爬取"软科中国最好大学排名-生源质量排名2018",并把结果写进txt文件
在正式爬取之前,先做一个试验,看一下爬取的数据对象的类型是如何转换为列表的:
写一个html文档:
x.html
<html><head><title>This is a python demo page</title></head>
<body>
<p class="title">
<a>The demo python introduces several python courses.</a>
<a href="http://www.icourse163.org/course/BIT-133" class="py1" id="link1">Basic Python</a>
</p>
<p class="course">Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses:
<a href="http://www.icourse163.org/course/BIT-268001" class="py1" id="link1">Basic Python</a> and
<a href="http://www.icourse163.org/course/BIT-1001870001" class="py2" id="link2">Advanced Python</a>
</p>
</body></html>
# coding:utf-8 from bs4 import BeautifulSoup
import requests
import bs4 soup = BeautifulSoup(open('D:/x.html', encoding='utf-8'), "html.parser")
print(soup.find('body',).children) # .children返回可迭代对象,不是列表,需要用for循环遍历其中的内容 for t in soup.find('body').children: 迭代<body>标签的儿子节点
if isinstance(t, bs4.element.Tag): # 判断子节点是否为Tag对象(因为子节点会包含如换行符之类的节点)
print('body的子标签的内容是:', t) # 查看t变量获得的对象内容,body的子标签为p标签,一组<p></p>表示一个对象
print('t的类型是:', type(t)) # 查看t的类型
可以看到每个t对象的类型是bs4.element.Tag,也就是标签对象。
那么,如果要从每个t对象中获取a标签的内容,并把所有a标签都保存到一个列表中,该如何做?
可以使用:
list = t('a') # t('a')会生成一个bs4.element.ResultSet类型的数据对象,实际上就是Tag列表
for t in soup.find('body').children:
if isinstance(t, bs4.element.Tag): # 判断子标签是否为Tag对象(因为子节点会包含如换行符之类的节点)
# print('body的子标签的内容是:', t) # 查看t变量获得的对象内容
# print('t的类型是:', type(t)) # 查看t的类型
list = t('a') # 循环获取每个t对象中的所有a标签,并保存到一个列表中
print(list)
print(type(list))
print('每个p标签的第一个a标签的内容:', list[0].string) # a标签保存到列表后,便可以利用列表方法解析出其中的具体每个a标签对象,并利用.string获取标签字符串
接下来就可以正式编写爬虫了:
分析网页源代码
可以看到需要的一些信息如大学排名、大学名称、地址、分数等分别在如图标注的地方,每个大学信息所在的标签结构如下:所有大学信息都在<tbody>标签下,每个大学都在各自的<tr>标签,然后大学自身的排名、名称、地址等信息都分别由一个<td>标签包裹。
思路如下:先找到<tbody>下的所有标签内容,然后再从中找出所有<tr>标签内容(为什么不直接用find_all()找<tr>?因为不只有我们需要的大学信息用到了<tr>标签,<tbody>之外也有用到<tr>标签来包裹内容的)。
我要把每个学校的“排名、名称、地址、分数”的值都取出来,并且把每组数据都各自装在一个列表中,然后再把每个列表依次加到一个大列表里
(1)直接处理数据
from bs4 import BeautifulSoup
import requests
import bs4 url = 'http://www.zuihaodaxue.com/shengyuanzhiliangpaiming2018.html'
r = requests.get(url) r.encoding = r.apparent_encoding # 转换编码,不然中文会显示乱码,也可以r.encoding = 'utf-8'
html = r.text
soup = BeautifulSoup(html, 'html.parser') # 获取爬取网页的BeautifulSoup对象 for tr in soup.find('tbody').children:
if isinstance(tr, bs4.element.Tag):
td = tr('td')
print(td)
t = [td[0].string, td[1].string, td[2].string, td[3].string] # 把每个学校解析出的数据各自装到一个列表中
print(t)
打印td的结果:
打印t的结果如下,其实排名信息已经可以看出来了
然后依次把每个大学信息写入一个文本文档:
from bs4 import BeautifulSoup
import requests
import bs4 url = 'http://www.zuihaodaxue.com/shengyuanzhiliangpaiming2018.html'
r = requests.get(url) r.encoding = r.apparent_encoding # 转换编码,不然中文会显示乱码,也可以r.encoding = 'utf-8'
html = r.text
soup = BeautifulSoup(html, 'html.parser') # 获取爬取网页的BeautifulSoup对象 for tr in soup.find('tbody').children:
if isinstance(tr, bs4.element.Tag):
td = tr('td')
t = [td[0].string, td[1].string, td[2].string, td[3].string] # 把每个学校解析出的数据各自装到一个列表中print(t)
with open('D:/test.txt','a') as data: # 以'a'模式打开文件,即可不停的追加写入而不改变原内容
print(t, file=data)
(2)把代码封装,写到函数中
# coding:utf-8
import requests
import bs4
from bs4 import BeautifulSoup def get_html(url):
"""定义获取网页源码函数"""
try:
r = requests.get(url, timeout=20)
r.encoding = r.apparent_encoding
return r.text
except:
return None def get_data(html, list):
"""定义从网页源码获取数据并处理数据函数"""
soup = BeautifulSoup(html, 'html.parser')
for tr in soup.find('tbody').children:
if isinstance(tr, bs4.element.Tag):
td = tr('td')
t = [td[0].string, td[1].string, td[2].string, td[3].string] # 把每个学校解析处的数据各自装到一个列表中
list.append(t) # 把每个学校信息列表都追加到一个大列表中,方便后面写入文件
# return list # 不能加return,造成的后果就是第一次循环时就把结果返回出去了,只取到了第一条数据 def write_data(ulist, num): # num参数,控制提取多少组数据写入文件
"""定义把数据写入文件函数"""
for i in range(num):
u = ulist[i]
with open('D:/test.txt', 'a') as data:
print(u, file=data) if __name__ == '__main__':
list = [] # 我之前是把list=[]放到get_data()函数的for循环里面了,导致每次循环都会先清空列表,然后再追加数据,结果最后遍历完只剩最后一组数据。。。
url = 'http://www.zuihaodaxue.com/shengyuanzhiliangpaiming2018.html'
html = get_html(url)
get_data(html, list)
write_data(list, 20)
把结果输出到屏幕(老师给出的代码)
# coding: utf-8 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):
# tds = tr('td')
# ulist.append([tds[0].string, tds[1].string, tds[2].string, tds[3].string])
#
#
#
# def printUnivList(ulist, num):
# print("{:^10}\t{:^6}\t{:^10}\t{:^10}".format('排名', '学校名称', '地区', '总分'))
# for i in range(num):
# u = ulist[i]
# print("{:^10}\t{:^6}\t{:^10}\t{:^10}".format(u[0], u[1], u[2], u[3]))
#
#
# def main():
# uinfo = []
# url = 'http://www.zuihaodaxue.com/shengyuanzhiliangpaiming2018.html'
# html = GetHTMLText(url)
# fillUnivList(uinfo, html)
# printUnivList(uinfo, 20)
# return uinfo
#
#
# if __name__ == '__main__':
# t = main()
python爬虫学习(二):定向爬虫例子-->使用BeautifulSoup爬取"软科中国最好大学排名-生源质量排名2018",并把结果写进txt文件的更多相关文章
- python爬虫学习(三):使用re库爬取"淘宝商品",并把结果写进txt文件
第二个例子是使用requests库+re库爬取淘宝搜索商品页面的商品信息 (1)分析网页源码 打开淘宝,输入关键字“python”,然后搜索,显示如下搜索结果 从url连接中可以得到搜索商品的关键字是 ...
- Python爬虫学习==>第十章:使用Requests+正则表达式爬取猫眼电影
学习目的: 通过一个一个简单的爬虫应用,初窥门径. 正式步骤 Step1:流程框架 抓取单页内容:利用requests请求目标站点,得到单个页面的html代码,返回结果: 正则表达式分析:根据html ...
- 爬虫学习(九)——登录获取cookie爬取
import urllib.requestimport urllib.parseimport http.cookiejar # http.cookiejar 该包是专门对网页的cookie只进行获取的 ...
- 2.Python爬虫入门二之爬虫基础了解
1.什么是爬虫 爬虫,即网络爬虫,大家可以理解为在网络上爬行的一直蜘蛛,互联网就比作一张大网,而爬虫便是在这张网上爬来爬去的蜘蛛咯,如果它遇到资源,那么它就会抓取下来.想抓取什么?这个由你来控制它咯. ...
- Python爬虫入门二之爬虫基础了解
1.什么是爬虫 爬虫,即网络爬虫,大家可以理解为在网络上爬行的一直蜘蛛,互联网就比作一张大网,而爬虫便是在这张网上爬来爬去的蜘蛛咯,如果它遇到资源,那么它就会抓取下来.想抓取什么?这个由你来控制它咯. ...
- 转 Python爬虫入门二之爬虫基础了解
静觅 » Python爬虫入门二之爬虫基础了解 2.浏览网页的过程 在用户浏览网页的过程中,我们可能会看到许多好看的图片,比如 http://image.baidu.com/ ,我们会看到几张的图片以 ...
- Python爬虫学习之使用beautifulsoup爬取招聘网站信息
菜鸟一只,也是在尝试并学习和摸索爬虫相关知识. 1.首先分析要爬取页面结构.可以看到一列搜索的结果,现在需要得到每一个链接,然后才能爬取对应页面. 关键代码思路如下: html = getHtml(& ...
- PYTHON 爬虫笔记九:利用Ajax+正则表达式+BeautifulSoup爬取今日头条街拍图集(实战项目二)
利用Ajax+正则表达式+BeautifulSoup爬取今日头条街拍图集 目标站点分析 今日头条这类的网站制作,从数据形式,CSS样式都是通过数据接口的样式来决定的,所以它的抓取方法和其他网页的抓取方 ...
- Python基础学习二
Python基础学习二 1.编码 utf-8编码:自动将英文保存为1个字符,中文3个字符.ASCll编码被囊括在内. unicode:将所有字符保存为2给字符,容纳了世界上所有的编码. 2.字符串内置 ...
随机推荐
- yum指定安装目录
纯粹做笔记 yum -c /etc/yum.conf --installroot=/opt/test/ --releasever=/ install lrzsz
- 线程同步——用户模式下线程同步——Slim读写锁实现线程同步
//Slim读/写锁实现线程同步 SRWlock 的目的和关键段相同:对同一资源进行保护,不让其它线程访问. 但是,与关键段不同的是,SRWlock允许我们区分哪些想要读取资源的线程(读取者线程) 和 ...
- [error] 2230#2230: *84 client intended to send too large body: 1711341 bytes
centos7 lnmp部署知乎上传主体报错 2019/01/17 18:55:27 [error] 2230#2230: *89 open() "/code/wordpress/favic ...
- sha0dow0socks
秋水的一键安装脚本 #!/usr/bin/env bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bi ...
- 今日头条 CEO 张一鸣:面试了 2000 个年轻人,混得好的都有这 5 种特质
https://blog.csdn.net/qq_35246620/article/details/72801285 博主说:多了解了解总是好的. 正文 张一鸣算是 80 后中绝对的佼佼者.1983 ...
- 【系列教程1】Gradle入门系列一:简介
Gradle是一种构建工具,它抛弃了基于XML的构建脚本,取而代之的是采用一种基于Groovy的内部领域特定语言.近期,Gradle获得了极大的关注. 这篇文章是Gradle教程的第一篇,我们有两个目 ...
- methods 方法选项
最简单的使用方法,一个数字,每点击一下按钮加1 html <div id="app"> <span v-text="number">&l ...
- 【前端开发工具】WijmoJS 2018 v3 正式发布,全面支持Angular7
WijmoJS(前端开发工具包)2018年度第三个大版本已经正式发布,本次更新除了全面支持Angular7之外,还允许用户使用Web Workers在前端更高效地导出PDF.智能的分组表头属性.全新的 ...
- 所有JTAG集成电路都应该支持菊花链
菊花链 在电气和电子工程中,菊花链是一种布线方案,其中多个设备按顺序或环形连接在一起.相邻设备才能通信.菊花链可用于电源,模拟信号,数字数据或其组合. 但是由于菊花链的串联特性,如果任何一个设备从链路 ...
- HDU 4496 D-City(逆向并查集)
http://acm.hdu.edu.cn/showproblem.php?pid=4496 题意: 给出n个顶点m条边的图,每次选择一条边删去,求每次删边后的连通块个数. 思路: 离线处理删边,从后 ...