您当前的位置: 首页 >  爬虫

暂无认证

  • 2浏览

    0关注

    92582博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

(7) 浅学 “爬虫” 过程 (概念+练习)

发布时间:2022-07-21 17:14:33 ,浏览量:2

爬虫:请求网站并提取数据的自动化程序。 通过编写程序,模拟浏览器上网,然后让其去互联网上抓取数据的过程。

目录

爬虫的分类

Robots协议

常用请求头/响应头、http/s、加密方式

urllib 模块 (比较繁琐)

urllib.request.urlopen()基本使用

requests模块 (简单便捷,接下来都是使用的requests模块)

如何使用:

爬取搜狗首页 

Day1

requests巩固案例

破解百度翻译

Json

爬取豆瓣电影分类排行榜

Ajax(阿贾克斯)

Day2

数据解析

图片爬取

正则解析

bs4解析

如何实例化BeautifulSoup对象:

 提供的用于数据解析的方法和属性:

 获取标签之间的文本数据:

获取标签中属性值:

 bs4解析案例

xpath解析(便捷高效、通用)

如何实例化一个etree对象:

 xpath表达式:

 xpath解析案例之二手房源

xpath解析之图片解析

Day3

验证码识别

Day4

异步爬虫

爬虫的分类

根据使用场景,爬虫可以分为三类:

1.通用爬虫(大而全)

功能强大,采集面广泛,通常用于搜索引擎,比如百度浏览器就是一个很大的爬虫程序。

2.聚焦爬虫(小而精)

建立在通用爬虫的基础上,抓取页面中特定的局部内容,比如说去某个网站批量获取某些数据。

3.增量式爬虫(只采集更新后的内容)

这其实是聚焦爬虫的一个迭代爬虫,检测网站中数据更新情况,只会抓取网站中最新更新的数据。

Robots协议

爬虫中有一个Robots协议,又称为“网络爬虫排除标准”,君子协议,规定了网站中哪些数据可以被爬虫爬取,哪些不可被爬取。一般情况下直接在网站首页网址后面加/robots.txt就能查看,比如百度的Robots协议就在https://www.baidu.com/robots.txt 。

常用请求头/响应头、http/s、加密方式

http协议:就是服务器和客户端进行数据交互的一种形式

https协议:安全的超文本传输协议,采用证书密钥加密

常用请求头:User-Agent(请求载体的身份标识)

                       Connection(请求完毕后,是断开连接还是保持连接)

常用响应头:Content-Type(服务器响应回客户端的数据类型)

加密方式:1.对称密钥加密:客户端将要传输到服务器的参数加密,传输时携带密钥

                   2.非对称密钥加密:服务端创建密钥对,将公钥发给客户端,客户端使用密钥对消息加

                                                     密,将加密信息发给服务端,服务端再用私钥解密。

                    3.证书密钥加密:公开密钥-->证书认证机构-->给公钥签名(防伪)-->证书

urllib 模块 (比较繁琐)

urllib中包括了四个模块:urllib.request,urllib.error,urllib.parse,urllib.robotparser

urllib.request可以用来发送请求request和获取请求request的结果

urllib.error包含了urllib.request产生的异常

urllib.parse用来解析和处理URL

urllib.robotparse用来解析页面的robots.txt文件

urllib.request.urlopen()基本使用

urllib.request 模块提供了最基本的构造 HTTP 请求的方法,利用它可以模拟浏览器的一个请求发起过程,同时它还带有处理 authenticaton (授权验证), redirections (重定向), cookies (浏览器Cookies)以及其它内容。

import urllib.request #导入模块
reaponse=urllib.request.urlopen("URL") #获取网页内容
html=reaponse.read() #读取网页内容,放到html
print(html) #内容以b开头,打印出来是二进制的数据
html2=html.decode('utf-8') #解码
print(html2)
requests模块 (简单便捷,接下来都是使用的requests模块)

requests模块:python中原生的一款基于网络请求到模块,功能强大,简单便捷,效率极高

作用:模拟浏览器发请求

如何使用:

                   1.指定url  2.发起请求  3.获取响应数据  4.持久化存储

爬取搜狗首页 
#爬取搜狗首页

import requests
# 1.指定url
url='https://www.sogou.com/'
# 2.发起请求,get方法会返回一个响应对象
response=requests.get(url=url)
# 3.获取响应数据 .text返回的是字符串形式的响应数据
page_text=response.text
print(page_text)
# 4.持久化存储
with open('./sogou.html','w',encoding='utf-8') as fp:
    fp.write(page_text)
    print('爬取数据结束')
Day1 requests巩固案例

User-Agent:请求载体的身份标识

UA伪装:如果门户网站的服务器会检测对于请求的载体身份标识,如果检测到请求的载体身份标识为某一款浏览器。

注:说明该请求是一个正常请求,但是如果检测到请求的载体身份标识不是基于某一款浏览器的,则表示该请求为不正常请求(爬虫),则服务器端很可能拒绝该次请求,所以在爬虫中进行UA伪装。

破解百度翻译

 post请求(携带了参数),响应数据是一组json数据

