python爬虫

python爬虫

    • 一、Urllib
      • 1、互联网爬虫
      • 2、爬虫的核心
      • 3、爬虫的用途
      • 4、爬虫分类
      • 5、反爬手段
      • 6、urllib库的使用
      • 7、请求对象的定制
      • 8、编解码
      • 9、ajax的get请求
      • 10、ajax的post请求
      • 11、URLError\HTTPError
      • 12、cookie登录
      • 13、Handler处理器
      • 14、代理服务器

一、Urllib

1、互联网爬虫

  • 解释1:通过一个程序,根据Url(http://www.taobao.com)进行爬取网页,获取有用信息。
  • 解释2:使用程序模拟浏览器,去向服务器发送请求,获取响应信息。

2、爬虫的核心

  • 爬取网页:爬取整个网页,包含了网页中所有的内容。
  • 解析数据:将网页中得到的数据进行解析。
  • 难点:爬虫和反爬虫之间的博弈。

3、爬虫的用途

  • 数据分析/人工数据集
  • 社交软件冷启动
  • 舆情监控
  • 竞争对手监控

4、爬虫分类

1)通用爬虫:
实例:百度、360、google、sougou等搜索引擎
功能:访问网页‐>抓取数据‐>数据存储‐>数据处理‐>提供检索服务
robots协议:一个约定俗成的协议,添加robots.txt文件,来说明本网站哪些内容不可以被抓取,起不到限制作用,自己写的爬虫无需遵守。
网站排名(SEO):

  • 根据pagerank算法值进行排名(参考网站流量、点击率等指标)
  • 百度竞价排名

缺点:

  • 抓取的数据大多是无用的
  • 不能根据用户的需求来精准获取数据

2)聚焦爬虫
功能:根据需求,实现爬虫程序,抓取需要的数据
设计思路:
1.确定要爬取的url。
2.模拟浏览器通过http协议访问url,获取服务器返回的html代码。
3.解析html字符串(根据一定规则提取需要的数据)。

5、反爬手段

1)User‐Agent
User Agent:中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
2)代理IP
西刺代理、快代理
什么是高匿名、匿名和透明代理?它们有什么区别?

  • 使用透明代理,对方服务器可以知道你使用了代理,并且也知道你的真实IP。
  • 使用匿名代理,对方服务器可以知道你使用了代理,但不知道你的真实IP。
  • 使用高匿名代理,对方服务器不知道你使用了代理,更不知道你的真实IP。

3)验证码访问
打码平台、云打码平台
4)动态加载网页
网站返回的是js数据,并不是网页的真实数据
5)数据加密
分析js代码

6、urllib库的使用

urllib.request.urlopen() 模拟浏览器向服务器发送请求
response 服务器返回的数据
response 的数据类型是 HttpResponse

  • 字节→字符串:解码decode
  • 字符串→字节:编码encode
方法作用
read()字节形式读取二进制 扩展:rede(5)返回前几个字节
readline()读取一行
readlines()一行一行读取,直至结束
getcode()获取状态码
geturl()获取url
getheaders()获取headers

urllib.request.urlretrieve()请求网页、请求图片、请求视频

7、请求对象的定制

UA介绍:User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本。浏览器内核、浏览器渲染引擎、浏览器语言、浏览器插件等。
语法:request = urllib.request.Request()

8、编解码

1)get请求方式:urllib.parse.quote()

import urllib.request
import urllib.parseheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/120.0.0.0 Safari/537.36'
}url = 'https://www.baidu.com/s?wd='
keyword = urllib.parse.quote('周杰伦')
url = url + keyword
print(url)
request = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')print(content)

2)get请求方式:urllib.parse.urlencode()

import urllib.request
import urllib.parseurl = 'https://www.baidu.com/s?'
data = {'wd': '周杰伦','age': '42','location': '中国台湾'
}
url = url + urllib.parse.urlencode(data)
# print(url)
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/120.0.0.0 Safari/537.36'
}
request = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')print(content)

3)post请求方式

import urllib.request
import urllib.parse
import jsonurl = 'https://fanyi.baidu.com/sug'data = {'kw': 'spider'
}
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/120.0.0.0 Safari/537.36'
}
# post的请求参数必须要进行编码
data = urllib.parse.urlencode(data).encode('utf-8')
request = urllib.request.Request(url=url, data=data, headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
content = json.loads(content)
print(content['data'][0]['v'])

4)post和get区别

  • get请求方式的参数必须编码,参数是拼接到url后面,编码之后不需要调用encode方法。
  • post请求方式的参数必须编码,参数是放在请求对象定制的方法中,编码之后需要调用encode方法。

