Python 爬虫基础
爬虫的用处
- 采集数据
- 模拟操作
爬虫的原理与过程
1.Http的请求与响应
通过Http的请求,获取网页响应内容。
2.响应内容处理
获取响应内容,通过etree,正则表达式和json等技术处理响应,取得想要的内容。
3.数据的存储
通过数据库,文本,Excel等各种方式存储数据。
数据库可选:如果数据量庞大使用mysql,sqlserver等体量大的数据,如果数据量小可使用sqllite
具体脚本代码
import requests
requests.get(url="") # get请求
requests.post()# post请求
通过上述代码可以通过get/post请求网址数据
常用参数:
url: 网址字符串 例:https://xxxx.xx/
params: 网址参数 格式 dict 例:parm = { "name": "python": "age": 12 }
get: 生成到链接后作为参数,使用&链接 例:https://xxxx.xx?name=python&age=12
post: 生成到post的表单内
headers: 请求头设置 格式 dict 例:headers = { "User-Agent" : "Mozilla/5.0 (Linux; Android 10; V1922A Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045329 Mobile Safari/537.36 MMWEBID/7991 MicroMessenger/7.0.18.1740(0x27001235) Process/tools WeChat/arm64 NetType/WIFI Language/zh_CN ABI/arm64","Host": "baidu.com" }
verify: 是否跳过HTTPS证书验证 格式 bool
获取响应
content = requests.get().content # 响应内容
# requests.get() 返回值是http响应的各项值,其中content/text可以获取响应文本
text = content.decode('utf-8', 'ignore')
# content 是编码后的内容,如果想看到正常的文本,要解码后才可以,'utf-8'是常用的编码格式,具体要看访问的网站使用的是何种编码格式,'ignore'用来忽略解码后出现异常的文本内容。
响应的分类
- document
- media(video、audio,image)
- json
- js(file)
一般情况下我们是知道要爬取的网址对应的是哪种相应类型,可以直接针对处理
ducment
content = requests.get().content.decode('utf-8', 'ignore')
# content内容即为相应内容
media
response = requests.get()
# 获取响应
# 读取响应中的Filename
content = response
# 创建对应文件名的文件,然后将content写入文件
json
import json
content = requests.get().content.decode('utf-8', 'ignore')
obj = json.loads(content)
# 获取content json字符串
# 引入json包,使用json.loads(content) 可以将json字符串转为dict格式的json对象,方便获取数据
js
如果只要Js文件的内容,可以像document那样使用,如果想要爬取文件,使用media的方法即可。
Document响应的数据获取
lxml.etree XPath
from lxml import etree
import requests
content = requests.get().content.decode('utf-8', 'ignore')
tree = etree.HTML(content) # 获取etree对象
tree_list = tree.xpath('指定内容的xpath路径') #获取指定路径的内容或xpath对象列表
result = tree_list[0] #要找的内容,如果tree_list的长度为0,则说明xpath不对,或者响应本身没有对应路径
# xpath的具体使用方法可自行网上查找
re 正则表达式
import re, requests
content = requests.get().content.decode('utf-8', 'ignore')
arr = re.compile("").findall(content)
# compile("") 参数为正则表达式 例:content = "123456789", 参数="123(.*?)789",返回的内容arr=["456"],返回的是符合条件的结果集合
反爬的原理及破解
不管是要爬别人的网站还是防止别人爬自己的网站,反爬是必须要了解的。
请求头
我们请求http链接的时候会有一个请求头header,网站后端处理请求的时候可以读取到请求头。
网站会验证及限制header中的部分参数来判断是否为爬虫。
1.User-Agent(用户代理)
这个参数会带出访问网页的设备及浏览器的型号。爬虫的时候如果不设置,会自动识别为爬虫的类型。
解决方案: 设置User-Agent,可以收集大量User-Agent,创建UserAgent获取的方法,每次请求或多次请求后更改User-Agent来破解反爬规则。
2.Host(请求宿主)
访问链接时的网页host,如果爬虫不设置,则为空。
解决方案:针对特定的有host需求的请求,加上对应的Host
IP
同一IP频繁访问,会被网站后端检测,从而加入黑名单限制一个时间段,或者永久不能访问。
解决方案:加上时间延迟,或者使用代理IP,代理IP被封后更换即可
requests.proxies({"http": "", "https": ""})
# 代理IP网上找或者自己购买
Cookie
有时我们爬取数据是通过访问多个链接来获取的,而访问第二个链接的时候可能会需要带上第一个请求返回的cookie值。
requests.get().cookies
# 获取返回的cookie字典,下次请求带上即可
# headers = { "cookie": "a=1;b=2;"}
登录状态保持
登录类型
- 存储在cookie中(浏览器前端)
- 存储在session中,session信息保存在cookie中(服务器后端)
保持方式
-
调用登录请求后,获取cookie信息,并在后续的请求中带上。
-
使用requests.session()
requests.session() # 返回值类型和requests对象相同,不同的是,此对象在后续请求中会自动添加或更新响应中的cookie信息,不需要专门写cookie