Skip to content

Commit 5cf33fd

Browse files
author
Boris
committed
修复浏览器渲染问题
1 parent daf00c6 commit 5cf33fd

8 files changed

Lines changed: 37 additions & 25 deletions

File tree

docs/command/cmdline.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ item = SpiderDataItem(**response_data)
339339

340340
可以看出,我们可以直接使用response, response支持xpath表达式
341341

342-
若想查看都支持哪些函数,可输入`resonse.` 然后敲两次`tab键`,如下:
342+
若想查看都支持哪些函数,可输入`response.` 然后敲两次`tab键`,如下:
343343
![-w1738](http://markdown-media.oss-cn-beijing.aliyuncs.com/2020/06/21/15927532396490.jpg)
344344

345345
1. 以curl为例,请求百度(通常用来测试post接口比较方便)

docs/usage/AirSpider.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,8 @@ WEBDRIVER = dict(
221221
)
222222
```
223223

224+
默认不加载图片,提高渲染速度
225+
224226
## 13. 完整的代码示例
225227

226228
AirSpider:https://github.com/Boris-code/feapder/blob/master/tests/air-spider/test_air_spider.py

feapder/VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.3.2
1+
1.3.3

feapder/core/spiders/air_spider.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,5 @@ def run(self):
8282
if Request.webdriver_pool:
8383
Request.webdriver_pool.close()
8484

85-
8685
log.info("无任务,爬虫结束")
8786
break

feapder/network/request.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,8 @@ def get_response(self, save_cached=False):
326326
)
327327

328328
response._cached_text = html
329-
response.browser = browser
329+
# response.browser = browser # 因为浏览器渲染完就释放了,所以不能绑定到response上
330+
self._webdriver_pool.put(browser)
330331
except Exception as e:
331332
self._webdriver_pool.remove(browser)
332333
raise e

feapder/utils/webdriver.py

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
@email: boris_liu@foxmail.com
99
"""
1010

11-
import collections
11+
import queue
1212
import threading
1313

1414
from selenium import webdriver
@@ -201,27 +201,35 @@ def __getattr__(self, name):
201201
@Singleton
202202
class WebDriverPool:
203203
def __init__(self, pool_size=5, **kwargs):
204-
self.queue = collections.deque(maxlen=pool_size)
204+
self.queue = queue.Queue(maxsize=pool_size)
205205
self.kwargs = kwargs
206206
self.lock = threading.RLock()
207+
self.driver_count = 0
208+
209+
@property
210+
def is_full(self):
211+
return self.driver_count >= self.queue.maxsize
207212

208213
def get(self):
209-
if not len(self.queue) >= self.queue.maxlen:
214+
if not self.is_full:
210215
with self.lock:
211-
if not len(self.queue) >= self.queue.maxlen:
216+
if not self.is_full:
212217
driver = WebDriver(**self.kwargs)
213-
self.queue.append(driver)
214-
215-
driver = self.queue.popleft()
216-
self.queue.append(driver)
218+
self.queue.put(driver)
219+
self.driver_count += 1
217220

221+
driver = self.queue.get()
218222
return driver
219223

224+
def put(self, driver):
225+
self.queue.put(driver)
226+
220227
def remove(self, driver):
221228
driver.quit()
222-
self.queue.remove(driver)
229+
self.driver_count -= 1
223230

224231
def close(self):
225-
while self.queue:
226-
driver = self.queue.pop()
232+
while not self.queue.empty():
233+
driver = self.queue.get()
227234
driver.quit()
235+
self.driver_count -= 1

tests/test_rander.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@
44
class XueQiuSpider(feapder.AirSpider):
55
def start_requests(self):
66
for i in range(10):
7-
yield feapder.Request("https://news.qq.com/", render=True)
7+
yield feapder.Request("https://news.qq.com/#{}".format(i), render=True)
88

99
def parse(self, request, response):
10-
print(response.browser)
11-
print(response)
10+
print(response.cookies.get_dict())
11+
print("response.url ", response.url)
1212

13-
article_list = response.xpath('//div[@class="detail"]')
14-
for article in article_list:
15-
title = article.xpath("string(.//a)").extract_first()
16-
print(title)
13+
# article_list = response.xpath('//div[@class="detail"]')
14+
# for article in article_list:
15+
# title = article.xpath("string(.//a)").extract_first()
16+
# print(title)
1717

1818

1919
if __name__ == "__main__":

tests/test_rander2.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ def start_requests(self):
1111
yield feapder.Request("https://news.qq.com/#{}".format(i), render=True)
1212

1313
def parse(self, request, response):
14-
print(response.browser)
15-
print(response)
14+
print(response.cookies.get_dict())
15+
print("response.url ", response.url)
1616

1717
article_list = response.xpath('//div[@class="detail"]')
1818
for article in article_list:
@@ -21,4 +21,6 @@ def parse(self, request, response):
2121

2222

2323
if __name__ == "__main__":
24-
XueQiuSpider(thread_count=10, redis_key="feapter:test_rander").start()
24+
XueQiuSpider(
25+
thread_count=10, redis_key="feapter:test_rander", delete_keys=True
26+
).start()

0 commit comments

Comments
 (0)