爬虫(2)

一、在Python爬虫中,POST和GET是两种常用的HTTP请求方法,它们之间有一些关键的区别。

1.传递参数的方式:

  • GET请求: 参数是通过URL直接附加在请求的末尾(例如,http://example.com/resource param1=value1&param2=value2)。这意味着参数信息会暴露在URL中,适用于一些简单的数据传递。由于参数在URL上,数据传递大小受到浏览器和服务器的限制,数据通常较小.
  • POST请求: 参数是通过请求的主体传递的,而不是附加在URL上。这使得POST请求更适合传递敏感信息或大量数据,同时不会将信息暴露在URL中。                         

2.安全性:

  • GET请求: 参数可见于URL,不适合传递敏感信息,因为它们可能被浏览器历史记录、服务器日志等记录。
  • POST请求: 数据传递在请求主体中,对于敏感信息更安全,不会暴露在URL中。             
  • 缓存:
  • GET请求: 可以被浏览器缓存,可能被存储在浏览器历史记录中。
  • POST请求: 由于传递的数据通常不可缓存,通常不会被浏览器缓存。
  • 用途:
  • GET请求: 用于获取资源,请求服务器返回特定资源。
  • POST请求: 用于提交数据,向服务器提交要处理的数据,例如表单提交。
from urllib.request import Request,urlopen
from urllib.parse import urlencode,quote
get方法
url=f'https://www.baidu.com/s?wd={quote=(python爬虫)}'#quote
parms={'wd':args}#urlencode
url=f'https://www.baidu.com/s?{urlencode(parms)}'#urlencode
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 SLBrowser/9.0.0.10191 SLBChan/128"
headers ={"user-agent":user_agent}
request=Request(url,headers=headers)
response=urlopen(request)
print(response.read().decode()[:2000])
post方法
url="https://www.kuaidaili.com/login/"

data={
    'username': '用户账号',
    'password': '密码',
    'login_type': '1',
}
tru_data=urlencode(data).encode()
hearders={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 SLBrowser/9.0.0.10191 SLBChan/128'}
req=Request(url,data=tru_data,headers=hearders)
response=urlopen(req)
print(response.read().decode())

二、动态获取数据

  • 处理动态数据的方法:

  1. 使用Selenium: Selenium是一个自动化测试工具,但也可以用于模拟用户在浏览器中的操作。通过Selenium,您可以控制浏览器加载页面并执行JavaScript,然后提取动态生成的内容。
  2. 使用Headless浏览器: Headless浏览器是没有图形用户界面的浏览器,可以在后台运行。它们可以像普通浏览器一样加载和执行JavaScript。Puppeteer是一个Node.js库,可以用于控制Headless Chrome或 Chromium。
  3. 分析XHR请求: 使用浏览器开发者工具(DevTools)来监视网络请求。有时,网页通过XHR(XMLHttpRequest)请求获取数据。您可以模拟这些请求来获取动态数据。
  4. API调用: 查看网页是否有提供API,以JSON或其他格式返回数据。有时,网页的动态数据是通过API调用获取的,而不是通过页面渲染。请注意,爬取网站数据时,要遵守网站的使用条款和条件,并确保不违反法律。爬虫可能受到网站的限制,因此请谨慎使用,并查看网站的robots.txt文件,以确保您的爬虫活动是允许的。

三、请求 SSL证书验证

如果SSL证书验证不通过,或者操作系统不信任服务器的安全证书,可以通过SSL库忽略SSL认证

import ssl

# 忽略SSL安全认证
context = ssl._create_unverified_context()
# 添加到context参数里
response = urlopen(request, context = context)

四、伪装请求头

伪装请求头是通过在HTTP请求中设置特定的头部信息,模拟正常浏览器行为,以防止被网站识别为爬虫。

使用随机User-Agent:

有时,网站会检查User-Agent字段,因此使用随机的User-Agent可能会更有用。可以使用fake_useragent库来生成随机User-Agent

from urllib.request import urlopen
from urllib.request import Request
from fake_useragent import UserAgent

ua = UserAgent()

url = 'http://httpbin.org/get'

headers = {
  'User-Agent':ua.chrome
}
req = Request(url,headers=headers)
resp = urlopen(req)
print(resp.read().decode())

注意

fake-useragent在创建对象时,可能创建不了,多部分原因为服务器访问不到的原因

解决方案

拷贝fake-useragent_version.json 的配置文件到用户目C:\Users\Feel\AppData\Local\Temp

使用requests库实现:

headers字典包含了一些常见的请求头字段,例如User-Agent(用户代理,模拟浏览器)、Referer(引荐页面地址)、Accept-Language(接受的语言类型)、Connection(连接状态)。这些字段可以根据需要进行调整,以使请求头看起来更像正常的浏览器请求。

import requests

url = 'https://example.com'

# 伪装请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Referer': 'https://www.google.com',
    'Accept-Language': 'en-US,en;q=0.9',
    'Connection': 'keep-alive',
}

# 发送带有伪装请求头的GET请求
response = requests.get(url, headers=headers)

print(response.text)

使用Session保持状态:

使用requests.Session可以保持在多个请求之间的状态,包括伪装的请求头。这对于需要多步骤操作或需要保持登录状态的爬虫很有用

import requests

url = 'https://example.com'

# 创建Session对象
session = requests.Session()

# 伪装请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}

# 使用Session发送带有伪装请求头的GET请求
response = session.get(url, headers=headers)

print(response.text)

五、urllib的底层原理之urlopen与opener

  • urllib 中,urlopen 是一个简单的函数,用于打开一个 URL 并返回一个类文件对象,你可以使用它来读取 URL 返回的内容。相比之下,Opener 是一个更高级的对象,它允许你在发起请求时添加自定义的处理器,例如添加 headers、处理 cookies 等。
  • 使用 Opener 的优势在于你可以在 Opener 中添加多个处理器,以实现更灵活的请求处理,例如处理 cookies、重定向等。urlopen 是一个简化的接口,对于简单的请求可能足够,但如果你需要更多的控制和定制化,那么使用 Opener 是更好的选择。
    from urllib.request import Request,build_opener
    from fake_useragent import UserAgent
    from urllib.request import HTTPHandler
    url='http://httpbin.org/get'
    headers={'User-Agent': UserAgent().chrome}
    req=Request(url, headers=headers)
    handler=HTTPHandler(debuglevel=1)
    opener=build_opener(handler)
    response=opener.open(req)
    print(response.read().decode())

  • 36
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值