文章参考千锋教育大佬的课程:
https://www.bilibili.com/video/BV1QY411F7Vt?p=1&vd_source=5f425e0074a7f92921f53ab87712357b
,多谢大佬的课程

一、 用Selenium操作谷歌浏览器,登录TB账号获取Cookie

  因为TB网的搜索功能需要登录之后才能使用,所以我们要通过程序去控制浏览器实现登录功能,然后再获取登录之后的Cookie.
  首先创建一个Chrome浏览器对象,用这个对象去操控谷歌浏览器:

import json
from selenium import webdriverdef create_chrome_driver(*, headless=False):  # 创建谷歌浏览器对象,用selenium控制浏览器访问urloptions = webdriver.ChromeOptions()if headless:  # 如果为True,则爬取时不显示浏览器窗口options.add_argument('--headless')# 做一些控制上的优化options.add_experimental_option('excludeSwitches', ['enable-automation'])options.add_experimental_option('useAutomationExtension', False)# 创建浏览器对象browser = webdriver.Chrome(options=options,executable_path=r"D:\python爬虫学习\Scrapy框架学习\TaoSpider\venv\Lib\site-packages\chromedriver.exe")# 破解反爬措施browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',{'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'})return browser

  接着就可以通过这个对象去操作浏览器登录TB网,并且把Cookie存进taobao2.json文件中:

# 模拟登录
import json
import timefrom selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
from utils import create_chrome_driverbrowser = create_chrome_driver()
browser.get('https://login.taobao.com')# 隐式等待
browser.implicitly_wait(10)# 获取页面元素模拟用户输入和点击行为
username_input = browser.find_element(By.CSS_SELECTOR, '#fm-login-id')
username_input.send_keys('xxx')  # 填写用户名password_input = browser.find_element(By.CSS_SELECTOR, '#fm-login-password')
password_input.send_keys('xxx')  # 填写对应的密码# 登录按钮
login_button = browser.find_element(By.CSS_SELECTOR, '#login-form > div.fm-btn > button')
login_button.click()# 显示等待
# wait_obj = WebDriverWait(browser, 10)
# wait_obj.until(expected_conditions.presence_of_element_located((By.CSS_SELECTOR, 'div.m-userinfo')))
time.sleep(15)# 获取登录的cookie数据,并且写入文件
with open('taobao2.json', 'w') as file:json.dump(browser.get_cookies(), file)

  最后我们在进行发送请求的时候,把Cookie加进请求当中,就可以访问TB网进行搜索商品了。将Cookie加进浏览器对象中:

def add_cookies(browser, cookie_file):  # 给浏览器对象添加登录的cookiewith open(cookie_file, 'r') as file:cookie_list = json.load(file)for cookie_dict in cookie_list:if cookie_dict['secure']:browser.add_cookie(cookie_dict)

  我们可以先来测试一下是否能操作浏览器,在进行爬取之前得先获取登录的Cookie,所以先执行登录的代码,第一小节的代码在普通python文件中就能执行,可以不用在Scrapy项目中执行。接着执行访问搜索页面的代码,代码为:

'''
通过搜索获取商品信息
'''from utils import create_chrome_driver, add_cookiesbrowser = create_chrome_driver()  # 创建谷歌浏览器对象,通过控制浏览器来访问url
browser.get('https://www.taobao.com')
add_cookies(browser, 'taobao2.json')
browser.get('https://s.taobao.com/search?q=手机&s=0')  # 淘宝上的搜索功能必须要登录才能搜索,需要用cookie来亮明身份

  程序会自动操控浏览器去访问TB搜索页:

二、蜘蛛程序的编写

  我们这里爬取手机、笔记本电脑、键鼠套装的数据,每一个类被爬取两页,一页有48条数据,一共就是288条数据,每一页都会有几条时广告,所以爬取的数据是少于288条的。蜘蛛程序代码如下:

import scrapy
from scrapy import Request,Selectorfrom TaoSpider.items import TaospiderItemclass TaobaoSpider(scrapy.Spider):name = 'taobao'allowed_domains = ['taobao.com']def start_requests(self):keywords = ['手机', '笔记本电脑', '键鼠套装']for keyword in keywords:for page in range(2):url = f'https://s.taobao.com/search?q={keyword}&s={48 * page}'yield Request(url=url)# def parse_detail(self, response, **kwargs):#     passdef parse(self, response, **kwargs):  # 淘宝的数据是通过js动态渲染出来的,不是静态内容,通过选择器拿不到,我们要通过selenium帮助我们拿到,在数据管道中实现sel = Selector(response)selectors = sel.css('div.items > div.item.J_MouserOnverReq > div.ctx-box.J_MouseEneterLeave.J_IconMoreNew')for selector in selectors:  # type: Selectoritem = TaospiderItem()item['title'] = ''.join(selector.css('div.row.row-2.title > a::text').extract()).strip()item['price'] = selector.css('div.row.row-1.g-clearfix > div.price.g_price.g_price-highlight > strong::text').extract_first().strip()item['deal_count'] = selector.css('div.row.row-1.g-clearfix > div.deal-cnt::text').extract_first().strip()item['shop'] = selector.css('div.row.row-3.g-clearfix > div.shop > a > span:nth-child(2)::text').extract_first().strip()item['location'] = selector.css('div.row.row-3.g-clearfix > div.location::text').extract_first().strip()yield item

  数据条目Items的代码如下:

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.htmlimport scrapyclass TaospiderItem(scrapy.Item):title = scrapy.Field()  # 标题price = scrapy.Field()  # 价格deal_count = scrapy.Field()  # 销量shop = scrapy.Field()  # 店铺名称location = scrapy.Field()  # 店铺地址

