我们知道, 有的网页必须要登录才能访问其内容. scrapy 登录的实现一般就三种方式.
1. 在第一次请求中直接携带用户名和密码.
2. 必须要访问一次目标地址, 服务器返回一些参数, 例如验证码, 一些特定的加密字符串等, 自己通过相应手段分析与提取, 第二次请求时带上这些参数即可. 可以参考 https://www.cnblogs.com/bertwu/p/13210539.html
3. 不必花里胡哨, 直接手动登录成功, 然后提取出 cookie, 加入到访问头中即可.
本文以第三种为例, 实现 scrapy 携带 cookie 访问购物车.
1. 先手动登录自己的淘宝账号, 从中提取出 cookie, 如下图中所示.
2.cmd 中 workon 自己的虚拟环境, 创建项目 (scrapy startproject taobao)
3.pycharm 打开项目目录 , 在 terminal 中输入 (scrapy genspider itaobao taobao.com), 得到如下的目录结构
4.setting 中设置相应配置
5. 在 itaobao 中写业务代码. 我们先不加人 cookie 直接访问购物车, 代码如下:
- import scrapy
- class ItaobaoSpider(scrapy.Spider):
- name = 'itaobao'
- allowed_domains = ['taobao.com']
- start_urls = [
- 'https://cart.taobao.com/cart.htm?spm=a1z02.1.a2109.d1000367.OOeipq&nekot=1470211439694'] # 第一次就直接访问购物车
- def parse(self, response):
- print(response.text)
响应回来信息如下
明显是跳转到登录页面的意思.
6. 言归正传, 正确的代码如下, 需要重写 start_requests() 方法, 此方法可以返回一个请求给爬虫的起始网站, 这个返回的请求相当于 start_urls,start_requests() 返回的请求会替代 start_urls 里的请求.
- import scrapy
- class ItaobaoSpider(scrapy.Spider):
- name = 'itaobao'
- allowed_domains = ['taobao.com']
- # start_urls = ['https://cart.taobao.com/cart.htm?spm=a1z02.1.a2109.d1000367.OOeipq&nekot=1470211439694']
- # 需要重写 start_requests 方法
- def start_requests(self):
- url = "https://cart.taobao.com/cart.htm?spm=a1z02.1.a2109.d1000367.OOeipq&nekot=1470211439694"
- # 此处的 cookie 为手动登录后从浏览器粘贴下来的值
- cookie = "thw=cn; cookie2=16b0fe13709f2a71dc06ab1f15dcc97b; _tb_token_=fe3431e5fe755;" \
- "_samesite_flag_=true; ubn=p; ucn=center; t=538b39347231f03177d588275aba0e2f;" \
- "tk_trace=oTRxOWSBNwn9dPyorMJE/oPdY8zfvmw/q5hoqmmiKd74AJ+t/NCZ%" \
- "2FSIX9GYWSRq4bvicaWHhDMtcR6rWsf0P6XW5ZT/gUec9VF0Ei7JzUpsghuwA4cBMNO9EHkGK53r%" \
- "2Bb+iCEx98Frg5tzE52811c+nDmTNlzc2ZBkbOpdYbzZUDLaBYyN9rEdp9BVnFGP1qVAAtbsnj35zfBVfe09E%" \
- "2BvRfUU823q7j4IVyan1lagxILINo//ZK6omHvvHqA4cu2IaVAhy5MzzodyJhmXmOpBiz9Pg==;" \
- "cna=5c3zFvLEEkkCAW8SYSQ2GkGo; sgcookie=E3EkJ6LRpL/FRZIBoXfnf; unb=578051633;" \
- "uc3=id2=Vvl/7ZJ+JYNu&nk2=r7kpR6Vbl9KdZe14&lg2=URm48syIIVrSKA==&vt3=F8dBxGJsy36E3EwQ+uQ=;" \
- "csg=c99a3c3d; lgc=天仙草天仙草; cookie17=Vvl/7ZJ+JYNu;" \
- "dnk=天仙草天仙草; skt=4257a8fa00b349a7; existShop=MTU5MzQ0MDI0MQ==;" \
- "uc4=nk4=0@rVtT67i5o9+t+QFc65xFQrUP0rGVA/s=&id4=0@VH93OXG6vzHVZgTpjCrALOFhU4I=;" \
- "tracknick=天仙草天仙草; _cc_=W5iHLLyFfA==;" \
- "_l_g_=Ug==; sg=草3d; _nk_=天仙草天仙草;" \
- "cookie1=VAmiexC8JqC30wy9Q29G2/MPHkz4fpVNRQwNz77cpe8=; tfstk=cddPBI0-Kbhyfq5IB_1FRmwX4zaRClfA" \
- "_qSREdGTI7eLP5PGXU5c-kQm2zd2HGhcE; mt=ci=8_1; v=0; uc1=cookie21=VFC/uZ9ainBZ&cookie15=VFC/uZ9ayeYq2g==&cookie" \
- "16=WqG3DMC9UpAPBHGz5QBErFxlCA==&existShop=false&pas=0&cookie14=UoTV75eLMpKbpQ==&cart_m=0;" \
- "_m_h5_tk=cbe3780ec220a82fe10e066b8184d23f_1593451560729; _m_h5_tk_enc=c332ce89f09d49c68e13db9d906c8fa3;" \
- "l=eBxAcQbPQHureJEzBO5aourza7796IRb8sPzaNbMiInca6MC1hQ0PNQD5j-MRdtjgtChRe-PWBuvjdeBWN4dbNRMPhXJ_n0xnxvO.;" \
- "isg=BJ2drKVLn8Ww-Ht9N195VKUWrHmXutEMHpgqKF9iKfRAFrxIJAhD3DbMRAoQ1unE"
- cookies = {}
- # 提取键值对 请求头中携带 cookie 必须是一个字典, 所以要把原生的 cookie 字符串转换成 cookie 字典
- for cookie in cookie.split(';'):
- key, value = cookie.split("=", 1)
- cookies[key] = value
- yield scrapy.Request(url=url, cookies=cookies, callback=self.parse)
- def parse(self, response):
- print(response.text)
响应信息如下 (部分片段):
很明显这是自己购物车的真实源代码.
好了, 大功告成啦, 接下来就可以按照业务需求用 xpath(自己喜欢用这种方式) 提取自己想要的信息了.
来源: https://www.cnblogs.com/bertwu/p/13210878.html