首页 > 编程语言 >python爬虫

python爬虫

时间:2024-08-11 18:18:41浏览次数:13  
标签:headers python request 爬虫 urllib 代理 url data

爬虫

一、爬虫的分类

1、通用爬虫
	实例 百度,360,google、搜狗等搜索引擎
    功能	访问网页-》抓取数据-》数据存储-》数据处理-》提供检测服务
    robots协议
    一个约定俗成的协议,添加robots.txt文件,来说明本网站哪些内容不可以被抓取,之际写的爬虫无需遵守
    网站排名
    	1、根据pagerank算法继续宁排名(参考各个网站流量、点击率等指标)
        2、百度竞价排名
缺点
	1、抓取的数据大多是无用的
    2、不能根据用户的需求来精准获取数据
聚焦爬虫
	功能
		根据需求,实现爬虫程序,抓取需要的数据
	设计思路
	1、确定要爬取的url		如何获取url
	2、模拟浏览器通过http协议访问url,获取服务器返回的html代码			如何访问
	3、解析html字符串(根据一定的规则提取需要的数据) 	如何解析

二、反爬手段

1、User-Agent
	User Agent 中文名为用户代理,简称UA ,它是一个特殊字符串头,使得服务器能够识别客户使用得操作系统以及版本、CPU类型、浏览器版本、浏览器渲染引擎、浏览器语言、浏览器插件等
2、代理IP
	西次代理
	快代理
	什么是高匿名、匿名和透明代理,他们有什么区别?
	1、使用透明代理,对方服务器可以知道你使用了代理,并且也知道你的真实IP
	2、使用匿名代理,对方服务器可以知道你使用了代理,但是不知道你的真实IP
	3、使用高匿名代理,对方服务器不知道你使用了代理,更不知道你的真实IP
3、验证码访问
	打码平台
	云打码平台
4、动态加载网页 网站返回得是js数据 并不是网页得真实数据
	selenium驱动真实的浏览器发送请求
5、数据加密
	分析js代码

三、urillib的使用

import urllib.request

url = 'http://www.baidu.com'
response = urllib.request.urlopen(url)
content = response.read()
print(content)

# 下载网页 路径加本地下载路径
urllib.request.urlretrieve(url, filename='a.html')
# 下载照片
image_url = '路径'
urllib.request.urlretrieve(image_url, 'a.jpg')

https的反爬,请求头的设置

import urllib.request

url = 'https://www.baidu.com'
# 添加一个伪装的头部
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11'}
request = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(request)
content = response.read()
print(content)
print('\n')

四、编码和解码

1、urllib的get请求方式:

urllib.parse.quote()|urlencode()

quote是可以携带一个参数,将该参数转换为网页可以识别的参数

urlencode 是可以携带多个参数,将字典形式转换为网页可以识别的参数

import urllib.parse
import urllib.request

url = 'https://www.baidu.com/s?wd='
#要完善cookie以及accept才可以防止
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36",
    'Cookie': 'BIDUPSID=0AC013F06C245B47C2BF7740B40C04EA; PSTM=1644999469; __yjs_duid=1_096f9a5abffbfe601892790fe9b46a3f1644999840702; H_WISE_SIDS=234020_110085_259297_265862_265886_266566_259642_269389_269552_188331_269781_269832_269904_270607_270664_270966_271035_271022_268874_270654_271173_271175_257179_269730_267659_256153_271320_271271_269892_271471_271622_269609_270102_8000091_8000102_8000124_8000138_8000146_8000150_8000156_8000175_8000177_8000179_8000182_8000204; H_WISE_SIDS_BFESS=234020_110085_259297_265862_265886_266566_259642_269389_269552_188331_269781_269832_269904_270607_270664_270966_271035_271022_268874_270654_271173_271175_257179_269730_267659_256153_271320_271271_269892_271471_271622_269609_270102_8000091_8000102_8000124_8000138_8000146_8000150_8000156_8000175_8000177_8000179_8000182_8000204; BDUSS=lDVUtqQjJud352bVVrUzhBdmctY2xXb3pUUzlyNU93OWV0Q2phMEZ3fm54NWhsSVFBQUFBJCQAAAAAAQAAAAEAAABl8BwissjXxcnPtdu1xNChs~MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOc6cWXnOnFlMl; BDUSS_BFESS=lDVUtqQjJud352bVVrUzhBdmctY2xXb3pUUzlyNU93OWV0Q2phMEZ3fm54NWhsSVFBQUFBJCQAAAAAAQAAAAEAAABl8BwissjXxcnPtdu1xNChs~MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOc6cWXnOnFlMl; WP_OFFICE_TOKEN=1103540661187_121.c97158884f096df344b9c110e59de238.YGeHNaWnpXXKcKcT0X59__aS7AEt6uLGyQnn3i8.73NCVw; newlogin=1; BD_UPN=12314753; BAIDUID=9D266FA7711D0FADADF6BB528C2B47E4:SL=0:NR=10:FG=1; H_PS_PSSID=39939_39999_40010_40044_40074; ispeed_lsm=0; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; BAIDUID_BFESS=9D266FA7711D0FADADF6BB528C2B47E4:SL=0:NR=10:FG=1; BA_HECTOR=21800lah2h04002l85a4848l6tpht71ipcvpd1t; ZFY=og8jPbUTjB1dyD:Ai:Baiw6jrSgBTwHnhLbtyX:BnZHIB4:C; BDRCVFR[rdSseT8J6zT]=mk3SLVN4HKm; delPer=0; BD_CK_SAM=1; PSINO=6; sug=0; sugstore=0; ORIGIN=0; bdime=0; H_PS_645EC=239dEKJTJgO5VvEf99com6DL%2FFZCI2PIbqJvNSYDhMrNUkImdhPU5fCoSacdxXFdnPUiyUd6Ga%2FV',
    'Accept':
        'application/json, text/javascript, */*; q=0.01'}