9、ajax的get请求

import urllib.parse
import urllib.requestdef creat_request(page_arg):url = 'https://movie.douban.com/j/chart/top_list?type=13&interval_id=100%3A90&action=&'data = {'start': (page_arg - 1) * 20,'limit': 20}url = url + urllib.parse.urlencode(data)headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/120.0.0.0 Safari/537.36'}return urllib.request.Request(url=url, headers=headers)def get_content(request_arg):response = urllib.request.urlopen(request_arg)return response.read().decode('utf-8')def download(page_arg, content_arg):with open('douban_' + str(page_arg) + '.json', 'w', encoding='utf-8') as fp:fp.write(content_arg)if __name__ == '__main__':start_page = int(input('请输入起始页码:'))end_page = int(input('请输入结束页码:'))for page in range(start_page, end_page + 1):request = creat_request(page)content = get_content(request)download(page, content)

10、ajax的post请求

import urllib.request
import urllib.parsedef create_request(arg_page):url = 'https://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname'data = {'cname': '广州','pid': '','pageIndex': str(arg_page),'pageSize': '10'}data = urllib.parse.urlencode(data).encode('utf-8')headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/120.0.0.0 Safari/537.36'}request = urllib.request.Request(url=url, data=data, headers=headers)return requestdef get_content(arg_request):response = urllib.request.urlopen(arg_request)content = response.read().decode('utf-8')return contentdef download(arg_page, arg_content):with open('kfc_' + str(arg_page) + '.json', 'w', encoding='utf-8') as fp:fp.write(arg_content)if __name__ == '__main__':for page in range(1, 4):created_request = create_request(page)geted_content = get_content(created_request)download(page, geted_content)

11、URLError\HTTPError

  • HTTPError类是URLError类的子类。
  • 导入的包urllib.error.HTTPErrorurllib.error.URLError
  • http错误:http错误是针对浏览器无法连接到服务器而增加出来的错误提示。引导并告诉浏览者该页是哪里出了问题。
  • 通过urllib发送请求的时候,有可能会发送失败,这个时候如果想让你的代码更加的健壮,可以通过try‐except进行捕获异常,异常有两类,URLError \ HTTPError
import urllib.request
import urllib.errorurl = 'https://blog.csdn.net/m0_52503067/article/details/1308872711'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/120.0.0.0 Safari/537.36'
}
try:request = urllib.request.Request(url=url, headers=headers)response = urllib.request.urlopen(request)content = response.read().decode('utf-8')print(content)
except urllib.error.HTTPError:print('系统正在维护中……')

异常

import urllib.request
import urllib.errorurl = 'https://www.yixinchd.com'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/120.0.0.0 Safari/537.36'
}
try:request = urllib.request.Request(url=url, headers=headers)response = urllib.request.urlopen(request)content = response.read().decode('utf-8')print(content)
except urllib.error.URLError:print('系统正在升级中……')

异常2

12、cookie登录

import urllib.request
# 适用的场景:进行数据采集的时候,需要绕过登录,然后进入某个页面url = 'https://weibo.cn/6348128187/info'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/120.0.0.0 Safari/537.36','Cookie': 'SUB=_2A25IkTqmDeRhGeBN71oQ8ibNwzuIHXVr7zJurDV6PUJbktANLVPfkW1NRH7w-XCjbRc1bX9unbhvkaNW9jZBFLqP; SUBP=00''33WrSXqPxfM725Ws9jqgMF55529P9D9W5UG-o5opBbliwJzv9ep.M35JpX5KzhUgL.Foq0Shnpeonp1hM2dJLoIEBLxKBLB.zLBK-Lx''K-LB.qL1heLxK-L1K5L12eLxK-LB-BLBKqt; SSOLoginState=1704282870; _T_WM=88327e172a5590f58515f50a61044399; ''MLOGIN=1'
}request = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')with open('weibo.html', 'w', encoding='utf-8') as fp:fp.write(content)

13、Handler处理器

  • urllib.request.urlopen(url)不能定制请求头。
  • urllib.request.Request(url,headers,data)可以定制请求头。
  • Handler 定制更高级的请求头。随着业务逻辑的复杂,请求对象的定制已经满足不了我们的需求,动态cookie和代理不能使用请求对象的定制。
