Python爬取淘宝商品失败---解决:淘宝的反爬虫机制!

淘宝商品比价定向爬虫

功能描述

  • 目标:获取淘宝搜索页面的信息,提取其中的商品名称和价格
  • 理解:淘宝的搜索接口以及翻页的处理

程序的结构设计

  1. 提交商品搜索请求,循环获取页面
  2. 对于每个页面,提取商品名称和价格信息
  3. 将信息输出

遇到问题

爬取成功,数据有问题

打印 html 文件,返回如下

觉得应该是用户并未登陆问题,应该是淘宝的反爬虫机制导致。


处理方法

  1. 登陆淘宝,打开开发者模式,例如 Chrome 右键检查
  2. 点选 NetWork,DOC,然后刷新页面,在 network 中选择 doc,在请求的 headers 中搜索 cookie
  3. 获取对应的 cookie 以及 user-agent
  4. 在代码中添加到 headers 里面

Python爬取淘宝商品失败---解决:淘宝的反爬虫机制!_第1张图片

def getHTMLText(url):
  kv = {
    'cookie': 'adsgadfafegadsgadsfaefasdfaewfadsfag'
    'uaer-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
  }
    try:
    r = requests.get(url, headers=kv, timeout=30)
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    return r.text
  except:
    return "gg"

补充问题

还遇到了一种问题,就是在 url 为 http 时,即使添加了 cookie 和 user-agent 也无法获取信息。

猜测是因为重定向导致的问题。

首先简单介绍一下 requests 库的一个高级用法 Session 会话对象

会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie。所以如果你向同一主机发送多个请求,底层的 TCP 连接将会被重用,从而带来显著的性能提升。(参见 HTTP persistent connection).

这个问题经过观察发现,重定向之后 cookie 信息并没有被保存下来(返回的 html 还是让用户登陆),我们就需要用使用 Session 保存 cookie 信息。使用 Session 后,更新 cookie 并没有成功。

然后将矛头转向 cookie 去哪里了,发现问题是因为 requests 的 session 方法保持 cookie 只能保持 cookiejar 类型的 cookie,而我们手动构建的 cookie 是 dict 类型的,所以需要将 dict 转化为 cookiejar 类型。

查阅得方法如下:

#将CookieJar转为字典:
cookies = requests.utils.dict_from_cookiejar(r.cookies)

#将字典转为CookieJar:
cookies = requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True)

#其中cookie_dict是要转换字典
转换完之后就可以把它赋给cookies 并传入到session中了:
s = requests.Session()
s.cookies = cookies

具体代码很简单,如下:

cookie_dict = {'cookie': 'adgfadsgadsgasf'}
cookies = requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True)
S = requests.Session()
S.cookies = cookies;
try:
    r = S.get(url, headers=headers, timeout=30)

 

你可能感兴趣的:(Python,python)