Skip to content

Commit c87edcf

Browse files
committed
Merge branch 'master' into mkdir700-master
2 parents 64883b2 + a83614e commit c87edcf

22 files changed

Lines changed: 368 additions & 64 deletions

docs/_sidebar.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
* 使用进阶
1818
* [请求-Request](source_code/Request.md)
1919
* [响应-Response](source_code/Response.md)
20+
* [浏览器渲染](source_code/浏览器渲染.md)
2021
* [解析器-BaseParser](source_code/BaseParser.md)
2122
* [批次解析器-BatchParser](source_code/BatchParser.md)
2223
* [Spider进阶](source_code/Spider进阶.md)

docs/source_code/BaseParser.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@ class BaseParser(object):
2020

2121
def download_midware(self, request):
2222
"""
23-
@summary: 下载中间件 可修改请求的一些参数
23+
@summary: 下载中间件 可修改请求的一些参数, 或可自定义下载,然后返回 request, response
2424
---------
2525
@param request:
2626
---------
27-
@result: return request / None (不会修改原来的request)
27+
@result: return request / request, response
2828
"""
2929

3030
pass

docs/source_code/BatchSpider进阶.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,8 +186,8 @@ from feapder.buffer.request_buffer import RequestBuffer
186186
from feapder.buffer.item_buffer import ItemBuffer
187187
from feapder.dedup import Dedup
188188
189-
RequestBuffer.dedup = Dedup(filter_type=MemoryError)
190-
ItemBuffer.dedup = Dedup(filter_type=MemoryError)
189+
RequestBuffer.dedup = Dedup(filter_type=Dedup.MemoryFilter)
190+
ItemBuffer.dedup = Dedup(filter_type=Dedup.MemoryFilter)
191191
```
192192

193193
RequestBuffer 为任务入库前缓冲的buffer,ItemBuffer为数据入库前缓冲的buffer

docs/source_code/Request.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ Request除了支持requests的所有参数外,更需要关心的是框架中
3737
@param download_midware: 下载中间件。默认为parser中的download_midware
3838
@param is_abandoned: 当发生异常时是否放弃重试 True/False. 默认False
3939
@param render: 是否用浏览器渲染
40+
@param render_time: 渲染时长,即打开网页等待指定时间后再获取源码
4041
--
4142
以下参数于requests参数使用方式一致
4243
@param method: 请求方式,如POST或GET,默认根据data值是否为空来判断

docs/source_code/Spider进阶.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,8 +196,8 @@ from feapder.buffer.request_buffer import RequestBuffer
196196
from feapder.buffer.item_buffer import ItemBuffer
197197
from feapder.dedup import Dedup
198198
199-
RequestBuffer.dedup = Dedup(filter_type=MemoryError)
200-
ItemBuffer.dedup = Dedup(filter_type=MemoryError)
199+
RequestBuffer.dedup = Dedup(filter_type=Dedup.MemoryFilter)
200+
ItemBuffer.dedup = Dedup(filter_type=Dedup.MemoryFilter)
201201
```
202202

203203
RequestBuffer 为任务入库前缓冲的buffer,ItemBuffer为数据入库前缓冲的buffer
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
# 浏览器渲染
2+
3+
采集动态页面时(Ajax渲染的页面),常用的有两种方案。一种是找接口拼参数,这种方式比较复杂但效率高,需要一定的爬虫功底;另外一种是采用浏览器渲染的方式,直接获取源码,简单方便
4+
5+
框架内置一个浏览器渲染池,默认的池子大小为1,请求时重复利用浏览器实例,只有当代理失效请求异常时,才会销毁、创建一个新的浏览器实例
6+
7+
## 使用方式:
8+
9+
```python
10+
def start_requests(self):
11+
yield feapder.Request("https://news.qq.com/", render=True)
12+
```
13+
在返回的Request中传递`render=True`即可
14+
15+
框架支持`CHROME``PHANTOMJS`两种浏览器渲染,可通过[配置文件](source_code/配置文件)进行配置。相关配置如下:
16+
17+
```python
18+
# 浏览器渲染
19+
WEBDRIVER = dict(
20+
pool_size=1, # 浏览器的数量
21+
load_images=True, # 是否加载图片
22+
user_agent=None, # 字符串 或 无参函数,返回值为user_agent
23+
proxy=None, # xxx.xxx.xxx.xxx:xxxx 或 无参函数,返回值为代理地址
24+
headless=False, # 是否为无头浏览器
25+
driver_type="CHROME", # CHROME 或 PHANTOMJS,
26+
timeout=30, # 请求超时时间
27+
window_size=(1024, 800), # 窗口大小
28+
executable_path=None, # 浏览器路径,默认为默认路径
29+
render_time=0, # 渲染时长,即打开网页等待指定时间后再获取源码
30+
)
31+
```
32+
33+
`feapder.Request` 也支持`render_time`参数, 优先级大于配置文件中的`render_time`
34+
35+
## 设置User-Agent
36+
37+
> 每次生成一个新的浏览器实例时生效
38+
39+
### 方式1:
40+
41+
通过配置文件的 `user_agent` 参数设置
42+
43+
### 方式2:
44+
45+
通过 `feapder.Request`携带,优先级大于配置文件, 如:
46+
47+
```python
48+
def download_midware(self, request):
49+
request.headers = {
50+
"User-Agent": "xxxxxxxx"
51+
}
52+
return request
53+
```
54+
55+
## 设置代理
56+
57+
> 每次生成一个新的浏览器实例时生效
58+
59+
### 方式1:
60+
61+
通过配置文件的 `proxy` 参数设置
62+
63+
### 方式2:
64+
65+
通过 `feapder.Request`携带,优先级大于配置文件, 如:
66+
67+
```python
68+
def download_midware(self, request):
69+
request.proxies = {
70+
"http": "http://xxx.xxx.xxx.xxx:xxxx"
71+
}
72+
return request
73+
```
74+
75+
或者
76+
77+
```python
78+
def download_midware(self, request):
79+
request.proxies = {
80+
"https": "https://xxx.xxx.xxx.xxx:xxxx"
81+
}
82+
return request
83+
```
84+
85+
## 设置Cookie
86+
87+
通过 `feapder.Request`携带,如:
88+
89+
```python
90+
def download_midware(self, request):
91+
request.headers = {
92+
"Cookie": "key=value; key2=value2"
93+
}
94+
return request
95+
```
96+
97+
或着
98+
99+
```python
100+
def download_midware(self, request):
101+
request.cookies = {
102+
"key": "value",
103+
"key2": "value2",
104+
}
105+
return request
106+
```
107+
108+
## 操作浏览器对象
109+
110+
通过 `response.browser` 获取浏览器对象
111+
112+
代码示例:请求百度,搜索feapder
113+
114+
```python
115+
import time
116+
117+
import feapder
118+
from feapder.utils.webdriver import WebDriver
119+
120+
121+
class TestRender(feapder.AirSpider):
122+
def start_requests(self):
123+
yield feapder.Request("http://www.baidu.com", render=True)
124+
125+
def parse(self, request, response):
126+
browser: WebDriver = response.browser
127+
browser.find_element_by_id("kw").send_keys("feapder")
128+
browser.find_element_by_id("su").click()
129+
time.sleep(5)
130+
print(browser.page_source)
131+
132+
133+
if __name__ == "__main__":
134+
TestRender().start()
135+
136+
```

