数据采集与预处理02 :网络爬虫实战

数据采集与预处理02 :网络爬虫实战

爬虫基本知识

1 HTTP的理解

URL uniform resource locator. 是统一资源定位符,URI identifier是统一资源标识符。几乎所有的URI都是URL。

URL前部一般可以看到是HTTP还是HTTPS, 这是访问资源需要的协议类型。HTTP hyper text transfer protocol 是客户端和服务器端请求和应答的标准,是互联网中应用最为广泛的一种协议。

HTTPS是以安全为目标的HTTP通道,加入了SSL层。

2 网页基础知识

网页的组成分为三大部分,HTML、CSS(Cascading Style sheets)层叠样式表、javascript。

在网页中,组织页面的对象被渲染成一个树形结构,用来标识文档中对象的准确模型,称为文档对象模型 Document Object Model DOM。

点击查看图片来源

3 爬虫基本原理

网络爬虫本质上就是获取网页并提取和保存信息的自动化程序。

爬虫的首要工作就是获取网页源代码,再从中提取想要的数据。urllib requests等库都能够实现HTTP请求的操作。

获取网页源代码后,接下来的工作就是分析网页源代码,最通用的方式是使用正则表达式。在python中,使用BeautifulSoup PyQuery LXML等库,可以更高效的从源代码中提取网页信息。

提取信息之后,可以将数据保存到本地,以便后续使用。

点击查看图片来源

4. 基本库的使用

以下基于python3.8

4.1 urllib

urllib库是python中一个功能强大,用于操作URL并在制作爬虫过程中经常用到的库。

发送请求:
import urllib.request

r=urllib.request.urlopen("HTTP://www.python.org/")
print(r)
读取响应内容
import urllib.request
url="HTTP://www.python.org/"
with urllib.request.urlopen(url) as r:
    r.read()

r.read() 将相应内容读到内存。

传递URL参数
import urllib.request
import urllib.parse
params=urllib.parse.urlencode({'q':'urllib','check_keywords':'yes','area':'default'})
url="HTTPS://docs.python.org/3/search.html?{}".format(params)
r=urllib.request.urlopen(url)
传递中文参数
import urllib.request
searchword=urllib.request.quote(input("请输入要查询的关键字:"))
url="HTTPS://cn.bing.com/images/async?q={}&first=0&mmasync=1".format(searchword)
r=urllib.request.urlopen(url)
print(r)
定制请求头
import urllib.request
url="链接"
headers={
'User-Agent':……
'Referer':……
req=urllib.request.Request(url,headers=headers)
r=urllib.request.urlopen(req)
}
传递POST请求
import urllib.request
import urllib.parse
url="链接"
post={
'username':'xxx'
'password':'xxxxx'
}

postdata=urllib.parse.urlencode(post).encode('utf-8')
req=urllib.request.Request(url,postdata)
r=urllib.request.urlopen(req)
下载远程数据到本地

