动态网页抓取(就是动态网站爬取的思路与操作步骤(一)-苏州安嘉)
优采云 发布时间: 2021-12-13 20:16动态网页抓取(就是动态网站爬取的思路与操作步骤(一)-苏州安嘉)
导言
在日常爬行过程中,动态网站爬行更麻烦,因为动态网站数据是动态加载的。此时,我们需要使用selenium中间件来模拟操作并获取动态数据
开始创建项目
1.scrapy startproject Taobao
复制代码
2.cd Taobao
复制代码
3. scrapy genspider taobao www.taobao.com
复制代码
开放项目
首先,让我们不要爬行。首先,在设置中将爬虫规则设置为false
ROBOTSTXT_OBEY = False
复制代码
我们在终点站输入
scrapy view "http://www.taobao.com"
复制代码
此时,您将发现您爬网到的页面如下所示:
可以发现爬网的页面是一个没有数据的空帧。这个时候我该怎么办??我们将使用selenium中间件
让我们关注淘宝下载器中间件中的process_请求功能。让我们添加一行代码以查看效果:
def process_request(self, request, spider):
# 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 called
print("------我是中间件,请求经过我------")
return None
复制代码
然后在会议中,删除以下评论
DOWNLOADER_MIDDLEWARES = {
'Taobao.middlewares.TaobaoDownloaderMiddleware': 543,
}
复制代码
让我们运行它以查看效果:
scrapy view "http://www.taobao.com"
复制代码
效果:
------我是中间件,请求经过我------
2018-08-29 15:38:21 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (302) to from
------我是中间件,请求经过我------
2018-08-29 15:38:21 [scrapy.core.engine] DEBUG: Crawled (200) (referer: None)
复制代码
结果表明,该中间件是有效的。如果我们在中间件中模拟一些操作,我们可以获得动态数据吗
中间件的操作
首次*敏*感*词*硒
from selenium import webdriver
#无界面运行
from selenium.webdriver.chrome.options import Options
复制代码
进程中\在请求函数中编写以下代码
def process_request(self, request, spider):
# Called for each request that goes through the downloader
# middleware.
print("------我是中间件,请求经过我------")
#设置无界面运行
option = Options()
option.add_argument("--headless")
#创建一个driver对象
#driver = webdriver.Chrome()
driver = webdriver.Chrome(chrome_options=option)
#等待15秒
driver.implicitly_wait(15)
driver.get(request.url)
# 让页面滚动最底层 模拟人的操作
js = 'window.scrollTo(0,document.body.scrollHeight)'
# 执行js
driver.execute_script(js)
# 获取内容
content = driver.page_source
from scrapy.http import HtmlResponse
# 创建一个resp对象返回至解析函数
resp = HtmlResponse(request.url,request=request,body=content,encoding='utf-8')
return resp
return None
复制代码
那么这个动态数据呢,这个时候已经得到了,在这里就不进行分析了。以上是动态网站爬行的思想