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)
(2)httpResponse:方法
(3)urllib.request.Request(url,data=None,headers={},method='GET')
2.2 urllib.parse
(1)urllib.parse.urlencode({})
(2)urllib.parse.quote()
2.3 urllib.error
(1)urllib.error.URLError
(2)urllib.error.HTTPError
3.requests
请求库,urllib的一个基础上进行封装,使用起来更加方便
3.1.请求方式
response=requests.get(url,params={},headers={},proxies={})
response=requests.post(url,params={},data={},headers={},proxies={})
3.2.响应
response.status_code
response.text
response.content
response.json()
response.url
response.headers
response.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')
5.2 提取信息
a.string/a.get_text()
a.attrs['href']/a['href']
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')
6.Selenium渲染库
6.1 声明浏览器
from selenium import webdriver
browser=webdriver.Chrome()
6.2 请求网址
browser.get('https://www.baidu.com')
6.3 响应信息
browser.page_source
browser.current_url
browser.get_cookies()
6.4 查找节点
a=browser.find_element_by_css_selector('')/browser.find_elements_by_css_selector('')
a=browser.find_element_by_xpath('')/browser.find_element_by_id('')
6.5 获取信息
a.get_attribute('href')
a.text
6.6 节点交互
p.send_keys('人工智能')
p.clear()
p.click()
6.7 动作链
from selenium.webdriver import ActionChains
action=ActionChains(browser)
action.send_keys(节点1)
actipn.click(节点2)
action.drag_and_drop(节点3)
action.perform()
6.8 延时
6.8.1 隐式等待
隐式等待
当使用了隐式等待执行测试的时候,如果 WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常,
换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是0
browser.implicitly_wait(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(
*********************************************************************************************
Xpath
/ 往下层寻找
提取文本内容:/text()
提取属性内容: /@xxxx
以相同的字符开头 starts-with(@属性名称, 属性字符相同部分)
标签套标签 string(.)
nodename 选取此节点的所有子节点。
/ 从根节点选取。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。
实例
在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:
路径表达式 结果
bookstore 选取 bookstore 元素的所有子节点。
/bookstore 选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book 选取属于 bookstore 的子元素的所有 book 元素。
bookstor
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
/bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。
通配符 描述
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。
/bookstore