import json
import requests
#1.指定url
post_url='https://fanyi.baidu.com/sug'
#2.进行UA伪装
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0'}
#3.post请求参数处理(同get请求一致)
word=input('输入一个单词:')
data={'kw':word}
#4.请求发送
response=requests.post(url=post_url,data=data,headers=headers)
#5.获取响应数据
response.text #获取到字符串类型数据
dic_obj=response.json() #json()方法返回的是一个字典的对象obj(如果确定响应数据是json类型,才可以使用json())
#6.持久化存储
filename=word+'.json'
fp=open(filename,'w',encoding='utf-8')
json.dump(dic_obj,fp=fp,ensure_ascii=False) #(对象,文件,中文)
print('over!!!!!!!')
Json

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。易于人阅读和编写,可以在多种语言之间进行数据交换 [5]  。同时也易于机器解析和生成。

JSON是一个标记符的序列。这套标记符包含六个构造字符、字符串、数字和三个字面名。

JSON是一个序列化的对象或数组。

json.dump() 是把python对象转换成json对象生成一个fp的文件流,和文件相关。ensure_ascii=True:默认输出ASCLL码,如果把这个该成False,就可以输出中文。

Json语法: JSON 语法是 JavaScript 对象表示语法的子集。

  • 数据在名称/值对中
  • 数据由逗号 , 分隔
  • 使用斜杆来转义 \ 字符
  • 大括号 {} 保存对象
  • 中括号 [] 保存数组,数组可以包含多个对象

Json对象:

JSON 对象在大括号 { } 中书写:

{key1 : value1, key2 : value2, ... keyN : valueN }

Json数组:

JSON 数组在中括号 [ ] 中书写:(数组可以包含多个对象)

[
    { key1 : value1-1 , key2:value1-2 }, 
    { key1 : value2-1 , key2:value2-2 }, 
    { key1 : value3-1 , key2:value3-2 }, 
    ...
    { key1 : valueN-1 , key2:valueN-2 }, 
]

JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。

var obj={a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹

var json='{"a": "Hello", "b": "World"}'; //这是一个JSON字符串,本质是一个字符串

要实现从JSON字符串转换为JS对象,使用 JSON.parse() 方法:

var obj = JSON.parse('{"a": "Hello", "b": "World"}'); //结果是 {a: 'Hello', b: 'World'}

要实现从JS对象转换为JSON字符串,使用 JSON.stringify() 方法:

var json = JSON.stringify({a: 'Hello', b: 'World'}); //结果是 '{"a": "Hello", "b": "World"}'' 

爬取豆瓣电影分类排行榜

 滑动滚轮,当滑到底部会加载一组新的电影数据,地址栏(url)没变是做的一个页面的局部刷新,是发起了Ajax(阿贾克斯)请求

import json
import requests
url='https://movie.douban.com/j/chart/top_list'
#将参数封装到字典
param={
        'type':'24',
        'interval_id':'100:90',
        'action':'',
        'start':'0', #从库中第几部电影开始取
        'limit':'20', #一次取多少部电影
        }
headers={'User-Agent':
	'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0'}
response=requests.get(url=url,params=param,headers=headers)
list_data=response.json()
fp=open('./douban.json','w',encoding='utf-8')
json.dump(list_data,fp=fp,ensure_ascii=False)
print('over!!!!!')
Ajax(阿贾克斯)

AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。

AJAX 通过在后台与服务器进行少量数据交换,使网页实现异步更新。这意味着可以在不重载整个页面的情况下,对网页的某些部分进行更新。

 

Day2 数据解析

数据解析原理:解析的局部的内容都会在标签之间或者标签对应的属性中进行存储

                          1.进行指定标签的定位

                          2.标签或者标签对应的属性中存储的数据值进行提取(解析)

聚焦爬虫,是爬取页面中指定的页面内容。首先爬整张页面内容,再将指定内容提取出来,提取过程就叫数据解析。

编码流程:1.指定url

                   2.发起请求

                   3.获取响应数据

                   4.数据解析

                   5.持久化存储

数据解析分类:正则、bs4、xpath

图片爬取
import requests
url='https://wx1.sinaimg.cn/orj360/001DQGfkgy1h46mjn19khj61o02yo1ky02.jpg'
#content返回的是二进制的图片数据
# text (字符串)  content (二进制)  json()  (对象)
img_data=requests.get(url=url).content
with open('./tupian.jpg','wb') as fp:  # w以写方式打开文件,b以二进制方式打开文件(不能单独使用,                  
                                         以wb或者rb组合使用)
	fp.write(img_data)
正则解析
import re
import requests
import os
#创建一个文件夹,保存所有图片
if not os.path.exists('./tupian'):
	os.mkdir('./tupian')
url='https://tieba.baidu.com/f'
header={'User-Agent':
	'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0'}
#使用通用爬虫,对整张页面进行爬取
page_text=requests.get(url=url,headers=header).text
#使用聚焦爬虫对页面中所有图片进行提取(解析)
ex='
		
关注
打赏
1653961664
查看更多评论
立即登录/注册

微信扫码登录

0.7977s