Loading

爬虫

requests 模块

获取数据方式

静态页面

import requests
response=requests.get(url="https://www.baidu.com")
print(response.text)

动态加载数据

豆瓣动画电影排行榜

import requests
import json
url='https://movie.douban.com/j/chart/top_list'
params={'type':25,'interval_id':'100:90','action':'','start':0,'limit':169}
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.81'}
response=requests.get(url=url,params=params,headers=headers)
content=response.json()
tot=0
for s in content:
    print(s['title'],s['score'])
    tot+=1
    if tot==5:
        break

图片

百度图片

import requests
url="https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png"
response=requests.get(url=url)
#提取图片的二进制字节码
content=response.content
#将二进制字节码写入文件
with open ('baidu.png','wb') as fp:
    fp.write(content)

get()函数

参数介绍

headers 请求头

headers={'User-Agent':'Mozilla/5.0 (Linux; Android 9; SM-G960F) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/80.0.3987.119 Mobile Safari/537.36 MicroMessenger/7.0.10.1580(0x27000A53 NetType/WIFI Language/zh_CN'}

params 动态参数

timeout 请求超时的时间(s)

timeout=1.0

proxies 代理服务器

proxies={'https':101.123.102.12:7999}

verify参数 绕过SSL证书认证。

现在很多网站要求使用HTTPS协议,但有些网站没有设置好HTTPS证书或者其证书不被CA机构认可,就会出现SSL证书错误的提示。
为了让我们的爬虫进行下去,我们设置verify = False 来取消证书验证。

post()函数

Re正则表达式

普通字符表
1695084580182

元字符表
1695084613067

re模块

findall() 提取满足正则表达式的所有字符串 []

search() 匹配第一个满足正则表达式的字符串,用group()取值

match() 从开头匹配的search()

finditer() 返回迭代器的findall()

BeatifulSoup模块

定位方式

1.标签名

返回第一个p标签
soup.p

2.标签属性

soup.find(class_='')
soup.find_all(id='')

3.标签名+标签属性

soup.find('div',class_='')

4.选择器

返回所有符合条件的标签

(1) id选择器

soup.select('#id_name')

(2) class选择器

soup.select('.class_name')

(3) 标签选择器

soup.select('li')

(4) 层级选择器

>表示向下找一个层级,中间不能有其他层级
空格表示中间可以有多个层级

soup.select('div>ul>#id_name')
soup.select('div>ul>li')
soup.select('div li')

提取文本和属性

string属性返回直系文本
soup.select('.class_name')[1].string
text属性返回所有文本
soup.select('.class_name')[1].string
字典取值提取标签属性
soup.select('.class_name')['class']

Xpath表达式

html=etree.parse('text.html')
html=etree.HTML(response.text)

定位标签

(1)标签名定位

(2)索引定位

(3)属性定位

html.xpath('//*[@class='class_name']')

//表示多层级,*表示任意标签

(4)逻辑运算定位

提取文本内容和属性

/text() 直系文本内容

//text() 所有文本内容

/@属性名 指定属性值

数据清洗

1.异常值处理

替换为空值后删除
data['price'][data['price']>1000=None
data.dropna()
或替换为空值后进行数据插补
data['price'][data['price']>1000=None
data.fillna(data.mean())\

乱码处理

从网页源码查看<meta>标签的charset属性编码格式

response.encoding=response.apparent_encoding

Selenium模块

from selenium import webdriver
browser=webdriver.Edge(executable_path='msedgedriver.exe')
browser.get('url')

常用函数或属性

函数 功能
browser.maximize_window() 浏览器窗口最大化
browser.get_cookies() 获取cookies
browser.refresh() 刷新
browser.quit() 关闭所有网页并退出驱动程序
browser.close() 关闭当前网页
browser.back() 返回上一页
属性 功能
browser.name 驱动程序名称
browser.title 网页标题
browser.page_source 网页源代码
browser.current_window_handle 获取当前网页窗口
browser.window_handles 获取当前打开的所有网页窗口

标签定位

定位方式 函数element(s)
id find_element_by_id(id_name)
name find_element_by_name(name)
class find_element_by_class(class_name)
标签名称 find_element_by_tag_name()
链接文本精确定位 find_element_by_link_text
链接文本模糊定位 find_element_by_partial_link_text
css find_element_by_css_selector
xpath find_element_by_xpath

标签操作

函数 属性
get_attribute() text
tag_name() size
is_selected() location
is_dispalyed()
is_enabled()
send_keys 对标签赋值
click()

模拟鼠标操作

from selenium import webdriver
from selenium.webdriver import ActionChains
import time

browser=webdriver.Edge(executable_path='msedgedriver.exe')
browser.get('https://www.taobao.com')
search_button=browser.find_element_by_xpath('//*[@id="J_TSearchForm"]/div[1]/button')
actions=ActionChains(browser)
#鼠标单击
actions.click(search_button).perform()
#鼠标双击
actions.double_click(search_button).perform()
#鼠标右键单击
actions.context_click(search_button).perform()
#鼠标长按
actions.click_and_hold(search_button).perform()
time.sleep(5)
actions.release(search_button).perform()
#鼠标拖动
actions.drag_and_drop()
#鼠标拖动,给出水平和垂直的位移值,常用于拖动滑块验证
actions.drag_and_drop_by_offset()
#鼠标移动
actions.move_by_offset()
actions.move_to_element()

<iFrame>处理

嵌套在一个网页中的另一个网页

显式等待

当指定条件成立时再进行下一步操作,如果条件一直不成立就一直等待,直到等待时间达到了设定的超时时间才会报错

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
import time

browser=webdriver.Edge(executable_path='msedgedriver.exe')
browser.get('https://www.taobao.com')

#until()函数在等待期间会每隔一段时间就判断元素是否存在,直到返回值不是False,如果超时则报错
element=WebDriverWait(driver=browser,timeout=10).until(EC.presence_of_element_located((By.ID,'q')))
#until_not()函数在等待期间会每隔一段时间就判断元素是否存在,直到返回值是False,如果超时则报错
element=WebDriverWait(driver=browser,timeout=10).until_not(EC.presence_of_element_located((By.ID,'w')))

隐式等待

在实例化浏览器的WebDriver对象时,为该对象设置一个超时时间,在操作该对象时,代码遇到元素未加载完毕或不存在时,会在规定的超时时间不断地刷新页面来寻找该元素,直到找到该元素,如果超过超时时间还是找不到该元素,则会报错。
仅适用于元素缺少的情况
隐式等待的作用是全局的,是作用于整个 session 的生命周期,也就是说只要设置一次隐式等待,后面就不需要设置。如果再次设置隐式等待,那么后一次的会覆盖前一次的效果。

IP反爬

cookie池模拟登录

requests模块get()函数,headers直接携带cookie

import requests
url='http://card.cqu.edu.cn/User/User'
cookie='Hm_lvt_fbbe8c393836a313e189554e91805a69=1695035025,1695083340,1695090104,1695102226; ASP.NET_SessionId=f5lgsxc003ae2tzwezxfmd2o; hallticket=7438A8ECFC6848668164DC892D33A719'
headers={'Cookie':cookie,'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.36'}
response=requests.get(url=url,headers=headers).text
print(response)

cookie存为字典,get()cookies携带

posted @ 2023-09-20 12:03  chenelm  阅读(46)  评论(0)    收藏  举报