三、中间件的编写

  我这里主要是重新编写下载中间件,因为Taobao的数据是用js动态渲染的,所以我们不能用Scrapy默认的下载器抓取数据,默认的下载器只能抓取静态数据。想要抓取动态数据的话,需要用到
Selenium。并且Taobao需要登录之后才能使用搜索功能,所以我们把第一小节的代码一起用上,下载中间件代码为:

class TaospiderDownloaderMiddleware:# Not all methods need to be defined. If a method is not defined,# scrapy acts as if the downloader middleware does not modify the# passed objects.@classmethoddef from_crawler(cls, crawler):# This method is used by Scrapy to create your spiders.# s = cls()# crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)# return sreturn cls()def __init__(self):  # 初始化数据管道时模拟用户登录self.browser = create_chrome_driver()self.browser.get('https://www.taobao.com')add_cookies(self.browser, 'taobao2.json')def __del__(self):  # 销毁时执行该方法self.browser.close()def process_request(self, request: Request, spider):  # 不用原来的下载器去下载,自己编写一个selenium下载器# Called for each request that goes through the downloader# middleware.# Must either:# - return None: continue processing this request# - or return a Response object# - or return a Request object# - or raise IgnoreRequest: process_exception() methods of#   installed downloader middleware will be calledself.browser.get(request.url)# page_source 是带了动态内容的网页源代码,和直接在浏览器看到的源代码不一样,直接在浏览器看到的只有静态内容# 通过浏览器请求之后,直接返回响应回来的内容通过引擎传递给解析器return HtmlResponse(url=request.url, body=self.browser.page_source,request=request, encoding='utf-8')def process_response(self, request, response, spider):# Called with the response returned from the downloader.# Must either;# - return a Response object# - return a Request object# - or raise IgnoreRequestreturn responsedef process_exception(self, request, exception, spider):# Called when a download handler or a process_request()# (from other downloader middleware) raises an exception.# Must either:# - return None: continue processing this exception# - return a Response object: stops process_exception() chain# - return a Request object: stops process_exception() chainpassdef spider_opened(self, spider):spider.logger.info('Spider opened: %s' % spider.name)

  别忘了在配置文件中开启中间件:

DOWNLOADER_MIDDLEWARES = {'TaoSpider.middlewares.TaospiderDownloaderMiddleware': 543,
}

四、数据存储——数据管道的编写

  如果不想把数据存进第三方的,比如数据库和excel的话,就不用看这里了直接在命令行执行:scrapy crawl taobao -o taobao.csv,就能把数据存进csv文件中了。我这里在数据管道中把数据存进Excel。数据管道代码:

class TaospiderPipeline:def __init__(self):self.wb = openpyxl.Workbook()  # 创建工作簿self.ws = self.wb.active  # 拿到默认激活的工作表self.ws.title = 'TaoBaoData'  # 工作表名称self.ws.append(('标题','价格','销量','店铺名称','店铺地址'))  # 表头def close_spider(self, spider):  # 爬虫停止运行的时候执行该方法,钩子函数,自己执行不需要调用self.wb.save('淘宝商品数据.xlsx')def process_item(self, item, spider):title = item.get('title', '')  # 如果字典中的title值为空的话,就把''(空值)赋给title变量,写法一price = item.get('price') or 0  # 如果字典中的title值为空的话,就把''(空值)赋给title变量,写法二deal_count = item.get('deal_count', '')shop = item.get('shop', '')location = item.get('location', '')self.ws.append((title, price, deal_count, shop, location))  #return item

  别忘了在配置文件中开启数据管道:

ITEM_PIPELINES = {'TaoSpider.pipelines.TaospiderPipeline': 300,
}

  最后在命令行中执行:scrapy crawl taobao,taobao为蜘蛛程序的名字。

  Taobao会有滑动验证码反爬措施,这里只能爬取几次,之后就会被封掉。一般解封时间为一个小时,如果想绕过这个滑动验证码,需要改Chrome浏览器的动态程序,请读者自行上网百度。

