python爬虫笔记

http是超文本传输协议

爬虫是模拟浏览器向web服务器发送http请求

http包含数据头和数据体

http有4种请求头,通用头,请求头,响应头,实体头

常用请求方法:get获取网页信息,post用于表单等,put三种请求

响应头:
状态200成功,301跳转,404找不到,502服务器错误
包含内容信息,内容长度,服务器信息,设置cookie
响应体,包含了请求资源的内容,html图片二进制数据等

http请求是无状态协议,请求结束之后就连接关闭了

cookie,是一段用作用户身份认证的手段
cookie实现过程:客户端请求服务器,服务器端响应请求生成cookie的key-value字符串返回给客户端浏览器保存,接着客户端再次请求服务器,且携带者cookie信息
cookie保存两种方式:磁盘保存,内存保存

静态网页是指html写好的固态的没有后台服务器数据的一个普通html文本

爬虫基本流程:
发起请求,通过http库向目标发起(request)请求,可包含额外的请求头信息
获取响应内容,服务器响应到会得到一个(response)响应体
解析内容,一般是html通过正则表达式,网页解析库解析,json等
保存数据,保存多种形式的数据或特定格式的文件


requests库是python种原生的http库,发送原生的http1.1请求
import requests
rq =requests.get('http://tipdm.com/') # 对目标网址发起get请求
rq.status_code # 返回请求状态码
rq.text # 获取网页字符串形式源码
rq.content # 比特位方式返回源码 
rq.encoding # 获取编码
rq.headers # 获取请求头
with open('web.txt','w',encoding='utf-8') as p:
    p.write(rq.text) #保存网页源代码
headers = {...} #请求头
requests.get(url,headers=headers)# 指定请求头
requests.get(url,headers=headers,timeout=2.) # timeout响应时间
rq.encoding=chardet.detect(rq.content)['encoding'] #预估请求的编码并且设定


解析网页,目的是为了提取想要的目标信息进行组成结构化的数据对象:
Xpath,xpath只能解析网页
from lxml import etree # 导入xpath所需库
dom = etree.HTML(网页文本) # 解析网页成dom树,只能解析网页
dom.xpath('/html/head/title/text()') # /为父子关系如html下一级head,text()获取节点下的文本
xpath路径:
    / 为父子关系层级
    // 任意层级下的
    text() 获取节点下的文本数据
    [1] 用于选取多个节点的第一个例 /html//title[1]
    [@id="link"] 加上属性取值获取目标元素
    @href 获取属性值 /html/title/@href

Beautiful Soup解析网页
pip install beautifulsoup4 #安装库
from bs4 import BeautifulSoup # 导入库
soup = BeautifulSoup(html,'lxml') # 解析网页数据
soup.a # 直接获取a标签,获取的是第一个a标签
soup.select('a[id="link"]') # 通过css来进行选择标签元素
soup.select('a[class="link"]')[0].text # 取第一个满足条件的节点文本
soup.select('a[class="link"]')[0].get('href') # 获取节点的属性href
soup.find_all('title') # 获取所有的title标签节点
soup.find_all('title',id='link') # 获取title标签id为link的节点


动态网页,动态网页是和后台数据进行联通的,动态更新的
很多网站的数据不是静态的,而是当我们刷到的时候才会进行js发起请求获取,我们不能直接进行爬取,我们可以采取从源代码中找到对应二次请求进行拼接直接对该请求进行爬取
或者我们可以通过开发者工具网络控制面板,直接搜索想要的关键字

字符串json转换成json
import json # 导入自带的json模块
json.loads(json字符串) # 返回json数组,可以用字典方式操作


Selenium库:
是一个自动化测试工具,模拟真人直接运行再浏览器中
pip install selenium # 安装库,使用需要使用谷歌浏览器
然后需要下载chromedriver驱动,放在python解释器目录下,我用的是anaconda所以放在anaconda目录下就可以
from selenium import webdriver # 导入库
chromeOptions = webdriver.ChromeOptions() #创建一个配置
chromeOptions.binary_location=f'D:\Google\Application\chrome.exe' #写入指定谷歌浏览器路径
driver = webdriver.Chrome(f'D:\Anaconda\chromedriver.exe',chrome_options=chromeOptions) # 指定驱动和浏览器路径
driver.get('url')# 访问指定网址
driver.page_source # 获取网页源码(已渲染)
windows = driver.window_handles # 获取窗口列表
driver.switch_to.window(windows[0]) # 跳转到第一个窗口页面


from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver,10) # 设置点击时长
confirm_btn = wait.until(
    EC.element_to_be_clickable( #通过css来进行选择点击的元素
        (By.CSS_SELECTOR,'#app > div > div > div.van-doc-container.van-doc-row.van-doc-container--with-simulator > div > div > div:nth-child(1) > div > p')
    )
)
confirm_btn.click() # 进行点击


search_btn = driver.find_element_by_css_selector(
    'css'
)
search_btn.send_keys("python学习") # 向输入框键入

模拟表单实现模拟登录,也是一个过反扒的一个手段之一
sess_code = requests.Session() # 构建一个会话,可以使登录的时候验证码不会刷新
sess_code.get(url) # 发起请求获取验证码
sess_code.post(url,请求体) #对登录url进行请求


使用Cookie登录方法实现模拟登录
http是无状态的,cookie是一段用于用户身份验证的key-value字符串
我们先登录一次网站,然后再请求中找到cookie,构建成字典形式
requests.get(url,cookies=cookies) # 携带cookie进行访问,状态就是登录状态

使用Selenium模拟登录的话,打开控制的浏览器之后手动进行登录


scrapy是python的一个快速部署专业爬虫项目的应用程序框架
scrapy由引擎,调度器,下载器,爬虫器,项目管道,下载中间件,spider中间件
项目步骤:1.创建工程 2.指定爬虫字段 3.编写爬虫脚本 4.编写数据保存脚本 5.运行脚本
创建项目:
    通过命令行
    scrapy startproject 工程名称  工程路径
    进入到爬虫项目下的spiders创建爬虫脚本
    scrapy genspider 爬虫名称 url主机域名
items.py文件设置爬取的字段信息
    字段名称 = scrapy.Field()
    使用的时候在爬虫脚本导入
爬虫程序的parse函数就是处理请求回来的响应结果response就是响应
    response.xpath() #可以直接进行xpath提取
运行爬虫程序
    scrapy crawl 爬虫名称 -o 文件名称 #运行爬虫文件结果保存到文件
项目管道pipelines.py
    需要在settings找到item_pipelines进行开启
    process_item函数里的item就是爬虫程序return的
    
    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值