解决中文显示编码值的问题:response.text.encode().decode('unicode_escape')
爬虫
一、requests
1.获取页面
response = requests.get(url) # 获取指url对应的网页内容,返回 一个响应对象
response.status_code ?= 200 # 判断响应码是否为200,为200则为获取到数据(不一定是想要的数据),其他响应码都表示有误(400+是浏览器出错,500+是服务器出错)
url - 同一资源定位符(网址)
2.提取页面内容
1)获取网页内容原数据(类型是二进制) - 主要针对图片、视频、音频
response.content
2)获取页面内容文本格式数据 - 针对网页
response.text
3)将获取的内容进行json转换 - 针对返回url是json接口的数据接口
response.json()
3.添加客户端信息 - 伪装成浏览器
添加headers属性
headers = {
'User-Agent':#浏览器环境
'cookin':#需要登录成功才能获取数据
}
requests.get(url,headers = headers)
二、selenium
1.创建浏览器对象(谷歌)
wb = Chrome()
2.打开/关闭指定网页
wb.get(url)
wb.close()
3.获取当前浏览器中显示的页面的网页源代码
wb.page_source
4.获取页面中的标签,并且操作标签
浏览器对象.find_elements_by_css_selector(css选择器) ---- 返回列表
浏览器对象.find_element_by_css_selector(css选择器) --- 返回一个标签对象
5.向指定的输入框中输入数据
# 向输入框输入内容:输入框标签.send_keys(输入内容)
"""
search_input.send_keys('数据分析')
search_input.send_keys(Keys.ENTER)
"""
6.点击标签
# 点击标签:标签.click()
#例如: next_btn.click()
7.添加设置
from selenium.webdriver import ChromeOption
# 创建设置对象
options = ChromeOptions()
# 取消自动化测试环境提示
options.add_experimental_option('excludeSwitches', ['enable-automation'])
#取消图片的加载
option.add_experimental_option('prefs',{"profile.managed_default_content_settings.images": 2})
#最后在设置浏览对象的时候将设置对象添加进去
wb = Chrome(options)
三、代理使用
1.代理ip获取
result = requests.get(url).text
if result[0] =="{" :
return None
ips_list = result.split('\n')[:-1]
# print(ips_list)
return ips_list
2.requests设置代理
增加属性proies = {‘http’:‘ip:端口号’,‘https’:‘ip:端口号’}
3.selenium设置代理
在设置对象中添加
option.add_argument('--proxy-server=http://代理ip:端口号')
四、bs解析
from bs4 import BeautifulSoup
1.准备数据(一般是通过requests或者selenium爬取到的)
response.text requests
response.page_score() selenium
2.创建BeautifulSoup解析器对象
解析器类型 - lxml(最常用)、html.parser、xml、html5lib
soup = BeautifulSoup(content,'lxml')
3.获取标签
解析器对象.select(css选择器) - 在整个页面中按照css选择器查找指定的标签
标签对象.select(css选择器) - 在当前标签中按照css选择器查找指定的标签
-
直接写法
soup.select('p') # 查找所有的p标签 - 返回的是一个列表 soup.select('div')[N] # 查找第N个div标签,从0开始 - 返回的是一个标签 soup.select('.f1') # 查找所有class为f1的标签 - 返回的是一个列表 soup.select('#f1') # 查找所有id名为f1的标签 - 返回的是一个列表 soup.select('div>p') # 查找第一个div中的第一个p标签 - 返回的是一个标签 soup.select('div>p:first') # 查找第一个div中的第一个p标签 soup.select('div>p:nth-child(N)') # 查找第一个div中的第N个p标签 - 返回的是一个列表
-
嵌套写法
嵌套写法: 标签1.标签2.标签3… -> 获取标签1中第一个标签2中的第一个标签3…
soup.select('div.p')
-
按照指定属性值查找标签
# 获取href属性值是'https://www.jd.com'的标签 result = soup.find_all(attrs={'href':'https://www.jd.com'})
4.获取标签内容和属性值
- 标签.string - 获取双标签的文字内容(注意:被获取的标签中不能有子标签。否则结果是None) - 字符串
- 标签.contents - 获取双标签的内容(包括文字内容和子标签) - 列表
- 标签.get.text() - 获取双标签的内容(包括本身文字内容和子标签的文字内容 - 字符串
- 标签.attrs[‘属性名’] - 获取指定标签的指定属性的内容
五、PyQuery解析
1.创建PyQuery解析对象
html = PyQuery(content)
2.获取标签
按照css选择器获取指定标签
3.获取标签的内容和属性值
PyQuery对象.text() - 获取双标签文本内容(获取不到子标签)
ps = html('p')
for x in ps:
print('x:', type(x),PyQuery(x).text()) # 转换成PyQuery类型
PyQuery对象.val() - 获取标签的value属性值
PyQuery对象.attr(属性名) - 获取标签的指定属性值
六、xPth解析
from lxml import etree
xPath主要针对html文件和xml文件,解析原理:通过高速解析器需要标签在页面中的路径来获取对应的标签
1.创建解析器对象
html = etree.HTML(content)
2.获取指定标签
-
节点对象.xpath - 返回列表
result1 = html.xpath('body') result2 = html.xpath('body/div') result3 = result2[0].xpath('img')
-
写相对路径
result3 = result2[0].xpath('./img')
-
写绝对路径(从根节点开始写,跟xpath前面是谁无关)
result7 = div.xpath('/html/body/div/img')
-
从任意位置开始
//img - 获取整个页面中所有的img节点
//div/img - 获取整个页面是di子节点的img
-
当前节点的上层节点
result10 = div.xpath('../ol')
4.获取属性值和标签值
//img/@src - 获取整个页面中所有图片标签的src属性值
/text() - 获取标签的文本内容
5.xpath的谓词
xpath的谓词可以理解成筛选条件,写的时候必须写在[]
-
位置
# [N] - 获取第N个(同层的第N个) result = html.xpath('//div[1]')
-
属性
# [@属性名] - 筛选出包含指定属性的标签 # p[@id] - 获取设置了id属性的p标签 result = html.xpath('//p[@id]/text()') # [@属性= 值] # p[@id="p1"] 获取id是p1的p标签 result = html.xpath('//p[@id="p1"]/text()')
-
标签内容
//div/[p="我是段落1"] - 获取子标签中p标签内容是"我是段落1"的div标签
-
通配符
用*表示所有
result = html.xpath('//div[@id="div1"]/*') # 所有id为div1的所有子标签
-
同时选取多个路径
路径1|路径2|路径3········
result = html.xpath('//div[@id = "div1"]/p/text()|//div[@id = "div1"]/a/text()')
七、文件操作excel
import openpyxl /(xlrd / xlwt 老版本的excel表)
写
1.加载excel文件
work_book = openpyxl.load.workbook(文件目录)
2.获取表相关数据
-
获取表名
names = work_book.sheetnames
-
获取表对象
1)根据表名获取工作表对象
sheet1 = work_book[表名]
2)获取活动表
sheet2 = work_book.active
3)获取所有表 ---- 得到一个列表
all_sheet = work_book.worksheets
sheet3 = all_sheet[-1]
-
获取表的相关信息
1)表对象.title
sheet2.title
2)获取最大的行数和最大的列数
max_row = sheet1.max_row max_column = sheet1.max_column
3.获取单元格 - 获取的是单元格对象
- 获取一个单元
1)获取一个单元格
表对象[‘标号’] - 标号格式:’字母列数数字行数‘
cell = sheet1['A1']
2)表对象.cell(行号,列号) - 行号列号都是从1开始
cell = sheet1.cell(1,1)
-
获取部分单元格
1)一行一行的取
cells1 = sheet1.iter_rows() print(list(cells1)) cells2 = sheet1.iter_rows(min_row=4,max_row=9,min_col=1,max_col=2) print(list(cells2))
2)一列一列得取
cells3 = sheet1.iter_cols() print(list(cells3))
3)切片取
# 表格对象[左上角标号:右下角标号] cells5 = sheet1['b3':'c9'] print(list(cells5))
4.获取单元格内容
单元格对象.value
5.获取单元格信息
print(cell1.row) # 1 print(cell1.column) # 1 print(cell1.coordinate) # A1
读
1.新建/保存excel文件
# 创建工作对象 new_wb = openpyxl.Workbook() #保存文件:工作薄对象.save(路径) new_wb.save('file/new_ex.xlsx')
2.创建和删除、修改表
# 新建表:工作簿对象.create_sheet() new_sheet1 = wb.create_sheet() new_sheet2 = wb.create_sheet('房屋信息',1) new_sheet3 = wb.create_sheet('商品信息',0) # 删除表:工作簿对象.remove(表对象) wb.remove(wb['Sheet']) # 修改表名 wb['Sheet1'].title = '资讯'
3.操作单元格
-
操作单元格
修改单元格内容:表对象[‘标号’] = 值
sheet1['A1'] = '名称'
修改单元格内容:单元格对象.value = 值
sheet1.cell(1,3).value = '数量'
-
删除
wb.active.delete_cols(开始列号,数量) wb.active.delete_rows(开始行号,数量)
-