# 使用get请求
data={
    'wd':'周杰伦',
    'sex':'男'
}
# 一个搜索情况的使用
name = urllib.parse.quote('周杰伦')
# 有多个搜索限制条件
data=urllib.parse.urlencode(data)
url = url + data
print(url+name)
print(url+data)
# 输出结果:
# https://www.baidu.com/s?wd=%E5%91%A8%E6%9D%B0%E4%BC%A6
# https://www.baidu.com/s?wd=wd=%E5%91%A8%E6%9D%B0%E4%BC%A6&sex=%E7%94%B7
# 请求头定制
request = urllib.request.Request(url=url, headers=headers)
# 请求数据
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')

print(content)

2、urllib的post请求方式:

data需要单独加入,urllib.parse.urlencode 需要转换为utf-8的形式,也需要decode进行解码

import json
import urllib.parse
import urllib.request
while 1:
    url = 'https://fanyi.baidu.com/sug'
    # 伪装响应头
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36",
        'Cookie': 'BIDUPSID=0AC013F06C245B47C2BF7740B40C04EA; PSTM=1644999469; __yjs_duid=1_096f9a5abffbfe601892790fe9b46a3f1644999840702; H_WISE_SIDS=234020_110085_259297_265862_265886_266566_259642_269389_269552_188331_269781_269832_269904_270607_270664_270966_271035_271022_268874_270654_271173_271175_257179_269730_267659_256153_271320_271271_269892_271471_271622_269609_270102_8000091_8000102_8000124_8000138_8000146_8000150_8000156_8000175_8000177_8000179_8000182_8000204; H_WISE_SIDS_BFESS=234020_110085_259297_265862_265886_266566_259642_269389_269552_188331_269781_269832_269904_270607_270664_270966_271035_271022_268874_270654_271173_271175_257179_269730_267659_256153_271320_271271_269892_271471_271622_269609_270102_8000091_8000102_8000124_8000138_8000146_8000150_8000156_8000175_8000177_8000179_8000182_8000204; BDUSS=lDVUtqQjJud352bVVrUzhBdmctY2xXb3pUUzlyNU93OWV0Q2phMEZ3fm54NWhsSVFBQUFBJCQAAAAAAQAAAAEAAABl8BwissjXxcnPtdu1xNChs~MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOc6cWXnOnFlMl; BDUSS_BFESS=lDVUtqQjJud352bVVrUzhBdmctY2xXb3pUUzlyNU93OWV0Q2phMEZ3fm54NWhsSVFBQUFBJCQAAAAAAQAAAAEAAABl8BwissjXxcnPtdu1xNChs~MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOc6cWXnOnFlMl; WP_OFFICE_TOKEN=1103540661187_121.c97158884f096df344b9c110e59de238.YGeHNaWnpXXKcKcT0X59__aS7AEt6uLGyQnn3i8.73NCVw; newlogin=1; BD_UPN=12314753; BAIDUID=9D266FA7711D0FADADF6BB528C2B47E4:SL=0:NR=10:FG=1; H_PS_PSSID=39939_39999_40010_40044_40074; ispeed_lsm=0; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; BAIDUID_BFESS=9D266FA7711D0FADADF6BB528C2B47E4:SL=0:NR=10:FG=1; BA_HECTOR=21800lah2h04002l85a4848l6tpht71ipcvpd1t; ZFY=og8jPbUTjB1dyD:Ai:Baiw6jrSgBTwHnhLbtyX:BnZHIB4:C; BDRCVFR[rdSseT8J6zT]=mk3SLVN4HKm; delPer=0; BD_CK_SAM=1; PSINO=6; sug=0; sugstore=0; ORIGIN=0; bdime=0; H_PS_645EC=239dEKJTJgO5VvEf99com6DL%2FFZCI2PIbqJvNSYDhMrNUkImdhPU5fCoSacdxXFdnPUiyUd6Ga%2FV',
        'Accept':
            'application/json, text/javascript, */*; q=0.01'}
    keyword=input('请输入你需要查询的单词')
    data = {'kw': keyword}
    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')
    #转换为json的数据
    obj=json.loads(content)
    print(obj['data'][0]['v'])

