爬虫

解决中文显示编码值的问题: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(开始行号,数量)
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值