用Scrapy和Selenium爬取动态数据相关推荐

  1. 使用scrapy +selenium爬取动态渲染的页面

    背景 在通过scrapy框架进行某些网站数据爬取的时候,往往会碰到页面动态数据加载的情况发生,如果直接使用scrapy对其url发请求,是绝对获取不到那部分动态加载出来的数据值.但是通过观察我们会发现 ...

  2. Selenium 爬取评论数据,就是这么简单!

    本文来自作者 秦子敬 在 GitChat 上分享「如何利用 Selenium 爬取评论数据?」,「阅读原文」查看交流实录 「文末高能」 编辑 | 飞鸿 一.前言 我们知道,如今的 web 网页数据很多 ...

  3. Python之网络爬虫(selenium爬取动态网页、爬虫案例分析、哈希算法与RSA加密)

    文章目录 一.selenium爬取动态网页 二.爬虫案例分析 三.哈希hash算法与RSA加密 一.selenium爬取动态网页 1.动态网页认知 爬虫其实就是在模仿浏览器的行为 应对要多次数据的交互 ...

  4. python爬虫动态加载页面_Python+Selenium爬取动态加载页面(2)

    注: 上一篇<Python+Selenium爬取动态加载页面(1)>讲了基本地如何获取动态页面的数据,这里再讲一个稍微复杂一点的数据获取全国水雨情网.数据的获取过程跟人手动获取过程类似,所 ...

  5. Python集成scrapy和selenium爬取苏宁图书

    Python集成scrapy和selenium爬取苏宁图书 环境:python3.6 pycharm2018.1.3 前言 本人渣渣一枚,为爬虫苏宁图书获取数据,将获得的数据保存在MangoDB中,现 ...

  6. 爬虫系列4:Requests+Xpath 爬取动态数据

    爬虫系列4:Requests+Xpath 爬取动态数据 [抓取]:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html [分页]:参 ...

  7. 【爬虫】Selenium爬取动态网页的base64图片

    文章简介 Selenium爬取动态网页的base64图片,并解决页面完整加载缓慢,base64字符串的获取和格式转码,一些页面不存在,部分照片无法加载等问题.后附源码. 目录 1,需求 2,环境和使用 ...

  8. python爬虫——使用selenium爬取微博数据(一)

    python爬虫--使用selenium爬取微博数据(二) 写在前面 之前因为在组里做和nlp相关的项目,需要自己构建数据集,采用selenium爬取了几十万条微博数据,学习了很多,想在这里分享一下如 ...

  9. 使用 Scrapy + Selenium 爬取动态渲染的页面

    点击上方蓝字关注我们! 背景 在通过scrapy框架进行某些网站数据爬取的时候,往往会碰到页面动态数据加载的情况发生,如果直接使用scrapy对其url发请求,是绝对获取不到那部分动态加载出来的数据值 ...

最新文章

  1. 用Visual C#创建Windows服务程序
  2. laravel5.5首次使用php artisan migrate注意问题:
  3. 被Zoom逼疯的歪果仁,造出了视频会议机器人,同事已笑疯丨开源
  4. poj2566Bound Found尺取法进阶(java)
  5. 概率论的一些基本问题
  6. 关于@Autowired后Spring无法注入的问题
  7. python小仙女_python——time库整理(基础知识+实例)
  8. 江西理工大学南昌校区cool code竞赛
  9. Objective-C 2.0 with Cocoa Foundation--- 7,对象的初始化以及实例变量的作用域
  10. 【转】精华!图解局域网共享设置步骤 - 李小虎
  11. Android Studio真机测试失败-----''No target device found
  12. linux操作系统原理与应用.第2版 陈莉君 pdf
  13. 数据库笔记 NO.1 ------------2020.03.26
  14. 火狐开发版_Firefox普通版和开发版之间有什么区别?
  15. Kali 开机报错解决方案
  16. Endnote使用笔记01:如何在Endnote 20中导入GB/T7714-2015引文格式
  17. Git:不同仓库之间的cherry-pick
  18. Flutter强制某个页面横屏
  19. 程序员必看的十大电影
  20. 博图程序需要手动同步_博图新手使用说明

热门文章

  1. Uncaught SyntaxError: Unexpected identifier问题解决
  2. W801单片机学习笔记——调试器的配置与使用(适用于W801和W806)
  3. HI3516DV300 图像输入
  4. Cisco(63)——多出口PBR+NAT解决方案
  5. PID控制 通俗理解和简单实践
  6. 搜救犬都负责什么工作
  7. 删除文件过一会又回来_手机文件误删除如何恢复?教你实用的找回方法!
  8. 速卖通商品详情API接口(商品详情页面数据接口)
  9. stm32f105固件包_STM32F105/107
  10. CryptoJS v3.1.2 源码自取