Handler处理器

Handler处理器的作用?
	urllib.request.urlopen(url) 不能定制请求头
	urllib.request.Request(url,header,data)可以定制请求头
	Handler定制更高级的请求头(随着业务逻辑的复杂,请求对象的定制已经不能满足我们的需求, 动态cookie和代理不能使用请求对象的定制)

代理服务器

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

2、代码配置代理
	创建Request对象
	创建ProxyHandler对象
	用handler对象创建opener对象
	使用opener,open函数发送请求

xpath基本语法

1、路径查询
	//:查询所有子孙结点,不考虑层级关系
	/:找直接子节点
2、谓词查询
	//div[@id]
	//div[@id='具体']
3、属性查询
	//@class
4、模糊查询
	//div[contains(@id,"he")]
	//div[starts-with(@id,"he")]
5、内容查询
	//div/h1/text()
6、逻辑运算
	//div[@id="head" and class="s_down"]
    // title | //price

标签:headers,python,request,爬虫,urllib,代理,url,data
From: https://www.cnblogs.com/zt123456/p/18353701

相关文章

  • PythonL-Chapter_01_基础语法
    注释#这是单行注释"""这是多行注释可以写多行文字"""变量和数据类型内置基本数据类型整数(int):用于表示没有小数部分的数字,例如-1,0,1,100等浮点数(float):用于表示带有小数部分的数字,例如3.14,2.718字符串(str):用于表示文本信息,必须使用引号(单引......
  • Selenium + Python 自动化测试11(unittest组织用例)
            我们的目标是:按照这一套资料学习下来,大家可以独立完成自动化测试的任务。上一篇我们讨论了unittest基本使用方法。        本篇文章我们接着讲。一些概念和一些常用的构造测试集的方法。1、基本概念1)TestCase        一个TestCase的......
  • Selenium + Python 自动化测试10(unittest概念)
            我们的目标是:按照这一套资料学习下来,大家可以独立完成自动化测试的任务。上几篇我们讨论了元素的定位方法、操作方法以及一些特殊元素的操作。        在实际的测试项目组中每个模块会写多条案例,如第一条用例那里我们的登录。登录的话就可以有多条......
  • python毕业设计基于Django的汽车租赁系统
    文末获取资源,收藏关注不迷路文章目录一、项目介绍二、主要使用技术三、研究内容四、核心代码五、文章目录一、项目介绍随着经济的飞速发展和人们生活水平的显著提升,汽车已经成为现代生活中不可或缺的重要交通工具。然而,随着城市化进程的加快,交通拥堵、停车难以及高......
  • 【学习笔记】Matlab和python双语言的学习(图论最短路径)
    文章目录前言一、图论基本概念示例二、代码实现----Matlab三、代码实现----python总结前言通过模型算法,熟练对Matlab和python的应用。学习视频链接:https://www.bilibili.com/video/BV1EK41187QF?p=36&vd_source=67471d3a1b4f517b7a7964093e62f7e6一、图论图论(G......
  • 21:Python函数全局变量和局部变量
    #全局变量与局部变量,全局变量大写,局部变量小写NAME='ladfs'#定义全局变量,全局作用域顶格defchange_name():print('change_name',NAME)#调用全局变量change_name()#全局变量与局部变量NAME='ladfs'#定义全局变量defchange_name():......
  • 使用条件语句登录QQ(Pythonn实验实训项目)
    实验目的1、掌握变量的创建方法及变量赋值运算的使用方法;2、掌握的掌握if-elif--else条件语句和循环语句的嵌套使用;3、掌握比较运算符的应用;4、掌握输入语句的使用方法;5、掌握continue和break语句的用法。二、实验内容使用条件语句实现QQ登录:若用户名和密码都输入正确,则......
  • 搭建python私有仓库
    1.创建帐号密码文件,并添加内容touch/opt/pyserver/.htpasswdecho"username:password">/opt/pyserver/.htpasswd2.创建包路径mkdir/opt/pyserver/packages3.创建私有仓库#不带转发的命令dockerrun--namepypi--restartalways-v/opt/pyserver/packages:/d......
  • 探索Python中的插入排序算法
    探索Python中的插入排序算法插入排序(InsertionSort)是一种简单直观的排序算法。虽然在大规模数据集上效率不如一些高级排序算法,但插入排序在处理小规模数据集或部分有序的数据时表现非常优秀。本文将介绍插入排序的工作原理、实现方法以及它的时间复杂度。插入排序的工作......
  • 使用 Python 爬取豆瓣电影 Top250 多页数据
    使用Python爬取豆瓣电影Top250多页数据创建时间:2024-08-11一、完整代码'''抓取单贞数据中的评分简介评价人数将上面的改为多页https://movie.douban.com/top250?start=0'''importrequestsfromlxmlimportetreeheader={'User-Agent':'Mozilla/5.0......