赞
踩
发送请求之前要准备url地址 构造请求头 准备数据 以及IP池
url要寻找规律
请求头里注意 user-Agent referer cookie选项
user-Agent: 是用来识别用户客户端形式:可以从fake_useragent 中的UserAgent获得
cookie: 已经登录的身份识别
referer:是发出请求的源地址
数据:将数据以json格式传输
IP代理池:是更换ip地址,防止同一ip多次请求被封
请求的方式分为get 和 post session会话
get方式:requests.get(url , data=data, headers=header , proxies=proxy) 地址后需要拼接? 来携带参数
post方式:requests.post(url , data=data, headers=header , proxies=proxy)
session方式: session=requests.session() session.get() session.post()
安全验证:默认情况是需要验证的,如果不验证,可以更改 verify=False
import requsets #生成客户端信息 from fake_useragent import UserAgent UA = UserAgent() url=''#请求地址 data = {#数据 'color': '16777215', 'fontsize': '25', 'csrf_token': 'ae6a792688d2deb595cf8e73d4b461bf', 'csrf': 'ae6a792688d2deb595cf8e73d4b461bf' } #请求头 header = { 'Referer': 'https://accounts.douban.com/login', 'User-Agent': UA.random ,#调用random方法,随机产生一个 'Cookie': cookie值, } #IP代理 proxy = { 'http': '119.101.114.244:9999', 'https': '119.101.114.244:9999' } #设置安全验证 r = requests.get(url, verify=False) r.encoding=编码方式 #设置响应的编码方式 print(r.text) # r.json() r.content等
IP代理网站:
免费:
1. 站大爷
2. 西刺网
收费:
1. 蘑菇代理
2. 阿布云
3. 快代理
4. 代理云
5. 豌豆代理
获得响应
response=requests.get(url , data=data, headers=header , proxies=proxy)
响应数据为二进制流,必须对响应结果进行处理
response.encoding=‘gb2312’ 改变编码方式
response.text进行文本处理
response.json()进行json格式处理
r.content 得到二进制 如图片,视频等二进制文件
处理响应,主要是提取需要的数据
用到的工具有:正则 xpath css jquery 等,定位需要的信息所在的位置,将信息提取出来
[ ] : 在中号里面的字符 随意匹配一个 或 [abc] a 或者 提取 b 或者 提取c
注意: 匹配一个字符 结果是一个的
[^abc] : 不取abc 非
[a-z] : 提取从a到z的字母 范围的写法
注意: 扩展的时候不要加空格
\d : 匹配数字 一个 \D : 不匹配数字
\s: 匹配空白符 等价写法 \S: 取非空白
\w: [a-zA-Z0-9_] 默认先匹配大写 \W: [ ^a-zA-Z0-9_
任意次 * 至少一次 + 最多一次 ?
{m} : 匹配m次
{n,m}: 匹配n次到m次 注意: 默认 贪婪匹配(尽量匹配最多)
{n,m}?: 非贪婪匹配(尽量匹配最少)
? 前面加上数量词 都是变成了非贪婪匹配
(.*?) 尽量短的匹配 分组() 捕获
边界: ^ 以什么开头 $ 结尾
\b : 匹配一个单词边界 边界没有宽度 常用来提取单词 \b要转义 \\b
| – > a|b 先匹配左侧 --> 如果匹配不了 -->再匹配右侧
用来分组的概念
1. 可能一个正则有许多括号 (asda(asdas)sd) 查看组的个数 从左到右依次数 ‘(’ 第一个括号是第一组 …
2. group() 取出第几组
1.> 0 全部取出匹配的结果
2.> 1 取出第一组
3.> 2 取出第二组
引用:
引用捕获到的东西
用法: \number
number就是捕获组的编号
例如: \1 引用第一组捕获到的值 PythonSpider
引用的就是捕获到的值
re模块的使用:
函数式的
re.search(pattern ,string, flages)
re.match(pattern ,string, flages)
匹配字符串开头 并且只匹配一次
re.findall(pattern ,string, flages) 在字符串中查找所有的结果 并且返回的结果是列表形式
如果没有匹配,则返回一个空列表。
finditer(): 和findall一样只是结果是迭代器
split():分割字符串 去掉了匹配到的字符串 结果是列表形式
maxsplit: 默认是 0 表示全部切割 1 代表切割一次 2 代表切割两次
re.sub(pattern, repl, string, count=0, flags=0): 替换匹配到的字符串
pattern: 正则 repl: 要替换的字符串
string: 待替换的字符串
count: 替换的次数 0 全部替换 1 替换一次 2 替换两次
flages参数的使用:
re.I --> 无视大小写 大小写都可以匹配
re.S --> 使 . 能匹配换行符 .? 可以经常使用 (.?) 和 .*? 来提取数据
对象式的
object = re.compile(‘正则表达式规则’) —> 一般比较高效
object.search(string, flages)
规则
/ : 代表从根节点开始(/bookstore) 或者是选择子(儿子)节点(book/)
// : 从任意节点开始 或者是选择子孙节点 (book//)
. : 当前节点
… : 上一层节点
@ : 选取属性
text(): 选取标签中的值
[ ] : 限定xxx
[@attrib] : 限定只选择 具有attrib属性的 //book[@cover] 选择book节点下的拥有cover属性的
[@attrib=‘value’]: 选择具有属性attrib 的 并且 值等于value
| : 选择左右两个值
book[1]: 谓词(索引)
//li[contains(@attrib,value)]: 从li标签中选择具有attrib属性的 并且属性的值包含vaule(模糊匹配) attrib=‘我是张三’ //li[contains(@attrib,‘我是’)]
//li[text()=‘xxx’]: 选择li标签下的值等于xxx
注意:
//li[contains(@attrib,value)] (@attrib,value) 中间的 “,” 号不要加空格
lxml库
from lxml import etree 1.etree.parse(...): 1. 读取文件xml 2. etree 是lxml里面的一个类 DOM element tree 3. 直接写上文件名 3.etree.tostring(...): 1. 传入解析对象 2. 返回字节流形式 2.etree.HTML(...): 1. 传入参数html 2. 返回经过解析后的对象 --> 树搜索路径 X(ml)Path(路径) 供以后XPath的使用 3. 自动补全残缺的html --> <a>564654</a> 初始化 4.XPath解析对象.xpath(): 写入xpath规则 返回结果是列表
json模块
import json
1. json.loads
将json对象转化为Python对象
2. json.dumps
将Python对象转化为Json对象
注意:
dumps编码默认是Ascii Python默认Unicode 所有编码转化为Unicode ensure_ascii=False
3. json.load
4. json.dump
import requests from lxml import etree class MaoYanSpider(object): # 获取响应 def getOnePage(self, url): '''获取一页的响应的函数''' response = requests.get(url) return response.text # 解析响应 --> 结果 def parseOnePage(self, text): # 初始化解析 html = etree.HTML(text) # 里面有所有的数据 先选择上一层 这一层里面包含所有数据 然后循环遍历 data = html.xpath('//dl[@class="board-wrapper"]') # 遍历提取所有的元素 for dat in data: print(dat) # 继续选取 # 标题 title = dat.xpath('.//div//a/text()') # 主演 star = dat.xpath('.//p[@class="star"]/text()') # 时间 releasetime = dat.xpath('//p[@class="releasetime"]/text()') for tit, sta, rel in zip(title, star, releasetime): # 在函数里面遇到return就终止 # 生成器 yield { '电影名字': tit, '主演': sta.strip(), '上映时间': rel } @staticmethod def save2File(data): with open('maoyan66.txt', 'a', encoding='utf-8') as fp: fp.write(data+'\n') # @classmethod # def save2File(cls, data): # with open('maoyan66.txt', 'a', encoding='utf-8') as fp: # fp.write(data+'\n') def main(): for page in range(10): # 一页网址 url = f'https://maoyan.com/board/4?offset={page*10}' # 调用 r = maoyanspider.getOnePage(url) # 解析数据 返回生成器 result = maoyanspider.parseOnePage(r) for res in result: # with open('maoyan.txt','a',encoding='utf-8') as fp: # # 打印到文件 # print(str(res), file=fp) MaoYanSpider.save2File(str(res)) if __name__ == "__main__": maoyanspider = MaoYanSpider() main()
Selenium介绍:
1. 自动化测试工具
2. 类似按键精灵 反复的执行我们编写的命令 --> QQ群发器
3. 可以像人一样访问网站 在浏览器里面
工作原理:
Python–>Selenium–>浏览器
配置流程:
1. 浏览器安装 注意版本
2. 驱动下载安装 注意版本
3. 安装Selenium pip install selenium
不要取文件名取Selenium
selenium包
from selenium import webdriver
# 初始化 打开火狐浏览器
# driver = webdriver.Firefox()
# 初始化 打开谷歌浏览器
driver = webdriver.Firefox()
# 打开百度首页
url = 'https://www.taobao.com/'
# 打开 get 就类似与在浏览器地址栏里面放入网址
driver.get(url)
# 退出浏览器
driver.quit()
方法(共提供8中方法):
调用:
driver 是 实例化后的对象
driver.find_element_by_xpath()
1. find_element_by_xpath --> 只是选择元素 具体的信息要使用方法来提取 这个方法只提取一个元素 2. find_elements_by_xpath 这个方法只提取多个元素 3. find_elements_by_xpath 有自己的属性 .text 选取文本 get_attribute()选择属性 from selenium.webdriver.common.by import By class By(object): """ Set of supported locator strategies. """ ID = "id" XPATH = "xpath" LINK_TEXT = "link text" PARTIAL_LINK_TEXT = "partial link text" NAME = "name" TAG_NAME = "tag name" CLASS_NAME = "class name" CSS_SELECTOR = "css selector" 可以看出共有8中方法可以选择 案例查看等待中的 显式等待案例
iframe:
定义: 就是在一个html页面中有了另一个页面 子页面 iframe作为标签出现
定位到框内:
switch_to.frame(value) --> 切换进框内
vaule:
1. 用索引 第几个框 从0开始 0 1 2 3 ...
2. xpath元素定位
3. id iframe ....
:Usage:
driver.switch_to.frame('frame_name')
driver.switch_to.frame(1)
driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0])
from selenium import webdriver # 网易云网址 url = 'https://music.163.com/#/song?id=31108473' # 初始化浏览器 driver = webdriver.Chrome() # 打开网站 driver.get(url) # 切入框内 driver.switch_to.frame(0) # 选择元素 result = driver.find_element_by_xpath('/html/body/div[3]/div[1]/div/div/div[2]/div/div[2]/div[2]/div[1]/div[2]/div[1]/div') # 打印信息 print(result.text) # 退出 #driver.quit()
模拟登陆豆瓣网
import time from selenium import webdriver # 网址 url = 'https://accounts.douban.com/login' # 初始化浏览器 driver = webdriver.Firefox() # 打开网址 driver.get(url) # 定位账号框 zhanghao = driver.find_element_by_xpath('//*[@id="email"]') # 输入账号 zhanghao.send_keys('1960958490@qq.com') time.sleep(2) # 账号密码 mima = driver.find_element_by_xpath('//*[@id="password"]') # 输入密码 mima.send_keys('Python@314159') time.sleep(2) # 自动登录 zidong = driver.find_element_by_xpath('//*[@id="remember"]') zidong.click() time.sleep(2) # 点击登录 denglu = driver.find_element_by_xpath('//input[@class="btn-submit"]') # 点击 denglu.click() time.sleep(5) driver.quit()
''' 拖动鼠标: ActionChains: ActionChains() --> 直接传入driver --> ActionChains(driver) 实例化 perform --> 执行动作 drag_and_drop(source, target) source拖动的元素 target元素被放置的位置 ''' import time from selenium import webdriver from selenium.webdriver import ActionChains # 网址 url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable' # 初始化 driver = webdriver.Firefox() # 打开网站 driver.get(url) # 切入框内 driver.switch_to.frame(0) # 找到可以拖拽的元素 drag = driver.find_element_by_xpath('//*[@id="draggable"]') # 需要放置的位置的元素 drop = driver.find_element_by_xpath('//*[@id="droppable"]') # 实例化 action = ActionChains(driver) # 定义动作 但是不执行 没有执行 action.drag_and_drop(drag, drop) # 执行 action.perform() time.sleep(5) driver.quit() ''' 注意: perform才是真正的执行 可以在perform之前定义多个动作 最后一起执行 注意切入框内 switch_to.frame(0) '''
''' 下拉框: Select(element) element是下拉框的元素 选择的方法: 1. select_by_value(value) value="天津市" 2. select_by_index(1) 通过索引 1 2 3 4 5 6 3. select_by_visible_text(text) 通过可见的文本 ''' import time from selenium import webdriver from selenium.webdriver.support.select import Select url = 'http://www.jq22.com/demo/shengshiliandong/' # 初始化浏览器 driver = webdriver.Firefox() # 打开 driver.get(url) # 寻找可以选择的元素 并实例化Select elememt = driver.find_element_by_xpath('//*[@id="s_province"]') # 实例化Select select = Select(elememt) time.sleep(2) # 选择具体的值 select.select_by_index(5) time.sleep(2) select.select_by_value('河南省') time.sleep(2) select.select_by_visible_text('四川省') driver.quit() ''' index 索引从 0 开始 value是option标签的一个属性值,并不是显示在下拉框中的值 visible_text是在option标签文本的值,是显示在下拉框的值 '''
''' 执行JS代码: JS代码需要我们写 Lua脚本 常见的js代码: window.open(url) --> 用浏览器打开url window.scrollBy(0, 1000) 拖动滑动条 Selenium怎么执行: .execute_script(js代码) ''' import time from selenium import webdriver js = "window.open('https://www.baidu.com')" driver = webdriver.Firefox() driver.get('https://www.taobao.com/') # 执行js代码 打开百度首页 driver.execute_script(js) time.sleep(2) # 强制暂停 driver.quit() ''' close: 关闭当前页面 quit: 整个退出 '''
''' 执行下拉滚动条: 往往用于点击事件 下拉以后才能点击的 ''' ''' 下拉网易云音乐: 注意切入框内 ''' from selenium import webdriver url = 'https://music.163.com/#/song?id=254574' driver = webdriver.Firefox() driver.get(url) # 切入框内 driver.switch_to.frame(0) # 执行js代码 下拉滚动条 js = 'window.scrollBy(0, 8000)' # 执行js driver.execute_script(js) ''' 注意: 对于含有iframe的框也需要先切换进入框内才可以下拉。 '''
为什么需要等待:
有时候加载比较慢 我们想要的元素已经出现了 但是还要等待其他元素的加载
有些元素没有加载出来 我们要等待它加载出来
隐式等待:
等待整个页面 隐式等待就是针对页面的
显式等待:
等待某个元素加载出来 针对元素的
''' 隐式等待: 用法:implicitly_wait(s) s 是秒 在固定的时间页面还有加载出来就不再等待 ''' import time from selenium import webdriver url = 'https://www.receivesmsonline.net/' driver = webdriver.Firefox() # 等待 driver.implicitly_wait(10) # 对这个没有限制 driver.get(url) # 选择元素 try: startTime = time.time() # 计算时间戳 print('开始进入等待时间---->>', startTime) # 肯定出错 程序一致在这个地方等待 10 秒 一致等到你找到 或者 等到规定的时间 在规定的时间没找到 就报错 driver.find_element_by_xpath('adasdafgaghs') except: endTime = time.time() print('等待了多少秒---->>', endTime-startTime) ''' 注意:' implicitly_wait 是全局的 只需要设置一次即可 '''
''' 显式等待指定某个条件,然后设置最长等待时间 WebDriverWait: WebDriverWait(driver, timeout) 实例化的driver timeout等待的时间 until: 直到xx条件符合为止 until(条件) 条件: presence_of_element_located: 当前的元素被加载进来了 presence_of_element_located是一个类 初始化要写定位的元素 一般是元组格式: (By.ID, 'vaule') ''' import time # 导入模块 from selenium import webdriver # 导入等待的显式等待的类 from selenium.webdriver.support.ui import WebDriverWait # WebDriverWait(driver) # 导入判断元素的条件 from selenium.webdriver.support import expected_conditions as EC # 导入选择元素的方法 from selenium.webdriver.common.by import By url = 'https://www.receivesmsonline.net/' driver = webdriver.Firefox() driver.get(url) try: startTime = time.time() # 计算时间戳 print('开始进入等待时间---->>', startTime) wait = WebDriverWait(driver, 5) # 一直去寻找(By.ID, 'asdhakhkfl')被加载进来 直到时间耗尽 如果提前找到 就提前返回 element = wait.until(EC.presence_of_element_located((By.ID, 'asdhakhkfl'))) except: endTime = time.time() print('等待了多少秒---->>', endTime - startTime)
import time from selenium import webdriver class YunSpider(object): def __init__(self, url): # 网址 self.url = url # 初始化浏览器 self.driver = webdriver.Firefox() def getContent(self): # 打开网址 self.driver.get(self.url) # 切入框内 self.driver.switch_to.frame(0) for n in range(5): # 下拉混动条 js = 'window.scrollBy(0, 8000)' self.driver.execute_script(js) time.sleep(1) # 选元素 elememts = self.driver.find_elements_by_xpath('//div[contains(@class,"cmmts")]/div') # 循环遍历 for text in elememts: result = text.find_element_by_xpath('.//div[contains(@class,"cnt f-brk")]').text print(result) # 翻页 self.driver.find_element_by_partial_link_text('下一').click() time.sleep(1) # 暂停1s @staticmethod def save2File(data): with open('Yun.txt', 'a', encoding='utf-8') as fp: fp.write(data+'\n') # print # 在对象销毁的时候自动执行这个魔术方法 引用计数为0 def __del__(self): # 退出 self.driver.quit() if __name__ == '__main__': url = 'https://music.163.com/#/song?id=574566207' yunspider = YunSpider(url) yunspider.getContent()
可以直接登录,像用户正常登录一样,
# coding = utf-8
from selenium import webdriver
# 设置配置文件路径 每个浏览器都不一样
profile_path = r'C:\Users\Administrator\AppData\Roaming\Mozilla\Firefox\Profiles\guzr7wpi.default'
# 加载配置数据
profile = webdriver.FirefoxProfile(profile_path)
# 启动浏览器配置
driver = webdriver.Firefox(firefox_profile=profile)
driver.get('https://taobao.com')
# driver.quit()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。