网页爬虫知识点总结

364次阅读
没有评论
网页爬虫知识点总结

网页爬虫知识点总结

1.什么是爬虫?

爬虫就是:模拟浏览器发送请求,获取响应

2.爬虫的分类,爬虫的流程

  • 聚焦爬虫:针对特定的网站的爬虫
    • 准备url地址 –>发送请求 获取响应–> 提取数据–> 保存
    • 获取响应–> 提取url地址,继续请求
  • 通用爬虫:搜索引擎的爬虫
    • 抓取网页–> 数据存储–>预处理–> 提供检索服务,网站排名

3.浏览器发送请求的过程

  • 爬虫请求的:url地址对应的响应
  • 浏览器获取到的内容:elements的内容=url对应的响应+js+css+图片
  • 爬虫获取的内容和elements内容不一样,进行数据提取的时候,需要根据url地址对应的响应为准进行数据的提取

4.http的请求头user-agent有什么用

  • user-agent:告诉对方服务器是什么客户端正在请求资源,爬虫中模拟浏览器非常重要的一个手段
  • 爬虫中通过把user-agent设置为浏览器的user-agent,能够达到模拟浏览器的效果
  • cookie:获取登录只有才能够访问的资源

5.利用requests模板如何发送请求和获取响应

  • response = requests.get(url)
  • response.text -> str # 根据响应信息进行有规律的推测网页的编码
    • response.encoding=“utf-8”
    • response.encoding=”gbk”
  • response.content -> bytes
    • response.content.decode(“utf8”)
      # 发送请求,获取响应
      def parse(self, url, data):
      response = requests.get(url,params=params,headers=self.headers)
      response = requests.post(url,data=data, headers=self.headers)
      return response.content.decode()
  • response.status_code
  • response.request.headers
  • response.headers
  • 一般来说名词,往往都是对象的属性,对应的动词是对象的方法
  • 获取网页源码的通用方式:
  • response.content.decode() 的方式获取响应的html页面
  • response.content.decode(“GBK”)
  • response.text

6.常见的状态响应码

  • 200:成功
  • 302:临时转移至新的url
  • 307:临时转移至新的url
  • 404:not found
  • 500:服务器内部错误

二、

1.requests中headers如何使用,如何发送带headers的请求

  • 模拟浏览器,欺骗服务器,获取和浏览器一致的内容
  • headers = {“User-Agent”:“从浏览器中复制”}
  • headers = {
    “Origin”: “http://ntlias-stu.boxuegu.com”,
    “Referer”: “http://ntlias-stu.boxuegu.com/”,
    “User-Agent”: “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.17 Safari/537.36”
    }
  • requests.get(url,headers=headers)

2.发送带参数的请求

params = {"":""}
url_temp = “不完整的URL地址”
requests.get(url_temp,params=params)

3.requests如何发送post请求

data = {“从浏览器中form data的位置寻找”}
requests.post(url,data=data)