docs/usage/AirSpider.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -239,21 +239,20 @@ def start_requests(self):
239239

240240
```python
241241
# 浏览器渲染
242-
# 浏览器渲染
243242
WEBDRIVER = dict(
244-
pool_size=2, # 浏览器的数量
245-
load_images=False, # 是否加载图片
243+
pool_size=1, # 浏览器的数量
244+
load_images=True, # 是否加载图片
246245
user_agent=None, # 字符串 或 无参函数,返回值为user_agent
247246
proxy=None, # xxx.xxx.xxx.xxx:xxxx 或 无参函数,返回值为代理地址
248247
headless=False, # 是否为无头浏览器
249248
driver_type="CHROME", # CHROME 或 PHANTOMJS,
250249
timeout=30, # 请求超时时间
251250
window_size=(1024, 800), # 窗口大小
252251
executable_path=None, # 浏览器路径,默认为默认路径
252+
render_time=0, # 渲染时长,即打开网页等待指定时间后再获取源码
253253
)
254254
```
255255

256-
默认不加载图片,提高渲染速度
257256

258257
## 14. 完整的代码示例
259258

feapder/VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.4.4
1+
1.4.6

feapder/commands/create/create_item.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import os
1313

1414
import feapder.utils.tools as tools
15+
from feapder import setting
1516
from feapder.db.mysqldb import MysqlDB
1617
from .create_init import CreateInit
1718

@@ -30,9 +31,7 @@ def __init__(self):
3031

3132
def select_columns(self, table_name):
3233
# sql = 'SHOW COLUMNS FROM ' + table_name
33-
sql = "SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_DEFAULT, EXTRA, COLUMN_KEY, COLUMN_COMMENT FROM INFORMATION_SCHEMA.Columns WHERE table_name = '{}'".format(
34-
table_name
35-
)
34+
sql = f"SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_DEFAULT, EXTRA, COLUMN_KEY, COLUMN_COMMENT FROM INFORMATION_SCHEMA.Columns WHERE table_name = '{table_name}' and table_schema = '{setting.MYSQL_DB}'"
3635
columns = self._db.find(sql)
3736

3837
return columns
@@ -45,10 +44,7 @@ def select_tables_name(self, tables_name):
4544
---------
4645
@result:
4746
"""
48-
sql = (
49-
"select table_name from information_schema.tables where table_name like '%s'"
50-
% tables_name
51-
)
47+
sql = f"select table_name from information_schema.tables where table_name like '{tables_name}' and table_schema = '{setting.MYSQL_DB}'"
5248
tables_name = self._db.find(sql)
5349

5450
return tables_name

feapder/core/base_parser.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@ def start_requests(self):
2828

2929
def download_midware(self, request):
3030
"""
31-
@summary: 下载中间件 可修改请求的一些参数
31+
@summary: 下载中间件 可修改请求的一些参数, 或可自定义下载,然后返回 request, response
3232
---------
3333
@param request:
3434
---------
35-
@result: return request / None (不会修改原来的request)
35+
@result: return request / request, response
3636
"""
3737

3838
pass

0 commit comments

Comments
 (0)