1. 爬虫基础知识
1.1 HTTP通信过程:浏览器在上面输入url,通过浏览器发送一个请求,基于url的地址找到对应的Sever,Sever根据请求获得响应,浏览器对获得的响应进行解析。
1.2 请求
(1)请求方式:get和post
(2)请求URL:对应的Sever的地址
(3)请求头:User-Agent、Content-Type、Cookie等
(4)请求体:POST有请求体,Form Data;get请求没有请求体
1.3 响应
(1)响应状态:200(请求成功)、301/302(重定向)、404(Not Found)、500(内部错误)
(2)响应头:Set_cookie(会话、账号、密码)
(3)响应体:重要部分,我们需要获得的信息主要涵盖在这部分
1.4 爬虫的原理
爬虫:就是一个获得网页和进行信息提取,并进行保存的一个自动化过程。
获得网页:主要通过模拟浏览的来跟目标Sever进行交互,获得响应信息。请求库:urllib、requests
提取信息:json字符串:json库,转化成字典的形式;html:Beautifulsoup、pyquery(css)、lxml(xpath)、正则表达式;二进制文件:保存就行
保存:保存到数据库
2. Urllib
2.1 urllib.request#请求
(1)urllib.request.urlopen(url,data=None,timeout)#发送请求,并获得响应,返回的是httpResponse对象
(2)httpResponse:方法--read()、getheaders()、getheader();属性:status、reason等
(3)urllib.request.Request(url,data=None,headers={},method='GET')#构建Request对象
2.2 urllib.parse#url解析
(1)urllib.parse.urlencode({})#多个参数的url编码,针对字典
(2)urllib.parse.quote()#url编码,针对一个字符串
2.3 urllib.error#异常
(1)urllib.error.URLError
(2)urllib.error.HTTPError#关于http请求过程的一些异常,它是URLError的子类
3.requests
请求库,urllib的一个基础上进行封装,使用起来更加方便
3.1.请求方式
response=requests.get(url,params={},headers={},proxies={})#get请求
response=requests.post(url,params={},data={},headers={},proxies={})#post请求
3.2.响应
response.status_code#获得状态码
response.text#响应体的信息若是html字符串
response.content#二进制的文件
response.json()#json的文件
response.url#返回包含参数的url
response.headers#响应头
response.cookies#cookies
3.3.异常
先是子类,再到父类
4.正则表达式
4.1 匹配
模式:贪婪匹配<.*>,非贪婪匹配<.*?>,数字<\d>,字符串、数字和下划线<\w>、\r\t\n<\s>,1个或多个<+>,分组<()>
转义字符:\
修饰符:re.S<.就能匹配换行符了>、re.I<对大小写不敏感>
4.2 import re
re.match()#从头开始匹配
result=re.search()#从任意位置开始匹配,返回完全匹配的第一个位置
re.findall()#返回多个
re.sub()#用来进行替换
re.compile()#编译匹配规则
4.3 目标匹配
提取我们想要的信息,先要进行分组'()'
result.group()#返回全部的匹配
result.group(1)#返回目标匹配
5.beautifulsoup4
5.1 基本操作
from bs4 import BeautifulSoup#导入
soup=BeautifulSoup(html,'html.parser')#bs4用来把HTML字符串变成半结构的beautifulsoup,也可以使用‘lxml’解析器
5.2 提取信息
#a是我们已经定位到的某个节点
a.string/a.get_text()#提取某个节点的文本信息
a.attrs['href']/a['href']#通过attrs来提取属性信息
5.3 节点选择器
soup.a.p#只能是基于节点名进行定位
soup.a.p.contents/soup.a.p.children#子节点
soup.a.p.descendants#子孙节点
soup.a.p.parent#父节点
soup.a.p.parents#祖先节点
soup.a.p.next_sibling/soup.a.p.next_siblings#找下面的兄弟节点
soup.a.p.previous_sibling/soup.a.p.previous_siblings#找上面的兄弟节点
5.4 方法选择器
soup.find_all(name,attrs,text)#返回所有满足要求的节点,返回的是一个列表
soup.find(name,attrs,text)#返回所有满足要求的第一个节点
5.5 CSS选择器
#以百度搜索按钮为例
soup.select('span.btn_wr #su')#CSS选择器,返回的是一个列表
6.Selenium渲染库
6.1 声明浏览器
from selenium import webdriver
browser=webdriver.Chrome()
6.2 请求网址
browser.get('https://www.baidu.com')
6.3 响应信息
browser.page_source#获取html源码
browser.current_url#获取当前页面的url
browser.get_cookies()#获取cookies
6.4 查找节点
a=browser.find_element_by_css_selector('')/browser.find_elements_by_css_selector('')#通过CSS选择器查找节点
a=browser.find_element_by_xpath('')/browser.find_element_by_id('')
6.5 获取信息
a.get_attribute('href')#获取属性信息
a.text#获取文本信息
6.6 节点交互
#p指的是某个节点
p.send_keys('人工智能')#用来模拟输入文本信息
p.clear()#清空文本框
p.click()#点击
6.7 动作链
from selenium.webdriver import ActionChains
action=ActionChains(browser)#声明
action.send_keys(节点1)#动作1
actipn.click(节点2)
action.drag_and_drop(节点3)
action.perform()#执行
6.8 延时
6.8.1 隐式等待
隐式等待
当使用了隐式等待执行测试的时候,如果 WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常,
换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是0
browser.implicitly_wait(10)#隐式等待10秒
6.8.2 显式等待
显式等待
指定一个等待条件,和一个最长等待时间,程序会判断在等待时间内条件是否满足,如果满足则返回,如果不满足会继续等待,超过时间就会抛出异常
from selenium.webdriver.common.by import By#查找节点的方式
from selenium.webdriver.support import expected_conditions as EC#判断条件
from selenium.webdriver.support.ui import WebDriverWait#设置显示等待的时间
wait=WebDriverWait(browser,10)#设置显式等待的时间
wait.until(EC.presence_of_element_located((By.CSS,'.class #id name')))
wait.until(EC.text_to_be_present_in_element((By.CSS,'.class #id name'),'2'))
title_is 标题是某内容
title_contains 标题包含某内容
presence_of_element_located 元素加载出,传入定位元组,如(By.ID, 'p')
visibility_of_element_located 元素可见,传入定位元组
visibility_of 可见,传入元素对象
presence_of_all_elements_located 所有元素加载出
text_to_be_present_in_element 某个元素文本包含某文字
text_to_be_present_in_element_value 某个元素值包含某文字
frame_to_be_available_and_switch_to_it frame加载并切换
invisibility_of_element_located 元素不可见
element_to_be_clickable 元素可点击
staleness_of 判断一个元素是否仍在DOM,可判断页面是否已经刷新
element_to_be_selected 元素可选择,传元素对象
element_located_to_be_selected 元素可选择,传入定位元组
element_selection_state_to_be 传入元素对象以及状态,相等返回True,否则返回False
element_located_selection_state_to_be 传入定位元组以及状态,相等返回True,否则返回False
alert_is_present 是否出现Alert
6.9 异常
NoSuchElementException#没有找到对应节点的异常
TimeOutException#显示等待超出等待时间的异常
def parse(self, response):
quotes = response.css('.quote')
def parse(self, response):
# 从请求过来的参数和网页源码进行解析,获取数据
results = response.xpath('//div[@class="items"]/div[contains(@class,"item")]')
*********************************************************************************************
Xpath
// 定位根节点
/ 往下层寻找
提取文本内容:/text()
提取属性内容: /@xxxx
以相同的字符开头 starts-with(@属性名称, 属性字符相同部分)
标签套标签 string(.)
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。
实例
在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:
路径表达式 结果
bookstore 选取 bookstore 元素的所有子节点。
/bookstore 选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book 选取属于 bookstore 的子元素的所有 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取名为 lang 的所有属性。
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang='eng'] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。
通配符 描述
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。
/bookstore/* 选取 bookstore 元素的所有子元素。
//* 选取文档中的所有元素。
//title[@*] 选取所有带有属性的 title 元素。
//book/title | //book/price 选取 book 元素的所有 title 和 price 元素。
//title | //price 选取文档中的所有 title 和 price 元素。
/bookstore/book/title | //price 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。
爬虫总结
最新推荐文章于 2024-06-14 23:14:11 发布