爬虫总结

1. 爬虫基础知识
1.1 HTTP通信过程:浏览器在上面输入url,通过浏览器发送一个请求,基于url的地址找到对应的Sever,Sever根据请求获得响应,浏览器对获得的响应进行解析。
1.2 请求
(1)请求方式:getpost2)请求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 元素。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值