4.requests中如何使用代理,使用代理的目的,代理的分类

  • proxies = {“https”: “https://117.127.0.195:8080”}

  • proxies = {协议:协议+ip+端口}

  • requests.get(url,proxies=proxies)

    目的:

    • 反反爬
    • 隐藏真实ip

代理的分类

  • 高匿名代理:不知道在使用代理
  • 匿名代理:知道在使用代理,但是不知道真实ip
  • 透明代理(Transparent Proxy):对方知道真实的ip

5.requests中session类如何使用,为什么要使用session

  • session = requests.Session()
  • session.post(url,data) #cookie会保存在session中
  • session.get(url) #用session发送请求会带上之前的cookie
  • 注意:这块的session类和之前所学的session无任何关系

三、

1.requests进行携带cookie登录

  • cookie字符串放在headers中
  • 把cookie字典交给requests请求方法的cookies

2.寻找登录接口的方法

  • form表单action对应的url地址
    • 用户名和密码的input标签中,name的值作为键,用户名和密码作为值的字典,作为post data
  • 通过抓包,定位url地址
    • form data

3.分析js,获取加密的数据

  • 观察变化
  • 定位js
    • 通过event listener定位js的位置
    • 通过搜索url地址中的关键字,通过chrome的search all file来进行搜索
  • 进行分析
    • 通过添加断点的方式分析js
  • 执行js
    • 完全的使用python模拟js的执行过程

4.requests处理ssl证书

requests.get(url,verify=False)

5.获取响应中的cookie,转化为字典

response = requests.get(url,headers=headers) requests.utils.dict_from_cookiejar(response.cookies)

5.数据的分类

  • 结构化数据 json, xml
    • 直接使用模块转化为python类型
  • 非结构化数据 html
    • re,xpath

8.json模块的使用

  • 数据交换格式
  • json.loads(json_str) json字符串转化为python类型
  • json.dumps(python_type,ensure_ascii=False,indent=2) python类型转化为json字符串
  • json.load() 把包含json的类文件对象中的数据提取出来转化为python类型
  • json.dump() python类型存入类文件对象中
  • 那么对于为什么需要模拟登陆?
    获取cookie,能够爬取登陆后的页面

9.requests模拟登陆的三种方法

  • session
    • 实例化对象
    • session.get(url) #cookie保存在session中
    • session.get(url) #带上保存在session中cookie
  • cookie方法headers中
  • cookie传递给cookies参数
    • cookie = {“cookie 的name的值”:“cookie 的value对应的值”}

10.三元运算符

a = 10 if 3<2 else 100

11.字典推导式

{i:i+10 for i in range(10)} {0: 10, 1: 11, 2: 12, 3: 13, 4: 14, 5: 15, 6: 16, 7: 17, 8: 18, 9: 19}

{i:i+10 for i in range(10) if i%2==0} {0: 10, 2: 12, 4: 14, 6: 16, 8: 18} 12345

四、

1.正则的语法

  • 字符
    • . 能够匹配n之外的所有字符 re.S模式下可以匹配n
    • 转义
    • [] 或的效果,从中选择一个, [abc]+ 能够匹配多个
    • | 或的效果
  • 预定义的字符集
    • d 数字
    • s 空白字符串,包含空格、n,t
    • w 单词字符,a-zA-Z0-9_
  • 数量词
      • 匹配0次或者多次
      • 能够匹配1次或者多次
    • ? 能够匹配0-1次,让*,+非贪婪

2.re模块的常用方法

  • re.findall(“正则表达式regex”,“待匹配的字符串”) # 返回列表,或者是空列表
  • re.sub(“regex”,"_",“待替换的字符串”) # 返回字符串
  • p = re.compile(“regex”,re.S/re.DOTALL) # 返回一个p模型,编译,提高匹配效率
    • p.findall(“待匹配的字符串”)
    • p.sub("_",“待替换的字符串”)

注:re.S 匹配n re.DOTALL 匹配Tab键

3.原始字符串r

  • 定义:相对于特殊符号而言,表示特殊符号的字面意思
  • 用途:
    • 正则中,能够忽略转义符号带来的影响,待匹配的字符串中有几个,正则表达式中加上r,照着几个即可
    • windows文件路径

4.xpath语法

  • xpath的安装 pip install lxml
  • // 的用途
    • //a html中所有的a
    • div//a div中所有的a,包括div下的后代节点中的a
    • a//text() a下的所有的文本
  • @ 的使用
    • a/@href 获取a的href的值
    • //a[@class=‘b’]
  • text() 的使用
    • //a/text() 获取所有的a下的文本
    • //a[text()=‘下一页’] 获取文本为下一页的a标签
    • a//text() a下的所有的文本
  • xpath包含的语法
    • //div[contains(@class,“i”)] class包含i的div标签
    • //a[contains(text(),“下一页”)] 文本包含下一页的a标签
  • 兄弟标签
    • /a/follow-sibling::ul[1]
  • xpath 选择特定位置
    • //a[1] 第一个
    • //a[last()] 最后一个
    • //a[last()-1] 倒数第二个
    • //a[postion()<4] 前三个

5.lxml模块的使用

from lxml import etree element = etree.HTML(bytes/str) #返回element ret_list = element.xpath("xpath字符串") #返回列表 bytes = etree.tostring(element) #返回bytes类型字符串 #数据提取时:先分组,再提取 12345

五、

1.xpath包含的语法

//div[contains(@class,“i”)] class包含i的div标签
//a[contains(text(),“下一页”)] 文本包含下一页的a标签

2.url地址解码的方法

  • requests.utils.unquote(url)

3.准备url地址

  • 知道url地址的规律,知道一共多少页,准备url列表,果壳,糗百
  • 不知道url地址规律,或者不知道一共多少页,准备start_url ,贴吧

4.多线程爬虫

  • threading
    • t1 = threading.Thread(targe=func,args=(,))
    • t1.setDaemon(True) #设置为守护线程
    • t1.start() #此时线程才会启动
  • 队列
    • from queue import Queue
    • q = Queue()
    • q.put() 队列计数+1
    • q.get() 队列计数不会-1
    • q.task_done() 和get()方法配合,队列计数-1
    • q.join() #阻塞主线程,让主线程等待队列任务结束之后在结束,队列任务在计数为0时技术

5.多进程爬虫

  • multiprocessing
    • p = multiprocessing.Process(trage=func,args=(,))
    • p.daemon = True #设置为守护进程,主线程结束,子进程结束
    • p.start()
  • from multiprocessing import JoinableQueue
    • q = JoinableQueue()
    • q.join() # 让主进程阻塞,等待队列任务计数,计数为0队列任务结束,
    • q.put() # 计数+1
    • q.get() # 计数不会-1
    • q.task_done() # get和task_done一起使用才会减一
神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试

相关文章:

版权声明:Python教程2022-10-24发表,共计4732字。
新手QQ群:570568346,欢迎进群讨论 Python51学习