admin管理员组文章数量:1026989
python爬虫专题1:准备工作
放假前入的坑,现在开始填坑,我也是小白,有错误或者可改进的地方,希望大佬可以指正
我尽量按照我觉得最简单的循序介绍爬虫;这篇文章是在吃鸡匹配的空闲时间写完的,下一篇文章写HTML的,是的,为了学爬虫,我把HTML也学了学
安装requests库
requests和urllib我选择了requests,因为网上和书上都在说requests更简单一点
安装教程看我的
上篇文章去
使用requests发送请求
导入request模块
import requests
获取一个网站试水 百度吧
r=requests.get('/')
URL传递参数
比如说百度搜索郭翰林,对于wd参数(搜索词)和m参数(搜索结果数量)可以人工拼接组成URL;requests可以更好的解决
import requests
if __name__ == '__main__':payload={'wd':'温文儒雅郭翰林','rn':'100'}r=requests.get("/",params=payload)print(r.url)
wd=%E6%B8%A9%E6%96%87%E5%84%92%E9%9B%85%E9%83%AD%E7%BF%B0%E6%9E%97&rn=100巴拉巴拉这些乱码就是温文儒雅郭翰林
params也可以
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36',
}params = {'myMessage': 'message'
}url = ''
response = requests.get(url, headers=headers, params=params)
print(response.text)
print(response.url)
获取效应内容
import requests
if __name__ == '__main__':r=requests.get('/')r.textprint(r.text)
查看网页的编码
import requests
if __name__ == '__main__':r=requests.get('/')r.encodingprint(r.encoding)
结果:ISO-8859-1
百度不应该是utf-8编码吗?来兴趣了,我换了几个网址
好像百度主页是ISO编码,问答那些是utf-8编码
r.text可以获取效应内容
还有r.content
我专门多看了几本书对于这个编码的解释,发现可以修改编码然后去获取网页内容
这样
r.encoding='utf-8'
网页状态码
import requests
if __name__ == '__main__':r=requests.get('=%E5%B7%B4%E6%8B%89%E5%B7%B4%E6%8B%89&rsv_spt=1&rsv_iqid=0x846540f100057404&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_dl=ib&rsv_enter=1&rsv_sug3=6&rsv_sug1=4&rsv_sug7=100')r.status_codeprint(r.status_code)
结果200
r=requests.get('')
网站瞎打的当然是404了 嘿呀 404 某狗每次看到404就来问我要新域名
查看网站的headers请求头
heders是网站用来识别访问的最常用手段;header有很多,主要的也就是Host;User-Agent,Referer,Accept,Accept-Encoding,Connerction和Accept-Language
说多了,其实吧也就user-agent 和Referer重要一点,反爬虫一般就检查这两个,而且必须要加User-Agent(显示浏览器相关信息),他们是以键对的形式展现出来,如果user-agent 以字典键对形式作为headers的内容,就可以反爬成功,就不需要其他键对;否则,需要加入headers下的更多键对形式。
随便开个网站 fn加f12,或者是f12,还可以鼠标右键点击检查
打开network
找到 name下随意一行
Headers 下滑找到User-Agent
requests函数可以自定义请求头信息和urllib库作用差不多,但是更简单一点
随便说一下手机端和电脑端的网页显示不同了,手机端简洁,动态效果少,关键信息一个不少,便于爬取,我们就可以把UA改成Android系统; 废话,以后实战讲
写个headers
r.headers{'user - agent': 'Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 87.0.4280.141Safari / 537.36Edg / 87.0.664.75'}
响应的头部内容
import requests
if __name__ == '__main__':r=requests.get('/ ')r.headers{'user - agent': 'Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 87.0.4280.141Safari / 537.36Edg / 87.0.664.75'}print(r.headers['content-type'])
结果是text/html; charset=iso-8859-1
随便在说一下header的参数
HTTP请求头(Header)参数简介
HTTP 协议的 Header 是一块数据区域,分为请求头和响应头两种类型,客户端向服务区发送请求时带的是请求头,而服务器响应客户端数据时带的是响应头。
请求头里主要是客户端的一些基础信息,UA(user-agent)就是其中的一部分,而响应头里是响应数据的一些信息,以及服务器要求客户端如何处理这些响应数据的指令。请求头里面的关键信息如下:
- accept
表示当前浏览器可以接受的文件类型,假设这里有 image/webp,表示当前浏览器可以支持 webp 格式的图片,那么当服务器给当前浏览器下发 webp 的图片时,可以更省流量。 - accept-encoding
表示当前浏览器可以接受的数据编码,如果服务器吐出的数据不是浏览器可接受的编码,就会产生乱码。 - accept-language
表示当前使用的浏览语言。 - Cookie
很多和用户相关的信息都存在 Cookie 里,用户在向服务器发送请求数据时会带上。例如,用户在一个网站上登录了一次之后,下次访问时就不用再登录了,就是因为登录成功的 token 放在了 Cookie 中,而且随着每次请求发送给服务器,服务器就知道当前用户已登录。 - user-agent
表示浏览器的版本信息。当服务器收到浏览器的这个请求后,会经过一系列处理,返回一个数据包给浏览器,而响应头里就会描述这个数据包的基本信息。
响应头里的关键信息有:
- content-encoding
表示返回内容的压缩编码类型,如“Content-Encoding :gzip”表示这次回包是以 gzip 格式压缩编码的,这种压缩格式可以减少流量的消耗。 - content-length
表示这次回包的数据大小,如果数据大小不匹配,要当作异常处理。 - content-type
表示数据的格式,它是一个 HTML 页面,同时页面的编码格式是 UTF-8,按照这些信息,可以正常地解析出内容。content-type 为不同的值时,浏览器会做不同的操作,如果 content-type 是 application/octet-stream,表示数据是一个二进制流,此时浏览器会走下载文件的逻辑,而不是打开一个页面。 - set-cookie
服务器通知浏览器设置一个 Cookie;通过 HTTP 的 Header,可以识别出用户的一些详细信息,方便做更定制化的需求,如果大家想探索自己发出的请求中头里面有些什么,可以这样做:打开 Chrome 浏览器并按“F12”键,唤起 Chrome 开发者工具,选择 network 这个 Tab,浏览器发出的每个请求的详情都会在这里显示。
设置超时时间
通过timeout属性设置超时;过了这个时间还没有获得效应内容,提示错误
import requests
if __name__ == '__main__':r=requests.get('/' ,timeout=0.00001)print(r.text)
时间设置过短,必然报错
时间改的长一点就ok了
import requests
if __name__ == '__main__':r=requests.get('/' ,timeout=0.1)print(r.text)
reteying库
timeout说完了,reteying怎么可能不提一下?
Scripts文件夹里面pip install retrying一下就可以使用了
这样就okk了
如果访问一个网站出现了报错,有可能是网络情况不好(比如说我宿舍的宽度总是坏,而且就我一个人的经常坏,差不多每天都会莫名其妙断连,严重影响我的游戏体验,而且1650运行赛博朋克的效果和1977一样,端游直接劝退),这个时候我们应该是重新请求服务器,甚至是重新请求好几次。retrying库登场
import requests
from retrying import retryheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36'}
#让函数反复执行4次,4次全部报错才会报错
@retry(stop_max_attempt_number=4)
def parse_url1(url): print("*"*50)response = requests.get(url, headers=headers, timeout=5)return response.content.decode()def parse_url(url):try:html_str = parse_url1(url)except:html_str = Nonereturn html_strif __name__ == '__main__':print(parse_url(''))
这是执行一次的结果
换个瞎打的地址
四次返回结果错误
代理访问
采集时为避免封IP;可以使用代理,request的proxies就有用处了
查看IP地址
打开cmd然后ipconfig
/ 免费的IP
高匿就是服务器不知道你用了代理,也不知道你的真实IP
匿名就是知道你用了`代理,不知道你的真实IP
透明就是服务器知道你代理还知道你的真实ip
import requests# 更改ip
proxies = {"http": "http://220.181.111.37:80", # http 型的"https": ":1080" # https 型的}# 用百度检测ip代理是否成功url = '/'# 请求网页传的参数params = {'wd': 'ip地址'}# 请求头headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'}# 发送get请求response = requests.get(url=url, headers=headers, params=params, proxies=proxies)# 获取返回页面保存到本地,便于查看with open('ip.html', 'w', encoding='utf-8') as f:f.write(response.text)
找了好几个代理,都不行,但是我现在这个可以跑,可能是找的IP被封了,找不到可用的免费ip
import requests# 更改ip
proxies = {"http": "121.233.227.138:9999", # http 型的"https": "113.195.157.122:9999" # https 型的}
# 用百度检测ip代理是否成功url = '=ip'# 请求头# 发送get请求
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36 Edg/88.0.705.50'
}response = requests.get(url=url, headers=headers)# 获取返回页面保存到本地,便于查看with open('ip1.html', 'w', encoding='utf-8') as fp:fp.write(response.text)
打开ip1.html跳转的就可以看到我的真实IP了,代理失败,找到了有免费的IP滴滴我
结束了,准备开始实战
python爬虫专题1:准备工作
放假前入的坑,现在开始填坑,我也是小白,有错误或者可改进的地方,希望大佬可以指正
我尽量按照我觉得最简单的循序介绍爬虫;这篇文章是在吃鸡匹配的空闲时间写完的,下一篇文章写HTML的,是的,为了学爬虫,我把HTML也学了学
安装requests库
requests和urllib我选择了requests,因为网上和书上都在说requests更简单一点
安装教程看我的
上篇文章去
使用requests发送请求
导入request模块
import requests
获取一个网站试水 百度吧
r=requests.get('/')
URL传递参数
比如说百度搜索郭翰林,对于wd参数(搜索词)和m参数(搜索结果数量)可以人工拼接组成URL;requests可以更好的解决
import requests
if __name__ == '__main__':payload={'wd':'温文儒雅郭翰林','rn':'100'}r=requests.get("/",params=payload)print(r.url)
wd=%E6%B8%A9%E6%96%87%E5%84%92%E9%9B%85%E9%83%AD%E7%BF%B0%E6%9E%97&rn=100巴拉巴拉这些乱码就是温文儒雅郭翰林
params也可以
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36',
}params = {'myMessage': 'message'
}url = ''
response = requests.get(url, headers=headers, params=params)
print(response.text)
print(response.url)
获取效应内容
import requests
if __name__ == '__main__':r=requests.get('/')r.textprint(r.text)
查看网页的编码
import requests
if __name__ == '__main__':r=requests.get('/')r.encodingprint(r.encoding)
结果:ISO-8859-1
百度不应该是utf-8编码吗?来兴趣了,我换了几个网址
好像百度主页是ISO编码,问答那些是utf-8编码
r.text可以获取效应内容
还有r.content
我专门多看了几本书对于这个编码的解释,发现可以修改编码然后去获取网页内容
这样
r.encoding='utf-8'
网页状态码
import requests
if __name__ == '__main__':r=requests.get('=%E5%B7%B4%E6%8B%89%E5%B7%B4%E6%8B%89&rsv_spt=1&rsv_iqid=0x846540f100057404&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_dl=ib&rsv_enter=1&rsv_sug3=6&rsv_sug1=4&rsv_sug7=100')r.status_codeprint(r.status_code)
结果200
r=requests.get('')
网站瞎打的当然是404了 嘿呀 404 某狗每次看到404就来问我要新域名
查看网站的headers请求头
heders是网站用来识别访问的最常用手段;header有很多,主要的也就是Host;User-Agent,Referer,Accept,Accept-Encoding,Connerction和Accept-Language
说多了,其实吧也就user-agent 和Referer重要一点,反爬虫一般就检查这两个,而且必须要加User-Agent(显示浏览器相关信息),他们是以键对的形式展现出来,如果user-agent 以字典键对形式作为headers的内容,就可以反爬成功,就不需要其他键对;否则,需要加入headers下的更多键对形式。
随便开个网站 fn加f12,或者是f12,还可以鼠标右键点击检查
打开network
找到 name下随意一行
Headers 下滑找到User-Agent
requests函数可以自定义请求头信息和urllib库作用差不多,但是更简单一点
随便说一下手机端和电脑端的网页显示不同了,手机端简洁,动态效果少,关键信息一个不少,便于爬取,我们就可以把UA改成Android系统; 废话,以后实战讲
写个headers
r.headers{'user - agent': 'Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 87.0.4280.141Safari / 537.36Edg / 87.0.664.75'}
响应的头部内容
import requests
if __name__ == '__main__':r=requests.get('/ ')r.headers{'user - agent': 'Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 87.0.4280.141Safari / 537.36Edg / 87.0.664.75'}print(r.headers['content-type'])
结果是text/html; charset=iso-8859-1
随便在说一下header的参数
HTTP请求头(Header)参数简介
HTTP 协议的 Header 是一块数据区域,分为请求头和响应头两种类型,客户端向服务区发送请求时带的是请求头,而服务器响应客户端数据时带的是响应头。
请求头里主要是客户端的一些基础信息,UA(user-agent)就是其中的一部分,而响应头里是响应数据的一些信息,以及服务器要求客户端如何处理这些响应数据的指令。请求头里面的关键信息如下:
- accept
表示当前浏览器可以接受的文件类型,假设这里有 image/webp,表示当前浏览器可以支持 webp 格式的图片,那么当服务器给当前浏览器下发 webp 的图片时,可以更省流量。 - accept-encoding
表示当前浏览器可以接受的数据编码,如果服务器吐出的数据不是浏览器可接受的编码,就会产生乱码。 - accept-language
表示当前使用的浏览语言。 - Cookie
很多和用户相关的信息都存在 Cookie 里,用户在向服务器发送请求数据时会带上。例如,用户在一个网站上登录了一次之后,下次访问时就不用再登录了,就是因为登录成功的 token 放在了 Cookie 中,而且随着每次请求发送给服务器,服务器就知道当前用户已登录。 - user-agent
表示浏览器的版本信息。当服务器收到浏览器的这个请求后,会经过一系列处理,返回一个数据包给浏览器,而响应头里就会描述这个数据包的基本信息。
响应头里的关键信息有:
- content-encoding
表示返回内容的压缩编码类型,如“Content-Encoding :gzip”表示这次回包是以 gzip 格式压缩编码的,这种压缩格式可以减少流量的消耗。 - content-length
表示这次回包的数据大小,如果数据大小不匹配,要当作异常处理。 - content-type
表示数据的格式,它是一个 HTML 页面,同时页面的编码格式是 UTF-8,按照这些信息,可以正常地解析出内容。content-type 为不同的值时,浏览器会做不同的操作,如果 content-type 是 application/octet-stream,表示数据是一个二进制流,此时浏览器会走下载文件的逻辑,而不是打开一个页面。 - set-cookie
服务器通知浏览器设置一个 Cookie;通过 HTTP 的 Header,可以识别出用户的一些详细信息,方便做更定制化的需求,如果大家想探索自己发出的请求中头里面有些什么,可以这样做:打开 Chrome 浏览器并按“F12”键,唤起 Chrome 开发者工具,选择 network 这个 Tab,浏览器发出的每个请求的详情都会在这里显示。
设置超时时间
通过timeout属性设置超时;过了这个时间还没有获得效应内容,提示错误
import requests
if __name__ == '__main__':r=requests.get('/' ,timeout=0.00001)print(r.text)
时间设置过短,必然报错
时间改的长一点就ok了
import requests
if __name__ == '__main__':r=requests.get('/' ,timeout=0.1)print(r.text)
reteying库
timeout说完了,reteying怎么可能不提一下?
Scripts文件夹里面pip install retrying一下就可以使用了
这样就okk了
如果访问一个网站出现了报错,有可能是网络情况不好(比如说我宿舍的宽度总是坏,而且就我一个人的经常坏,差不多每天都会莫名其妙断连,严重影响我的游戏体验,而且1650运行赛博朋克的效果和1977一样,端游直接劝退),这个时候我们应该是重新请求服务器,甚至是重新请求好几次。retrying库登场
import requests
from retrying import retryheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36'}
#让函数反复执行4次,4次全部报错才会报错
@retry(stop_max_attempt_number=4)
def parse_url1(url): print("*"*50)response = requests.get(url, headers=headers, timeout=5)return response.content.decode()def parse_url(url):try:html_str = parse_url1(url)except:html_str = Nonereturn html_strif __name__ == '__main__':print(parse_url(''))
这是执行一次的结果
换个瞎打的地址
四次返回结果错误
代理访问
采集时为避免封IP;可以使用代理,request的proxies就有用处了
查看IP地址
打开cmd然后ipconfig
/ 免费的IP
高匿就是服务器不知道你用了代理,也不知道你的真实IP
匿名就是知道你用了`代理,不知道你的真实IP
透明就是服务器知道你代理还知道你的真实ip
import requests# 更改ip
proxies = {"http": "http://220.181.111.37:80", # http 型的"https": ":1080" # https 型的}# 用百度检测ip代理是否成功url = '/'# 请求网页传的参数params = {'wd': 'ip地址'}# 请求头headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'}# 发送get请求response = requests.get(url=url, headers=headers, params=params, proxies=proxies)# 获取返回页面保存到本地,便于查看with open('ip.html', 'w', encoding='utf-8') as f:f.write(response.text)
找了好几个代理,都不行,但是我现在这个可以跑,可能是找的IP被封了,找不到可用的免费ip
import requests# 更改ip
proxies = {"http": "121.233.227.138:9999", # http 型的"https": "113.195.157.122:9999" # https 型的}
# 用百度检测ip代理是否成功url = '=ip'# 请求头# 发送get请求
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36 Edg/88.0.705.50'
}response = requests.get(url=url, headers=headers)# 获取返回页面保存到本地,便于查看with open('ip1.html', 'w', encoding='utf-8') as fp:fp.write(response.text)
打开ip1.html跳转的就可以看到我的真实IP了,代理失败,找到了有免费的IP滴滴我
结束了,准备开始实战
本文标签: python爬虫专题1准备工作
版权声明:本文标题:python爬虫专题1:准备工作 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/IT/1694666882a254818.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论