基本知识
爬虫是批量化 自动获取既有数据;通常来说都是获取既有数据,但也有特殊的例如批量领取优惠券和帐号 批量买商品 自动做任务(签到)等等
爬虫的应用场景:
–企业中:竞品调研,办公自动化(自动从公司后台获取数据进行处理);
–为个人服务当中:想看小说爬虫爬下来;
–盈利:抢票,抢演唱会门票,自动评论,自动点赞
爬虫的分类:
–聚焦爬虫:完成某一项特定数据的采集
–通用爬虫:所有内容都采集下来
–增量爬虫:内容发生变化的时候,可以获取增量内容
–暗网爬虫:违法,见不得光的地方,领域十分特殊,应用较少,内容包括了前三个
爬虫是否合法?
业内有一个robots机器人协议,协议规定了那些内容可以获取,那些内容不可以获取。例如
https://www.baidu.com/robots.txt
可以查看百度的robots协议
通常协议中会标明哪些不然爬
国内比较顶级的购物网站都没有机器协议或者少
还有一个君子协议:未标注是否可以爬取,但也是些能爬有些不能爬,爬了不能爬的可能会吃公家饭
写爬虫的注意事项:
–给服务器留活路,爬虫开启后,使用其他设备访问爬虫网站
–脱离敏感信息,例如个人信息
–不要爬公共资源的网站,例如gj相关网站
cookie特性
Cookie由服务器返回,存储在浏览器中
Cookie支持过期,具有时效性
Cookie是键值存储 Key-Value
Cookie不能跨网站,不能跨域名
网络请求会自动携带本网站所有有效Cookie
Session和Cookie的区别
数据抓取方法一:使用DrissionPage框架进行数据抓取
前期准备
安装DrissionPage
DrissionPage文档说明:https://g1879.gitee.io/drissionpagedocs/
下载ChromeDirver
https://developer.chrome.com/docs/chromedriver/downloads?hl=zh-cn
下载下来后将zip文件解压,将exe文件放在jupyter文件夹下面
python使用文档
使用方法
DrissionPage使用文档
使用DrissionPage爬取高考网大学信息
注意:高考网需要登陆才可以爬取下一页的内容,否则只会爬取第一页的内容,所以在爬取之前先登录网站
0.数据提取——使用Cookie进行登录
提取Cookie
from DrissionPage import ChromiumPage
# 创建一个ChromiumPage对象
page = ChromiumPage()
page.get(一定要是一个登录页面的url)
# 打开页面之后手动进行登录,完成后提取Cookie
cookies = page.get_cookies()
# 将数据进行json序列化,转换成文本进行存储
import json
cookies_str = json.dumps(cookies)
# 使用文件存储,将字符串存到文件中
with open("cookies.txt","w",encoding="utf-8") as file:
file.write(cookies_str)
使用刚刚的cookie进行登录
from DrissionPage import ChromiumPage
import json
# 创建一个ChromiumPage对象
page = ChromiumPage()
with open("cookies.txt","r",encoding="utf-8") as file:
cookies_str = file.read()
# 使用json将字符串转换为json格式的数据
cookiess = json.loads(cookies_str)
# 向浏览器中注入Cookie
# 有些Cookie加不进去,可以加一个日常捕获
try:
page.set.cookies(cookiess)
except Exception as e:
print(e)
page.get(未登录状态的url)
# 关闭浏览器
page.close()
数据抓取方法二:Request
双R:Request(请求是自己构造的)和Response(响应是服务器返回的)
双R的构成:请求行,请求头,请求体,响应行,响应头,相应体
我们需要做的:模拟请求端的请求行和请求头和请求体
静态数据获取:
页面上面看得到可以直接获取的
import requests
# 请求头
headers={
"User_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"
}
#请求头
url= "url"
# 请求体
# 第一种请求方式
response = requests.request("GET",url,headers=headers)
动态数据获取:
在页面上看的到,发送请求的时候获取不到的,主要是要去分析哪些是动态数据,获取动态数据的url是什么
comment_url = "https://www.xinpianchang.com/api/xpc/comments/article/v2?article_id=12944220"
# 第二种请求方式
response_comment = requests.get(comment_url, headers = headers)
数据提取:XPath
Xpath是一门在 XML 文档中查找信息的语言,可以兼容html,从1开始数
json就是python中的字典,列表
准备工作
安装lxml
数据抓取方法三:
准备工作
Library:requests,urllib,pycurl
Tools:curl,wget,httpie
0:urllib premier
urlretrieve() #url檢索
urlcleanup() #清除緩存
info() #顯示基本的環境信息
getcode()
geturl()
1
import urllib.request
import re
url = "https://read.douban.com/provider/all"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}
# 通过headers获取对url的请求
ret = urllib.request.Request(url, headers=headers)
# 打开url并读出来
res = urllib.request.urlopen(ret).read() #打開並讀取王爺
# 需要將data進行編碼
data = res.decode('utf-8') # 得到了網頁内容
# 通過正則表達式篩選我們需要的内容,需要分析網頁源代碼
pat = '<div class="name">(.*?)</div>'
# 正则表达式中 .
mydata = re.compile(pat).findall(data) #檢索網頁
print(mydata)
2:不需要設置headers
import urllib.request
url="https://www.pressofatlanticcity.com/"
filename="D:/Document/0.professional/python/NetBug/news.html" #這裏存儲的是網頁
urllib.request.urlretrieve(url,filename) #檢索一個網頁
3
urllib.request.urlcleanup()
file=urllib.request.urlopen("https://www.baidu.com/") #打開一個網頁
print(file.info())
4
200 访问成功
print(file.getcode()) #200
print(file.geturl()) # https://www.baidu.com/ [打印出來的是個鏈接]
5
timeout=2
#超時設置,超過兩秒未獲取到内容返回超時信息
file = urllib.request.urlopen("https://www.youtube.com/", timeout=2)
# urllib.error.URLError: <urlopen error timed out>
6 HTTPError常见状态码
a. 2XX 成功系列
b. 3XX 重定向
c. 4XX 客户端错误
d. 5XX 服务器内部错误
418 触发网站的反爬虫机制,程序猿给你开的玩笑
7.URLError
笔记来源:天善智能网络课程,千锋教育网络课程