教学视频1(简略):https://www.bilibili.com/video/BV1164y1m7Xb
教学视频2:https://www.bilibili.com/video/BV1Yh411o7Sz
文章目录
1. request
1.1 request的使用
1.1.1 判断使用 post 还是 get、json 方法
右键选择检查,找到其中的network选项 ,选择一个加载项,找到headers里的general,其中的request Method的内容就是我们要找的方法–>
1.1.2 指定url
url地址:Request URL:黄框内就是我们要找的url地址
例:url = 'https://sc.chinaz.com/jianli/210118112410.htm'
1.1.3 UA伪装:user-agent
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36'
}
1.1.4 参数
data =
{
'key1': 'value1',
'key2': 'value2'
}
1.1.5 发送请求(上述汇总)
#get请求:
response = requests.get(url=url,headers=header,params=data)
#post请求:
response = requests.post(url=url,headers=header,data=data)
1.2 获取响应数据
1.2.1 判断响应数据是 json 还是 html
Headers — Response Headers — content-type
#text解析:
response.text
#json解析:
response.json
#content解析:二进制解析
response.content
1.3 持久化存储
写入文件
# file_name: 待写入的带后缀的文件名...
# response_data : 获取到的用text或者json处理后的响应数据
# html类型的持久化存储
with open('file_name','w',encoding='utf-8') as f:
f.write(response_data)
# content类型的持久化存储(例如:图片等)
with open('file_name','wb',encoding='utf-8') as f:
f.write(response_data)
# json类型的持久化存储(含有中文时,ensure_ascii值为False)
json.dump(response_data,file_name,ensure_ascii=False)
2. 数据解析:正则表达式、bs4、xpath
2.1 正则表达式
2.3 xpath
2.3.1 解析原理
- 实例化一个etree对象,将源码数据加载到该对象中
- 调用etree中的xpath方法,结合xpath表达式实现标签的定位和内容的捕获
2.3.2 实例化etree对象
- 导包:
from xpath import etree
- (本地html)将本地的html文档中的数据源码加载到etree对象中:
etree.patse(filePath)
- (爬取的html) 将从互联网上获得的源码数据加载到该对象中:
etree.HTML('page_text')
2.3.3 xpath表达式
#导包
from lxml import etree
#加载数据
tree = etree.parse('text.html')
# 层级定位:(三种表达式 结果相同)
# / 与 //
r = tree.xpath('/html/body/div')
r = tree.xpath('/html//div')
r = tree.xpath('//div')
# 属性定位(定位属性class为song的 div标签) : [@class = " "]
r = tree.xpath('//div[@class = "song"]')
r = tree.xpath('//div[@class = "song"] /p[3]') #索引定位(索引从1开始)
# 再次定位:
fin_r = r.xpath('./div/a/text()')
# 文本定位(定位其文本内容): /text()
r = tree.xpath('//div[2]/p[3]/text()') #<div><p>文本内容</p></div>
# 标签属性值 :/@
r = tree.xpath('//div/a/@href')
3. 验证码识别 – 云打码 超级鹰
超级鹰使用:超级鹰网页链接
- 注册用户
- 充值题分
- 创建一个软件ID
- 下载开发文档
- 运用在实例文档里(将实例文档内容粘到python代码里,修改其中的用户名、密码、软件ID)
4. cookie
5. 线程、协程
6. selenium
# 环境安装 : pip install sulenium
# 下载驱动 : 不同浏览器对用不同驱动,浏览器版本也要对应
# 下载完成后放到python文件夹内
附:
- 谷歌驱动下载地址:http://npm.taobao.org/mirrors/chromedriver/
- 2019 Selenium Chrome版本与chromedriver兼容版本对照表:https://blog.csdn.net/yoyocat915/article/details/80580066
6.1 基础代码
# 发起请求 : get(url)
# 标签定位 :find系列的方法
# 标签交互 :send_keys('xxx')
# 进行js程序 : excute_script('jsCode')
# 前进,后退 : back(),forward()
# 关闭浏览器 : quit()
6.2 案例 - 爬取药监局企业名称(动态页面)
- 药监局网页链接:http://scxk.nmpa.gov.cn:81/xk/
- 需求: 爬取药监局网页中的企业名称
- python代码链接:https://paste.ubuntu.com/p/m98NvjM8rm/
6.3 iframe + 动作链
6.3.1 使用iframe前提:
该指定标签存在于 iframe标签内,无法正常定位,需要更改定位操作的作用域
6.3.2 动作链 - 案例
-
selenium – iframe处理 + 动作链
-
拖动方块到某指定位置
-
网址链接为:https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable
6.3.3 综合案例
-
需求:使用selenium 模拟登录人民邮电出版社(https://www.ptpress.com.cn/login),并获取用户浏览历史中的图书
7. scrapy
7.1. scrapy环境 + 大致流程:
在Terminal中输入:
- pip install scrapy (环境)
- 继续输入 cd XXX(想创建文件的相对目录)
- 创建一个工程:输入 scrapy startproject first(想创建的工程文件名称)
- 在spiders子目录中创建一个爬虫文件(要先cd到当前(上述)文件夹first): 输入:scrapy genspider test01(爬虫文件名称) ww.xxx.com(要爬取的网址)
- 修改相关配置文件(具体分析)
- 执行工程: scrapy crawl test01(爬虫文件名称)
7.2 创建工程:
7.2.1 在terminal中输入:
-
cd scrapy(放置scrapy的文件夹名称)
-
scrapy startproject first(工程文件名)
-
cd first
-
scrapy genspider test01 www.xxx.com(在spiders目录下产生了test01的python文件,后续使用这个文件编写程序)
-
scrapy crawl test01(修改里面的内容后 执行)
7.2.2 修改配置文件(当前工程目录下的settings.py)
- 修改 ROBOTSTEXT_OBEY(robotstxt_obey) 的值为 False (君子协议)
- 修改 USER_AFENT(user_agent) 的值(UA伪装)
- 添加 LOG_LEVEL(log_level)的值为 ‘ERROR’ (调整输出的日志信息)
- 取消 DOWNLOADER_MIDDLEWARES(中间价)、ITEM_PIPELINES(管道)的注释
7.2.3 注意:
- 使用xpath解析response时:
- xpath返回的是列表,但列表元素是Selector类型的对象
- 而extract可以将Selector对象中data参数存储的字符串提取出来
7.2.4 代码示例:
-
content = response.xpath(’//div’)[0].extract()
-
contene = response.xpath(’//div’).extract_first() (列表中只有一个元素时可以使用,与上行代码相同)
-
content = response.xpath(’//div’).extract() (返回列表)
content = ‘’.join(content)(将列表转为字符串)
7.3 持久化存储
7.3.1 基于终端的指令(较为局限)
- 要求:只可以将parse方法的返回值存储到本地的文本文件中
- 注意:fileType 只可以为:‘json’,jsonlines’,‘jl’,‘csv’,‘xml’,‘marshal’,‘pickle’
- terminal代码:scrapy crawl XXX -o fileName.fileType(执行时)
7.3.1 基于管道的指令
7.3.2 流程(管道)
- 数据解析
- 在item类中定义相关的属性(items.py文件中定义,使用scrapy.Field()方法)
- 将解析的数据封装存储到item类型的对象
- 将item类型的对象提交给管道进行持久化存储
- 在管道类的process_item中要将其接收到的item对象中存储的数据进行持久化存储操作
- 在配置文件中开启管理
7.3.3 说明:
- 在text01(爬虫文件)文件中:
- from first.items import FirstItem(将first目录下封装的item()方法调用到爬虫文件中)
- 解析数据、封装item类
- 在settings(配置文件)中修改:
- USER_AGENT(取消注释,修改它的右值) : UA伪装
- LOG_LEVEL = ‘ERROR’ (terminal中不输出日志记录)
- ITEM_PIPELINES(取消注释):开启管道
- DOWNLOADER_MIDDLEWARES(取消注释):开启下载器、中间件
- 在pipelines.py中 写 持久化存储的部分
- 在middlewares.py中修改有关中间件的部分:修改request,response,代理IP
7.4 案例
7.4.1 案例1
-
目的:
- url = ’https://war.163.com/‘
- 在 https://war.163.com/ 网址中爬取导航栏文本,并持久化存储到test01.txt文件中 (首页 图片 国内 国际 数读 军事 航空 新闻 学院 政务 公益 媒体 王三三)
-
代码示例:
-
代码文件层次如下:
- first (工程文件名称)
- first
- spiders
- items.py
- middlewares.py (未修改)
- pipelines.py
- settings.py
- first
- first (工程文件名称)
-
代码文件说明:
- first : 工程文件目录
- text01.py : 爬虫文件(在spiders文件目录下,文件名取决于自己所输入的文件名)
- items.py : items类文件(文件名称系统生成,下面文件一致)
- middlewares.py : 中间件文件
- pipelines.py : 管道文件
- settings.py : 配置文件
– 问题
1. 中文乱码问题:
# 1. 手动设定响应数据的编码格式
response.encoding = 'utf-8'
# 2.通用解决方案:(name : 出现乱码问题的变量)
name = name.encode('iso-8859-1').decode('gbk')
2. 创建文件夹
import os
if not os.path.exists('./dir_name'):
os.mkdir('./dir_name')