python学习笔记(四):网络爬虫基础

网络爬虫

爬虫一种按照一定的规则,自动抓取万维网信息的程序或脚本。
用户获取网络数据的方式浏览器提交请求,下载网页代码,解析/渲染成页面。
爬虫的方式是模拟浏览器发送请求,下載网页代码,只提取有用的数据存放于数据库或文件中。
区别爬虫程序只提取网页代码中对我们有用的数据,并且爬虫 抓取速度快,量级大。

网络爬虫的规模

小规模中规模大规模
数据量小数据规模较大搜索引擎
爬取速度不敏感爬取速度敏感爬取速度关键
爬取网页爬取网站爬取全网
requests库scrapy库定制开发

网络爬虫的限制

  • 来源审查: 判断User-Agent进行限制,检查来访HTTP协议头的User-Agent域,只响应浏览器或友好爬虫的访问。
  • robots协议: 告知所有爬虫网站的爬取策略,要求爬虫遵守。可在所爬取网站根目录后加 /robots.txt 查看文件。
    在这里插入图片描述

requests库

函数描述
request()构造一个请求
get()获取HTML网页的主要内容,对应于HTTP的GET
head()获取HTML网页的头信息,对应于HTTP的HEAD
post()向HTML网页提交POST请求,对应于HTTP的POST
put()向HTML网页提交PUT请求,对应于HTTP的PUT
patch向HTML网页提交局部修改请求,对应于HTTP的PATCH
delete()向HTML网页提交删除请求,对应于HTTP的DELETE
r = requests.get(url)
构造了一个向服务器请求资源的 Request 对象
返回了一个包含服务器资源的 Response 对象
属性描述
r.status_codeHTTP的返回状态,200表示成功
r.textHTTP响应内容的字符串形式,即url对应的页面内容
r.endoding从HTTP header中猜测的响应内容编码方式
r.apperent_encoding从内容中分析出的响应内容编码方式
r.contentHTTP响应内容的二进制形式
爬取网页的通用代码框架
def getHTMLText(url):
	try:
		r = requests.get(url, timeout=30)
		r.raise_for_status()
		r.encoding = r.apparent_encoding
		return r.text
	except:
		return "产生异常"

BeautifulSoup4库

使用requests 库获取HTML 页面并将其转换成字符串后,需要进一步解析 HTML页面格式,提取有用信息,这需要处理HTML 和XML 的函数库。
beautifulsoup4 库采用面向对象思想实现,简单说,它把每个页面当做一 个对象,调用对象的属性(即包含的内容),或者调用方法(即处理函数)。
在这里插入图片描述
用from…import 方式从库中直接引用BeautifulSoup 类,或直接 import bs4,方法如下。

from bs4 import BeautifulSoup
import bs4

beautifulsoup4库第三方库主页: https://www.crummy.com/software/BeautifulSoup/

BeautidulSoup4库解析器使用方式条件
bs4的HTML解析器BeautifulSoup(mk, ‘html.parser’)安装bs4库
lxml的HTML解析器BeautifulSoup(mk, ‘lxml’)pip install lxml
lxml的XML解析器BeautifulSoup(mk, ‘xml’)pip install xml
html5lib的解析器BeautifulSoup(mk, ‘html5lib’)pip install html5lib
import requests 
from bs4 import BeautifulSoup 
url="http://www.baidu.com"
r=requests.get(url)
r.encoding=r.apparent_encoding
soup=BeautifulSoup(r.text,'html.parser')
type(soup) 
标签对象的常用属性类型描述
name字符串标签的名字,例如 div
attrs字典包含了原来页面Tag中的所有属性,比如 href
contents列表这个标签下所有子标签的内容
string字符串Tag所包围的文本,网页中真实的文字
下行遍历方法描述
.contents子结点的列表,将 <tag> 的所有子结点存入列表
.children子结点的迭代类型,与contents类似,用于循环遍历子结点
.descendants子孙结点的迭代类型,包含所有子孙节点,用于循环遍历
上行遍历方法描述
.parent节点的父标签
.parents节点的先辈标签的迭代类型,用于循环遍历先辈标签

简单爬虫实例

http://www.fortunechina.com/fortune500/c/2019-07/10/content_337536.htm 网址爬取2019年中国前500强排行榜并绘制柱状图。

import requests
import json
import csv
import pandas as pdfrom bs4 
import BeautifulSoup
import matplotlib.pyplot as pltimport numpy as np
from locale import *

try:    r = requests.get("http://www.fortunechina.com/fortune500/c/2019-07/10/content_337536.htm")

soup = BeautifulSoup(r.text, 'html.parser')
soup.tbody.find_all('tr')
allUniv = []titleUniv = []  
for tr in data:
  singleUniv = []
  lname = tr.find_all('a')
  ltd = tr.find_all('td')    
  for td in ltd:        
  	singleUniv.append(td.string)    
  for name in lname:        
  	singleUniv[2] = name.string    
  allUniv.append(singleUniv)

dataUniv = []
for i in allUniv:
    i = i[2:]    
    dataUniv.append(i)
form = pd.DataFrame(dataUniv)
file_name = 'form.csv'
form.to_csv(file_name ,encoding='utf-8_sig')#存储数据到csv文件并防止生成乱码
form = pd.DataFrame(dataUniv[:10])

plt.rcParams['font.sans-serif']=['Simhei'] 
plt.rcParams['axes.unicode_minus']=Falseform.drop([0], axis=1)
lname = [i for i in form[0]]
turnover = [i for i in form[1]]profit = [i for i in form[2]]

setlocale(LC_NUMERIC, 'English_US')#处理数据中所含的千分号d
ata1 = []
for d in turnover:    
	data1.append(atof(d))
data2 = []
for d in profit:    
	data2.append(atof(d))

index = np.arange(len(form[0]))#绘制柱状图
plt.figure(figsize=(20, 10))
width = 0.15plt.title('中国十大企业营业额和营业利润柱状图', fontsize = 20)
plt.bar(index, data1, width = width, color = 'c', align = 'center', label = '营业额',tick_label = lname, alpha = 0.5)
plt.bar(index + width, data2, width = width, color = 'r', align = 'center', label = '营业利润', alpha = 0.5)
plt.xticks(rotation=-10)
plt.legend()
plt.show()

在这里插入图片描述

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值