本文已参与「新人创作礼」活动,一起开启掘金创作之路。
爬虫
1、爬虫指的是网络爬虫,爬虫就是模拟发送http请求,burpsuite,postman都可以模拟发送,爬虫则是在python中使用代码进行模拟发送请求,服务器把数据返回为html,xml,json格式。在进行数据的清洗(re,bs4),清洗完后再入库(文件,mysql,redis,es,mongo)。著名的requests库就是一个模拟浏览器发送HTTP请求的网络库。json数据可以直接使用python自带的模块json。对于HTML数据,可以使用Beautiful,lxml等库去处理。对于xml数据,可以使用untangle,xmltodict等第三方库。
request模块
爬虫的编写分为四步:抓包-->模拟请求-->数据解析-->数据保存。
request模块使用:
import requests
# res 中包含了响应体的内容<Response [200]>
res = requests.get('https://www.xxx.com/')
添加params参数
import requests
# 类似于 https://www.cnblogs.com?name=lhm&age=19
res = requests.get('https://www.cnblogs.com/',params={'name':'lhm','age':19})
注意:如果地址中包含中文则涉及到url的编码和解码。需要使用urllib.parse.quote和urllib.parse.unquote处理 比如路由等地方会出来中文,复制URL下来的时候。中文会进行url编码
if__name__=="main_": 限定模块作为程序执行时,才执行后续代码
__init__py文件:控制包的导入行为,可在此放入一些初始化代码
from urllib import parse
url = '哈哈哈'
res = parse.quote(url)
print(res)
res = parse.unquote(url)
print(res)
添加请求头,解决常见的反爬虫需要添加user-agent
import requests
header = {
'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.47',
}
res = requests.get('https://xxx.com/', headers=header)
print(res.text)
添加cookie 当网站有登录信息时,添加cookie登录后才能进行相关操作 cookie信息虽然在请求头中,但requests模块有单独的参数来处理他,headers={}内就不用放了,cookie是cookie.jar的对象
import requests
Cookies={
'user_session':'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
}
# github对请求头没有什么限制,我们无需定制user-agent,对于其他网站可能还需要定制
response=requests.get('https://github.com/settings/emails', cookies=Cookies)
print('1498192242@qq.com' in response.text) #True
requests.post()请求和requests.get()请求一致,唯一的区别就是requests.post()有一个data参数。用来存放请求体数据。
import requests
# 在 data 中取
res = requests.post('http://xxx.com/user.php', data={
'username': 'xxxx',
'password': 'xxxx',
'captcha': 'xxxx',
'remember': 1,
'ref': 'http://xxx.com,
'act': ' act_login',
})
# 登录成功的 cookie,是 cookieJar对象,可以看作是字典。(登录失败也会有cookie,但是少了)
print(res.cookies)
res1 = requests.get('http://xxx.com/', cookies=res.cookies)
print('1498192242@qq.com' in res1.text)
模拟请求
一段简单的模拟请求-->requests库
import requests as req
base_url = "https://xxx.xxx"
page_url = base_url + "/yyy #请求URL
#请求头
page_headers = {
'Host' : 'xxx.xxx',
'Referer' : base_url,
'User_Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)'
'chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.47',
}
# 请求参数
page_data = {'id': x}
def fetch_page();
try:
# POST请求类型
resp = req.post(page_url, headers=page_headers, data=page_data)
print("请求:", resp.url)
if resp is not None:
if resp.status_code == 200;
## 解析返回的数据
print(resp.content)
except Exception as e:
print(e)
if__name__ == '__main__':
fetch_page()
lxml库进行数据解析
模拟请求得到数据之后,下一步就是进行数据解析, 原始数据主要分为三类:XML.HTML.JSON
json格式用python自带的json库就可以,对于HTML,XML就用lxml库解析 lxml库底层用C语言实现,支持XML。HTML的解析,使用XPATH表达式定位结点,解析效率高
import requests as req
from xml import etree
resp = req.get("http://www.baidu.com")
#传入html文本,得到一个可进行xpath的对象
selector = etree.HTML(resp.text)
#编写提取图片路径的xpath表达式
xpath_reg = '/html/head/link[@rel="icon"]/@href'
#提取站点
results = selector.xpath(xpath_reg)
#打印结点信息
print(result[0])
XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。
XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上。 因此,对 XPath 的理解是很多高级 XML 应用的基础。
XPATH语法 结点关系:父,子,同胞,先辈,后代 选取结点:最有用,谓语,选取未知节点,选取若干路径,轴,运算符,函数
数据存储
经过数据解析之后,目标可能是图片,音视频,普通文本等,普通文本(如小说)直接保存txt,其他类型就转为二进制文本
with open('out.txt', 'w+') as f:
f.write(resp.content)
#二进制文件把文件模式从w+改为b+就行啦