# 需求:使用handler访问百度,获取网页源码
import urllib.requesturl = 'https://www.baidu.com'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/120.0.0.0 Safari/537.36'
}request = urllib.request.Request(url=url, headers=headers)
# 1.获取handler对象
handler = urllib.request.HTTPHandler()
# 2.获取opener对象
opener = urllib.request.build_opener(handler)
# 3.调用open方法
response = opener.open(request)content = response.read().decode('utf-8')with open('handler.html', 'w', encoding='utf-8') as fp:fp.write(content)

14、代理服务器

1)代理的常用功能

  • 突破自身IP访问限制,访问国外站点。
  • 访问一些单位或团体内部资源
    扩展:某大学FTP(前提是该代理地址在该资源的允许访问范围之内),使用教育网内地址段免费代理服务器,就可以用于对教育网开放的各类FTP下载上传,以及各类资料查询共享等服务。
  • 提高访问速度
    扩展:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时, 则直接由缓冲区中取出信息,传给用户,以提高访问速度。
  • 隐藏真实IP
    扩展:上网者也可以通过这种方法隐藏自己的IP,免受攻击。

2)代码配置代理

  1. 创建Reuqest对象
  2. 创建ProxyHandler对象
  3. 用handler对象创建opener对象
  4. 使用opener.open函数发送请求
import urllib.request
import urllib.parseurl = 'https://www.baidu.com/s?wd=ip'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/120.0.0.0 Safari/537.36'
}request = urllib.request.Request(url=url, headers=headers)# response = urllib.request.urlopen(request)
proxies = {'http': '121.41.8.23:16817'
}
handler = urllib.request.ProxyHandler(proxies=proxies)
opener = urllib.request.build_opener(handler)
response = opener.open(request)content = response.read().decode('utf-8')with open('dali.html', 'w', encoding='utf-8') as fp:fp.write(content)

3)代理池

import urllib.request
import randomurl = 'https://www.baidu.com/s?wd=ip'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/120.0.0.0 Safari/537.36'
}
proxies_poll = [{'http': '121.41.8.23:16817'},{'http': '121.41.8.23:16817'},
]
proxies = random.choice(proxies_poll)
# print(proxies)
request = urllib.request.Request(url=url, headers=headers)handler = urllib.request.ProxyHandler(proxies=proxies)
opener = urllib.request.build_opener(handler)
response = opener.open(request)
content = response.read().decode('utf-8')with open('daili.html', 'w', encoding='utf-8') as fp:fp.write(content)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Allins 官网正式上线,铭文赛道进入 AMM 交易时代

“Allins 正在通过全新的 AMM 方案为BRC20及多链铭文资产拓展 DeFi 场景,官网的全新上线意味着铭文资产的交易正式进入 AMM 时代。”

java实现大文件分片上传

背景: 公司后台管理系统有个需求,需要上传体积比较大的文件:500M-1024M;此时普通的文件上传显然有些吃力了,加上我司服务器配置本就不高,带宽也不大,所以必须考虑多线程异步上传来提…

(一)CarPlay集成开发之概述与环境篇

系列文章目录 第一章 CarPlay集成开发之概述与环境篇 文章目录 系列文章目录概述开发环境依赖项总结 概述 CarPlay是由苹果公司开发的一款集成在iOS系统中,用于运行在已完成对接该系统的汽车中控台,仪表盘上的车载系统,该系统通过USB或者WI…

java进阶四-深入理解泛型和注解

泛型和注解是框架技术必备的技能 5 泛型5.1泛型理解5.1.1 泛型概念5.1.2 泛型的特点5.1.3 如何理解Java中的泛型是伪泛型?5.1.4 泛型的价值 5.2 泛型语法5.2.1 泛型类5.2.2 泛型接口3.2.3 泛型方法3.2.4泛型的上下边界3.2.5创建泛型数组 5.3泛型应用场景5.3.1数据库…

C++八股学习心得.3

1.C 数组 C 支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个…

dvwa问题篇 -- dvwa出现数据库无法访问的时候,Could not connect to the MySQL service. -- 小黑解决教程

各位小伙伴初次玩dvwa会出现各种问题,本来想把一些问题直接总结写一篇dvwa文章来着,但因为都是关键字搜索,所以将一些问题都拆分出来,以便大家方便查类似问题。(大家有遇到不一样的问题欢迎投稿!&#xff0…

文件夹变0字节文件数据恢复方法

对于许多电脑用户来说,在使用电脑的过程中,经常会遇到一个令人头疼的问题:执行文件夹变0字节文件操作,导致数据丢失。这是一个相当普遍的现象,但遗憾的是,目前相对于其他类型的数据丢失,如删除或…

python c语言 代码动态检查,python c语言语法分析

大家好,小编来为大家解答以下问题,python c语言 代码动态检查,python c语言语法分析,今天让我们一起来看看吧! Source code download: 本文相关源码 初学编程,应该学习哪一门编程语言,有不少人感…

OS 7--DNS配置+Apache发布网站

环境准备 centOS 7 1.配置DNS 1.1 域名为lianxi.com 1.2 为WWW服务器、FTP服务器、NEWS服务器做域名解析 1)安装DNS yum -y install bind bind-utils (如果安装不上,就把磁盘在重洗挂载一下) 2)修改DNS配置文件 vim /etc/resolv.conf…