urllib.request.urlretrieve(url,"python-logo.png)

另外患有设置代理、异常处理和Cookie的使用,不再赘述。

4.2 BeautifulSoup

BeautifulSoup提供一些简单的,python方式的函数处理导航、搜索、修改分析树等功能。

创建BeautifulSoup对象
from bs4 import BeautifulSoup
soup=BeautifulSoup(html)
print soup.prettify()
四大对象类

BeautifulSoup将复杂的HTML文档转换称为一个复杂的树形结构,归纳为4种:Tag , NavigableString, BeautifulSoup, Comment.

Tag就是一个个标签。

print soup.title
print soup.head
print soup.a
print soup.p

NavigalbeString

不仅可以得到标签内容,还可以通过“.string”获取标签内部的文字。

print soup.p.string

BeautifulSoup

BeautifulSoup对象表示一个文档的全部内容。

print type(soupp.name)

comment

comment对象是一个特殊类型的NavigableString对象,其输出内容不包括注释符号。

遍历

Tag的contents属性可以使Tag的子节点以列表方式输出。

print soup.head.contents
print soup.head.contents[0]

Tag的children返回的不是一个list,而是list生成器对象,可以用来遍历获取所有子节点。

descendants可以对所有子孙结点进行递归循环。

如果Tag只有一个NavigableString类型的子节点,那么Tag可以使用string得到子节点。

使用.stripped_strings可以去除多余空白内容。

使用元素的.parent属性可以获取父节点。

搜索

使用 find_all()搜索

  • name参数 用来查找所有名称为name的tag。
#传字符串
soup.find_all('b')

# 传正则表达式
import re
for tag in soup.find_all(re.compile("^b")):
	print(tag.name)

#传列表
soup.find_all(["a","b"])

#传True
for tag in soup.find_all(True):
	print(tag.name)
  • attrs参数
data_soup.find_all(data-foo="value")

data_soup.find_all(attrs={"data-foo":"value"})
  • recursive参数
soup.html.find_all("title",recursive=False)
# recursive=True意味着直接检索子节点
  • text参数

通过text参数可以搜索文档中的字符串内容。

soup.find_all(text="test1")
  • limit参数
soup.find_all("a",limit=2)
#限制返回数量
select()

使用soup.select()方法从css中筛选,返回类型是list。

print soup.select('title')
print soup.select("a")

print soup.select(#id值)

print ("head>title")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/344617.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode: 36. 有效的数独 + 模拟】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

不同知识表示方法与知识图谱

目录 前言1 一阶谓词逻辑1.1 简介1.2 优势1.3 局限性 2 产生式规则2.1 简介2.2 优势2.3 局限性 3 框架系统3.1 简介3.2 优势3.3 局限性 4 描述逻辑4.1 简介4.2 优势4.3 局限性 5 语义网络5.1 简介5.2 优势5.3 局限性 结语 前言 知识表示是人工智能领域中至关重要的一环&#x…

jQuery遍历(其他遍历)

1、.add&#xff08;&#xff09;: 添加元素到匹配的元素集合 例一&#xff1a; <script> $(document).ready(function(){ $("div").add("p").css("background-color","red") }) </script…

达梦数据库Windows安装教程:从准备到完成

目录 博客前言&#xff1a; 一.达梦数据库安装前准备 1.下载 2.进行解压 装载 二.正式安装 选择语言与时区 安装向导 许可证协议 验证 Key 文件 选择安装组件 选择安装目录 安装前小结 数据库安装 数据库安装完成 三.配置实例 选择操作方式 创建数据库模板 选…

51单片机LCD1602调试工具

参考视频&#xff1a;江协科技51单片机 LCD1602头文件代码 #ifndef __LCD1602_H__ #define __LCD1602_H__//用户调用函数&#xff1a; void LCD_Init(); void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char); void LCD_ShowString(unsigned char Line,un…

关于Cortex-M4处理器和核心外设

Cortex-M4处理器是一款专为微控制器市场设计的高性能32位处理器。它为开发人员提供了显著的好处&#xff0c;包括&#xff1a; 出色的处理性能与快速中断相结合增强的系统调试&#xff0c;具有广泛的断点和跟踪功能高效的处理器核心&#xff0c;系统和存储器超低功耗集成睡眠模…

【手撕C语言 第八集】函数栈帧的创建与销毁

文章目录 一、什么是函数栈帧&#xff1f;二、函数栈帧能解决什么问题呢&#xff1f;&#xff08;1&#xff09;局部变量是如何创建的&#xff1f;&#xff08;2&#xff09;为什么局部变量不初始化内容是随机的&#xff1f;&#xff08;3&#xff09;函数调用时参数是如何传递…

C语言第七弹---循环语句

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 循环语句 1、while循环1.1、if和while的对比1.2、while语句的执行流程1.3、while循环的实践1.4、练习 2、for循环2.1、语法形式2.2、for循环的执行流程2.3、for循…

Qt 多次绘图

使用Qt 的时候发现&#xff1a; 背景&#xff1a;自己定义一个类&#xff0c;把它和某个ui文件绑定。(类似 Qt creator 默认创建的工程&#xff09;问题&#xff1a;当鼠标在窗口内单击的时候会触发2次绘图。&#xff1f;难道不应该是一次吗&#xff1f; 于是开始了如下的测试…

linux安装python3.11

yum -y install gcc-c zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel下载地址 https://www.python.org/ftp/python/3.11.7/Python-3.11.7.tar.xz 上传python文件&…

uniapp+vue3+ts--编写微信小程序对接e签宝签署时跳转刷脸效果(人脸识别)中间页代码

uniappvue3ts–编写微信小程序对接e签宝签署时跳转刷脸效果&#xff08;人脸识别&#xff09;中间页代码 e签宝内嵌H5方式集成签署页的文档说明&#xff1a;https://open.esign.cn/doc/opendoc/case3/ahb0sg 签署时跳转刷脸效果示意图&#xff1a; 1. 在文件夹新建一个文件&a…

GitHub提交 / 拉取时 443 fatal: unable to access ‘https:

这个问题嘛 懂得都懂 但是用了魔法后依旧会出现443错误 排查了工具发现并不是工具的问题 修改一下git代理即可解决 解决方法如下 确保魔法可用的情况下 打开魔法 打开系统设置 > 网络和Internet > 代理 找到自己的代理IP 如下 这里以我的代理IP和端口举例 在…

黑马程序员JavaWeb开发|Maven高级

一、分模块设计与开发 分模块设计&#xff1a; 将项目按照功能拆分成若干个子模块&#xff0c;方便项目的管理维护、扩展&#xff0c;也方便模块间的相互调用&#xff0c;资源共享。 注意&#xff1a;分模块开发需要先对模块功能进行设计&#xff0c;再进行编码。不会先将工…

使用ElEment组件实现vue表单校验空值

1.绑定表单组件数组rules 2.在data域中设定组件rules 3.设定调用方法函数 提交校验 取消&#xff1a; 测试页面 提交空值 失去焦点 取消重置 提交后重置

完美解决:“已损坏,无法打开。 您应该将它移到废纸篓。”

1、Mac为什么会出现这个问题&#xff0c;懂得都懂&#xff08;/dogo&#xff09;。 2、首先看一下系统中的安全性与隐私设置&#xff0c;是否选择了任意来源&#xff0c;如果没有解锁设置。 3、如果还是报错&#xff0c;就可以祭出大招了&#xff0c;给文件赋予安全性设置。在…

AI分割一切模型SAM(Segment Anything Model)的C++部署

2023年最火爆的分割模型莫过于SAM&#xff0c;截止今天2024年1月19日&#xff0c;github上的star已经达到了41.7k的惊人数量。下面我们来体会一下如何运行这个模型&#xff0c;以及如何用C部署这个模型。 检查cuda环境 我的Cuda版本是12.0.1&#xff0c;如下&#xff0c; Cudn…

03.Elasticsearch应用(三)

Elasticsearch应用&#xff08;三&#xff09; 1.核心概念介绍 注意&#xff1a;类型&#xff08;Type&#xff09; 6.0之前的版本有Type概念&#xff0c;type相当于关系型数据库的表&#xff0c;ES官方将在ES9版本中彻底删除Type。7里面Type为ES默认的类型_doc 2.Cat API 介…

Matlab|基于改进遗传算法的储能选址定容(可任意设定储能数量)

目录 主要内容 部分代码 结果一览&#xff08;以3个储能为例&#xff09; 下载链接 主要内容 该模型采用改进遗传算法优化配电网系统中储能选址位置和容量&#xff0c;程序以IEEE33节点系统为分析对象&#xff0c;以网损最小为目标&#xff0c;采用matpower实现系…

diffusion入门

1. diffusion model 概念 https://zhuanlan.zhihu.com/p/638442430 这篇博客写得很好&#xff0c;顺便做一点笔记记录一下。 原博客附带的代码也很清晰易懂。 1.1 前向过程 后一个过程等于前一个结果的均值乘上sqrt(1-beta_t), 再加上方差beta_t的噪声。 这样下去可以得到 x…

每日一道算法题 16(2023-12-29)

package com.tarena.test.B20; import java.util.Arrays; import java.util.Scanner; /** * * 题目描述&#xff1a; 输入一个由n个大小写字母组成的字符串&#xff0c;按照Ascii码从小到大的排序规则&#xff0c;查找字符串中第k个最小ascii码值的字母&#xff08;k>…