爬虫
一、爬虫的分类
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