gookit/color - Go语言命令行色彩使用库教程

gookit/color - Go语言命令行色彩使用库教程 1.安装2.基础颜色(16-color)3.256色彩/RGB风格 1.安装 go get github.com/gookit/color2.基础颜色(16-color) 提供通用的API方法:Print Printf Println Sprint Sprintf 1、例如: color.Yellow.Println(&q…

计算机网络【EPOLL 源码详解】

IO多路复用 在以前,传统的网络编程是多线程模型,一个线程单独处理一个请求。 然而,线程是很昂贵的资源: 线程的创建和销毁成本很高,linux的线程实际上是特殊的进程;因此通常会使用线程池来减少线程创建和…

邮件群发称呼怎么写?写群发邮件开头技巧?

如何写外贸邮件群发称呼?外贸群发邮件开头怎么称呼? 邮件群发已成为企业、个人和组织之间沟通的重要手段。而一个恰当的称呼,不仅能够展现出礼貌和尊重,还能够拉近彼此的距离。那么,如何写好邮件群发的称呼呢&#xf…

Swagger 教程:从零开始学习Swagger

Swagger 是一个开源的 API 设计和文档工具,可以帮助全栈工程师更快、更简单地设计、构建、文档化和测试 RESTful API。本篇文章将为全栈工程师介绍 Swagger 的基础知识和使用方法,以及如何使用 Swagger 设计、文档化和测试 RESTful API。 一、Swagger 简…

关键字:new关键字

在 Java 中,new关键字用于创建对象实例。它是对象创建的语法糖,用于分配内存空间并调用构造函数来初始化对象。 以下是new关键字的基本语法: 在上述语法中,ObjectType是要创建对象的类名,objectName是对象的引用变量…

Allins 官网上线,标志铭文赛道正式进入 AMM 交易时代

“Allins 正在通过全新的 AMM 方案为BRC20及多链铭文资产拓展 DeFi 场景,官网的全新上线意味着铭文资产的交易正式进入 AMM 时代。”

HW06 GAN来生成卡通人物头像- simple

simple -GAN 理论 生成对抗网络(GAN)是最近十年来比较火爆的技术之一,被誉为21世纪最有趣的创想。GAN作为生成网络,自然是可以生成诸多形式的数据,这些数据甚至是现实世界中不曾存在的。例如,最近非常火爆的换脸技术,或者是称为DeepFake,就是GAN的杰作(当然不可能是…

Bert-vits2最终版Bert-vits2-2.3云端训练和推理(Colab免费GPU算力平台)

对于深度学习初学者来说,JupyterNoteBook的脚本运行形式显然更加友好,依托Python语言的跨平台特性,JupyterNoteBook既可以在本地线下环境运行,也可以在线上服务器上运行。GoogleColab作为免费GPU算力平台的执牛耳者,更…

ExecutorCompletionService详解

本文已收录至Github,推荐阅读 👉 Java随想录 微信公众号:Java随想录 文章目录 摘要ExecutorCompletionService适用场景ExecutorCompletionService使用ExecutorCompletionService原理解析注意事项总结 摘要 ExecutorCompletionService 是Jav…

Java原生启动Tomcat

文章目录 引入依赖启动Tomcat代码示例将嵌入式 Tomcat 服务器用于已有的 WAR 文件为现有的 Java Web 应用程序嵌入 Tomcat 服务器 相关APITomcat APIContonxt API 启动错误springboot底层Tomcat的实现学习博客 引入依赖 maven: <dependency><groupId>org.apache.…

如何在无公网IP环境使用Windows远程桌面Ubuntu

文章目录 一、 同个局域网内远程桌面Ubuntu二、使用Windows远程桌面连接三、公网环境系统远程桌面Ubuntu1. 注册cpolar账号并安装2. 创建隧道&#xff0c;映射3389端口3. Windows远程桌面Ubuntu 四、 配置固定公网地址远程Ubuntu1. 保留固定TCP地址2. 配置固定的TCP地址3. 使用…