爬虫总结备份

爬虫要根据当前url地址对应的响应为准,当前url地址的elements的内容和url的响应不一样

页面上的数据在哪里

  • 当前url地址对应的响应中
  • 其他的url地址对应的响应中
    • 比如ajax请求中
  • js生成的
    • 部分数据在响应中
    • 全部通过js生产

requsets中解决编解码的方法

  • response.content.decode()
  • response.content.decode(“gbk”)
  • response.text

requests.text 和requests.content的区别

  • 使用request.text时候,需要制定解码方式,response.encoding=“utf8”,否则中文乱码。
  • 使用requests.content时候,只需用requests.content.decode()一句话就可以了。

使用代理ip

  • 准备一堆的ip地址,组成ip池,随机选择一个ip来使用

  • 如何随机选择代理ip

    • {“ip”:ip,“time”:0}
    • [{},{},{},{},{}],对这个ip列表进行排序,按照使用次数进行排序
    • 选择使用次数较少的10个ip,从中随机选择一个。
  • 检测ip的可用性

    • 可以使用requests添加超时参数,判断ip地址的质量
    • 在线代理ip检测网站

requests小技巧

  • requests.util.dict_from_cookiejar 把cookie对象转化为字典

urllib

  • 下载图片文件
  • urllib.requests.urlretrieve(img,‘路径’)

lxml库

  • 导入lxml的etree库

    • from lxml import etree
  • 利用etree.HTML,将字符串转化为element对象

  • element对象具有xpath的方法

    • html = etree.HTML(text)

xpath 学习重点

  • 获取文本
    • a/text()
  • @符号
    • a/@herf
    • //ul[@id=""]
  • //
    • 在xpath开始的时候表示从当前html中任意位置开始选择
    • li//a 表示的示li下任何一个标签

xpath 的包含

  • //div[contains(@class,‘i’)]

BeautifulSoup

  • find_all的使用
    “”“python
    a = soup.find_all(‘a’)#查询所有的a标签
    “””
  • select
    • 通过标签名查找
    • 通过类名选择,在类的前面加一个点
    • 通过id名字选择 id前加#
    • 查找子孙元素 那么要在子孙元素中间有一个空格
    • 查找直接子元素,那么在父子元素中间有一个>
    • 跟据属性名字进行查找
      “”“python
      input[name=‘username’]
      “””

re

match

  • 从头开始匹配

匹配单个字符

  • "."匹配任意字符(换行符除外)
  • "\d"匹配数字(0-9)
  • "\D"匹配非数字
  • "\s"匹配空白字符(\n \r \t 空格)
  • "\w"匹配的是a-z,A-Z,数字和下划线
  • “\W"匹配与”\w"相反
  • “[]“组合的方式,只要满足中括号中的某一项都算匹配成功。
    “”“python
    text = “120-12455515”
    ret = re.match(”[\d-]”,text)
    ret.group() 1
    “””
  • “[]“中括号的形式代替”\d” [0-9]
  • “[]“中括号的形式代理”\D” 中括号(^0-9)
  • “[]“中括号的形式代替”\w” [a-zA-Z0-9_]

匹配多个字符

  • "*"匹配0或者任意多个字符
  • "+"匹配1个或者多个字符
  • "?"匹配0个或者1个字符
  • {m}匹配m个字符
  • {m,n}匹配m-n个字符

group

  • group()函数取所有“()用于分组”
  • group(1)取第一个分组

groups

  • 取所有的子分组

sub

  • 替换匹配的字符串

search

  • 返回第一个匹配的字符串

split

  • 分割

findall

  • 返回所有的符合规则的 以列表返回

re.S和re.DOTALL

  • 可以让“.”匹配到"\n"

JSON学习(本质就是一个字符串)

json支持数据格式

  • 对象(字典),使用花括号
  • 数组(列表),使用方括号
  • 整形、浮点型、布尔类型还有null类型
  • 字符串类型(字符串必须要用双引号,不能用单引号)

csv的读取和写入

  • 读取
  • 写入
    • 第一种方法
      “”“python
      import csv
      headers = [‘name’,‘age’,‘height’]
      values = [
      (‘张三’,18,160),
      (‘李四’,19,180),
      (‘王五’,20,170)
      ]
      with open(‘classroom.csv’,‘w’,encoding=‘utf-8’,newline=’’) as f:
      writer = csv.writer(f)
      writer.writerow(headers)
      writer.writerows(values)
      “””
    • 第二种方法
      “”“python
      headers = [‘name’,‘age’,‘height’]
      values = [
      {‘name’:‘张三’,‘age’:18,‘height’:160},
      {‘name’:‘李四’,‘age’:19,‘height’:180},
      {‘name’:‘王五’,‘age’:20,‘height’:170}
      ]
      with open(‘classroom.csv’,‘w’,encoding=‘utf-8’,newline=’’) as f:
      writer = csv.Dictwriter(f,headers)
      writer.writeheader()
      writer.writerows(values)
      “””
      queue
    • q.put(block=False)默认是阻塞状态 如果put时队列满了一直阻塞到放进去为止。
    • q.get(block=False)

实现爬虫的套路

  • 准备url
    • 准备start_url
      • url地址规律不明显,总数不确定
      • 通过代码提取下一页的url
        • xpath
        • 寻找url地址,部分参数在当前的响应中(比如当前页码数和总的页码数)
    • 准备url-list
      • 页码总数明确
      • url地址规律明显
  • 发送请求,获取响应
    • 添加随机的user-agent,反反爬虫
    • 添加随机的代理ip,反反爬虫
    • 在对方判断出我们是爬虫之后,应该添加更多的headers字段,包括cookie

后续爬虫代码的建议

  • 尽量减少请求次数
    • 能抓取列表页就不抓详情页
    • 保存获取到的html页面,供查错和重复请求使用
  • 关注网站的所有类型的页面
    • wap页面,触屏版页面
    • H5页面
    • APP
  • 多伪装
    • 动态的UA
    • 代理ip
    • 不使用cookie
  • 利用多线程分布式
    • 在不被ban的请求下尽可能的提高速度

selenium使用的注意点

  • 获取文本和获取属性

    • 先定位到元素,然后调用.text或者get_attribute方法来取。
  • selenium获取的页面数据是浏览器中elements的内容。

  • pass

  • 如果页面中含有iframe。frame,需要先调用driver.switch_to.frame的方法或者switch_to_frame切换到frame中才能定位元素。
    selenium常用操作

  • driver = webdriver.Chrom(executable_path=‘chromedriver路径’)

  • 获取页面原码 driver.page_source

  • 关闭当前页面:driver.close()

  • 退出浏览器:driver.quit()

  • 定位元素(element查找第一个,elements查找所有)

    • 根据id来查找元素:find_element_by_id
    • 根据类名查找元素:find_element_by_class_name
    • 根据name属性的值来查找元素:find_element_by_name
    • 根据标签名来查找元素:fing_element_by_tag_name
    • 根据xpath语法获取元素find_element_by_xpath
    • 根据css选择器选择元素:find_element_by_css_selector/find_element(BY.CSS_SELECTOR,“规则”)
  • 常见的表单操作

    • input标签
      • 输入字符串:send_keys(‘python’)
      • 清除 :clear()
    • checkbok标签
      • 选中/取消选中:click()
    • select 标签
      • select_by_index(0)
      • select_by_value(“sdfsfaf”)
      • select_by_visible_text(“sfaksfla”)
      • 取消说有选中:deselect_all()
  • 行为链(鼠标的一些操作)

    • from selenium.webdriver.common.action_chains import ActionCharins
  • Cookie操作

    • 获取所有的cookie:driver.get_cookies() 得到一个列表for循环取值
    • 根据cookie的key:driver.get_cookie(“key”)
    • 根据key删除cookie:driver.delete_cookie(“key”)
    • 删除所有cookie:driver.delete_all_cookies()
  • 隐式等待和显示等待

  • 打开多窗口

    • driver.execute_script(“window.open(‘http://www.’)”)
  • 切换窗口

    • driver.switch_to_window(driver.window_handles[1])
  • 设置代理ip
    “”“python
    options = webdriver.ChromeOptions()
    options.add_argument(”–proxy-server=http://120.121.12:9999")
    driver = webdriver.Chrome(executable_path=‘路径’,chrome_options=options)
    “”"

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值