数学建模社区-数学中国
标题:
Python爬虫仅需一行代码----crawl第三方库
[打印本页]
作者:
zhangtt123
时间:
2020-6-2 16:00
标题:
Python爬虫仅需一行代码----crawl第三方库
仅需一行代码写爬虫–simple_crawl
) t7 R+ _9 c: ]
simple_crawl
( s; e1 [# f1 ?6 [
仅需一行代码即可达到爬虫效果
6 d8 h5 V- p6 T
项目地址(欢迎star):https://github.com/Amiee-well/crawl
. I9 t7 U3 u, ~; Z" h# J* H- y+ p
使用方法
; [9 u' u" L- m6 J" G' j+ Q" x
pip install simple_crawl
+ C2 \" u( u4 |
! f( b( ^/ r, L( p% x
### 以下源代码为简单介绍,详细功能介绍再源代码之下
- ]( q/ l% {3 h" c
from simple_crawl import request
6 ~! M+ x% G7 S7 k1 I/ x T3 v
request.parse(
M* L6 v7 i/ `% L" a _
# status 参数为运行状态,支持单线程多线程多进程协程以及联合
5 B% N6 J+ ^; H& U- C. Z# G# R
status="aiohttp",
3 h3 _- ^' H/ s( ~) r
# url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式
+ [7 s9 J4 [1 K" L
url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
" R2 k5 f. A/ A! h U; L: F' r
# login 参数为获取登陆信息,如淘宝等网址需要登陆信息
# q! o+ |% }8 y, E& c; L
#login="taobao",
- r7 M u" B& O2 \9 a
# type_url 参数为返回源代码格式,支持text和json,默认返回text
4 x3 f# i" Y9 p7 z! h' f0 t
type_url = "text",
5 V" c& }& x4 O7 k0 X5 t3 u; _
# Parsing 参数为解析方法,支持re、xpath和beautifulsoup
% _! _0 |: k, A2 x$ K$ ?
Parsing = 'xpath',
" A0 _/ \$ g$ x r% Z
# label 参数为爬虫解析过程,字典格式,详情见下方
8 [9 Q; ]9 A: T6 A1 s
label = {
8 C( X8 A9 o: H L, G, Z. H
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
7 A% W0 s* Y/ p
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
+ D6 ^* x7 F( }- a! a) H: P
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
5 X2 X' j! p# c& I- K3 J/ Z
},
& A% X! m5 }# W' V( @+ h
# write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱
* a$ [2 R( G7 G* O" E
write='result.txt',
0 \& _$ c+ S6 Z" T$ G2 J( ^' P
# next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫
# d. b* X; b+ Y7 u* h( l# v# w
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
/ H- b P+ V i4 T0 r" D3 J5 I1 m
# page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫
% t7 R4 ~" Y. c3 v
page=[True,"now_url.txt"],
& j) x$ Z1 ^; N/ l
# clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息
/ H+ Y1 Y% G3 U" z
#clean=True,
8 V9 Q, b4 S' ?3 P1 m
# texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序
9 D" i5 S, {+ F ~$ O! x! K
texting=True,
- t- f* ]! z0 u% D' e a
# Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态
7 s( [. m2 I; N; t4 ^' T- X
Thread_num=3,
7 P- ^" q" S3 f! l8 T
# cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态
7 P! ?* t* F5 v @" }. J8 Q( l6 F
cpu_count=1,
- ?- b+ ` r9 ]) t
# sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态
# ?6 O9 ^9 Y7 ^. Z
sem=5,
- _( |! d3 C' ^. k% W6 F; y
# write_SQL 为是否写入数据库,默认否
: P/ w1 w# U8 J# J' M% W- u
# host 参数默认localhost
1 y9 r6 K# v4 Q: F! Y7 C3 H
# post 参数默认3306
$ ~5 t% Q' X% l
# user 参数默认root
1 V) F& }2 P) U! D$ h
# password 参数必填,必须正确
3 w8 S' A$ g( U6 Y, R7 K! f* x* R
# db 参数为即将存入的数据库名,若不存在自动创建
+ i/ g* W; o0 }+ _
# table 参数为即将存入的数据表名,若不存在自动创建
K$ N6 `7 K" ^/ a, @% _
write_SQL={
7 r% b2 C* s' y% m
'host':'localhost',
! b3 V! |4 [) t* _
'post':'3306',
4 p* z# o. q& H/ P! c4 P
'user':'root',
# {% ? K5 a9 ^9 K4 {3 g
'password':'123456',
9 x+ ~$ K# r) X( b5 a
'db':'example',
/ H6 m5 A& @5 U( D+ W
'table':'example'
7 y* p$ K6 h* g
}
9 r/ [0 Z- e/ p$ {4 a8 L0 u
).run()
! ? i# z+ b; }$ R
" s C6 F4 F% @0 L
介绍一下crawl参数设置:
; `- D5 P3 ~' f* [* t8 B$ P
/ M9 W- i% U" e& P
'''
8 G: E+ t) {9 D4 J3 u! y
单行代码爬虫程序执行
* k8 m" N4 F/ E& i* K0 c" S
:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档
3 s; a$ C; B4 g$ K5 G5 K
:param url:即将请求的url地址,仅支持get请求
" {- u ^6 H$ O
:param type_url:请求url后返回格式,支持text和json格式返回
8 {- G; C' m: [/ T1 s: N& o
:param Thread_num:即将启动多线程个数,默认为1单线程
) ]1 u' }; }% [* V3 P6 E
:param sem:协程信号量,控制协程数,防止爬的过快,默认为5
: K5 r/ W# B& ]
:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半
# Y0 Z/ [% @7 o$ ]: G' N
:param login:模拟网站登陆,保存登陆信息
* |1 m! p: E8 \# Z0 x
:param Parsing:爬虫方式,支持re、xpath以及bs4方法
K7 k7 j9 f7 c( w$ V2 D
:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,
}) k. [3 J0 X
多次报错结束程序,默认否
: m! ?5 Q3 u2 p* H( F' m
:param label:选择器内容,字典格式保存,
) {( x9 R" D$ k- f O
字典值为列表格式,第一个参数为选择器,第二个参数为转换类型
( Q8 @2 \9 H5 O4 O% X0 j
第一个参数必填,第二个参数默认str类型
, K T) N/ E; {- e. w) M5 v- x* D
:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否
: V/ T8 G# \' ?
:param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫
! @% t0 j U. M) q
:param page:是否选择断续笔记接手下次爬虫处理,默认否
, d7 c/ C' q: x. n
:param clean:是否进行简单类型数据清洗,默认否
, k2 Y, r/ f; e' o4 Y
:param write_sql:是否写入数据库,默认否
. {: e" D; d' ?, c( }6 J
'host'默认为'localhost','post'默认'3306','user'默认'root',
6 b, p( F" ?+ ^4 c4 [' \" U0 Q
'password':'密码','db':'数据库','table':'数据表',
: C& h$ {! W; ~" K3 K# y- f2 r) b2 b
检测库是否存在,若不存在则创建,若存在则直接插入,
/ N) H; ^+ P4 o7 v- _) U- u
检测表是否存在,若不存在则创建,若存在则直接插入
" ~ B, T7 p/ @0 `5 K( |
:return True
R! @- j$ ]$ z; h8 k$ d2 F
'''
4 b+ g: M- m* N, r: |8 @: f1 N1 Q
介绍玩法
/ N0 h; s9 @2 h0 q/ y- }
接下来介绍的均为调用第三方库的情况下运行:
% q5 A$ j8 N, S. A
( b2 b" |) C# ~0 w9 ^: c
from simple_crawl import request
5 U0 t, u+ M Q7 }# `4 N! X2 l
第一种玩法:输出源代码
( o. x3 {/ l5 M" Y! j, n8 R
调用requests库进行源代码请求。
! m6 |9 s, {1 }/ d- A
. w' m3 t/ g' p: q* H
特点:
5 g3 Z" }, G1 b4 r% s! r3 L
请求失败则调用ip池处理重新请求访问,
$ E$ `, A- f: F- k; U# r
出现五次失败默认网址输入错误。
1 D0 S9 R8 ]/ Z- `& h+ F5 ^, ^
支持text以及json字符串返回。默认text。
) k# @2 c& O! S5 H' f1 J
/ X0 I4 W0 F. b0 Y0 V
缺点:
! e# A0 }7 f5 K4 }# p5 {
暂时只能进行get请求,不支持post访问
( M3 ?: a) T: }1 a5 v J3 T
2 k; O4 e) b& L
:return text or json
( M" I6 q' E) M0 ?
+ x; v! P3 F) R7 z+ [' r
request.parse(
8 o! o7 U; S! i& J
url = "https://www.douban.com/group/explore",
2 r3 @0 I. i6 M# n N; w" P% J5 E3 e
type_url = "text"
H0 ~/ ^2 n: ?( G2 z: Y U- f
).run()
- b/ L$ D8 f% @ b
# return text
5 v& z r/ J" D* I
+ S2 d& @: N. w% \' }
第二种玩法:模拟网站登陆并保存信息
: A$ P" @ F! H' F% b
调用DecryptLogin库请求登陆访问。
+ b1 [: R/ C+ b- d4 m) c" X
/ X+ N5 l, n) g- R( M3 l
ps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源
6 F4 X0 o% u" |, `1 ~' i
在此放出文档地址
# p1 Q1 J1 c3 z0 V
DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/
2 T* i: T6 {6 c b
9 _" F- B+ s, }9 @
特点:
+ Z* O, e: p1 {
将DecryptLogin库中二维码继承到此库(非二次开发)
( K2 x8 L) X d S5 C, l' v
支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)
& U. T9 I$ |9 Z2 |' w. v! g+ p0 y
保存session.pkl信息到本地方便下次登陆运行
) t( O- g' f6 J! U; x+ I& [
/ I; l9 w2 G' {( o! f+ S
缺点:
. W9 E) v6 j) B. Q8 O) w* ], H6 Y6 U2 x
session.pkl登陆信息过时无法自动删除。
# `; a' F5 Z6 m0 {
导致下次登陆疑似cookie无法正常登陆。
R' L# a% D6 t# y4 g, Q( X
- z6 M1 l& h$ |2 c! F2 W# {
:return session
( f* o; @% Y. W, F- P
' `# e6 A% d8 s( h3 W- y3 d
request.parse(
1 m$ U5 ^2 m! K: C
# 臭不要脸的推广一下我的店铺
& `) D& C7 C1 G! o4 R
url="https://shop574805287.taobao.com/",
1 v0 I6 d7 ~# t( Z) u' O# C
login="taobao"
1 Q; h+ f" D$ c4 ^& c
).run()
! J" u% Z1 U. e3 E
# return text
* o' n8 q6 Y& I! T' d
* c# q/ g* a& _6 Q3 z
第三种玩法:爬取网站信息
7 p" d/ u _7 R9 J9 X
爬虫库自然少不了爬虫的过程
9 i, T7 L B, X$ J' K5 p. b
# _# \; l' p ]( B
特点:
# C/ `% A$ n$ S, h% P9 I8 ~
支持re库,xpath解析以及bs4选择器。
6 \7 F! E2 J, `/ O# V( i
爬取方法为字典格式。单方面输出。
) r* \, }5 h) A2 [' ^
字典键为保存的字段名称。
5 u. w( a2 t& s/ W% [5 K5 ^
字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。
% R: L" }5 q; l
- a, Q$ O+ w3 a8 X5 V& a
缺点:暂无(等待小伙伴们发现)
5 w, U# R9 z) j& t, F7 O+ r
; p! o* ?3 {. O( d8 K- Q; z7 ^2 Z: }
:return reptile_results
) W: \. h: g( ], N0 y. b- p6 {
4 d# e0 I6 C; k9 K, `! x
request.parse(
! N0 w: ~8 H9 b; P* w$ ~
url='https://www.douban.com/group/explore',
$ \4 O- k7 l" P
# 字符串格式,选择器方法。
* A. E K7 Q g$ [8 M! n; S8 O
Parsing = 'xpath',
5 H D0 q1 f5 S: c2 l m
# 字典格式,参数如上。
0 Y+ t$ V8 S$ ?% D
label = {
8 A) w" D* \/ h0 b
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
0 D0 t: H4 J" m
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
3 x# l6 D6 `. J# S, X: W
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
. Z! ?" i* g4 C5 h
}
' b' u) F* {0 Q7 u w4 X6 h6 P
).run()
/ _/ i1 S* P/ Q" @$ E
# return reptile_results(list)
; ~$ h" i- {; F% d% i( W; o# D2 H
7 j: O( y; ^* X1 q0 m0 T
第四种玩法:自由保存信息
8 b8 w4 A- n' j$ M* i' u% I, g
目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。
; a a, g1 W5 t' C" F" `: G8 |
" [) c/ \* o- i6 I$ ?& R
特点:
8 P/ a- K6 Y0 J3 E W1 L8 V
写入文件均为数据格式传入文件。
1 N8 ^6 m6 k0 A! a/ \/ f
且输入格式规范方便阅读and省事。
+ q" Z0 A' D9 d3 h' ?8 E' C9 [" V
. K$ q4 C/ B& N0 @0 ?6 \* G
缺点:
# K/ L+ S. ?6 B- | w! B7 B
保存格式仅四种,
. F4 D/ Q1 _8 A
不方便用户之后读写操作。
- x- t) O. X6 W3 C# S- x
. e, V; F' l3 r" x6 |
:return file
# ^+ b0 K2 k' c/ I$ X3 B
$ x, Q) g& x/ c4 p7 ` ?$ m$ N
request.parse(
3 o: j6 k8 Q& p- T3 F Y6 V1 |
url='https://www.douban.com/group/explore',
( ?$ j4 q* o/ n% R* `5 }
Parsing = 'xpath',
0 w- [, Z5 z! V9 l" y9 e3 Q
label = {
" K6 N2 ]( s+ C( p6 C6 b
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
q' f1 X1 F7 a x# @9 t
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
% A) }6 f: K, b* Z7 V! u* X- h
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
r x8 _, y9 \# K
},
7 ~8 y$ \+ Q8 ?0 Q/ z
# 字符串格式,具体保存位置填写
" P5 F+ @, T( v$ C9 v7 E$ t( i; h' L- u
write='result.pkl'
1 c; E# M$ z6 L6 Y% _% C
).run()
B, v1 C3 J4 Q) t- I) B0 l' N
# return file
$ i) P5 \0 p$ Q" q: R5 b; p
}& a0 C! M2 E: G. L
第五种玩法:读取下一页 url 地址继续爬虫
7 W$ v5 l( z$ n* L
这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~
u5 s, b5 O' E+ x( Z
& E& M8 `# Y: |* R
特点:
0 V% u' d5 g- E: W/ [
继承之前的Parsing参数选择器选择方法。
; }/ M/ g+ R. l2 F c" u
在这里可读取到解析后的下一页 url 网址。
( \6 Y1 K* K6 q f8 b
方可继续进行爬虫处理。方便用户使用。
; w# c. D1 |/ W6 `' A) a7 t
4 a j* \0 E8 F
缺点:
! u6 Z% R; w% f$ o7 y
若爬虫时下一页 url 地址改变,便结束爬虫。
8 j, f: L6 e6 Z) M! B5 _& ]
只能爬取所给 url 地址中的信息。
& @7 P4 p3 r: [
无法进行某一界面的多个网页爬取返回。
7 X% m# n+ U% ~1 b6 n! ~
造成访问页面单一流失。
! L9 U; f& w$ `* g; m
5 p. ?: s. h* V3 Q& \, g6 \
:return None
# `; B2 I1 u- [0 G' q
9 ]" H: C2 L, n+ P
request.parse(
8 _# {! F' E9 x$ Q" M) ~; c4 b
url='https://www.douban.com/group/explore',
4 e& r1 H( t+ q/ y/ U) [! k
Parsing = 'xpath',
: j$ i% |: z0 T
label = {
, q' K) v7 x- c2 W' h; ~- O$ V+ X
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
7 L7 [7 I# u! a' {1 i' v
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
8 B& D+ W% b) a H, E( N' p: C4 `8 Q
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
; P* b1 ]* t3 O( y' M( V* e
},
2 K. a3 A" ?5 _2 l; j
write='result.pkl',
L- _- S; \( K) Z+ ?
# 字符串格式,根据Parsing方法继续请求下一页a中href
2 C& S! g- V F8 G
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
* y, @2 @0 ?3 g7 R" O
).run()
2 g/ K, v5 }& |9 Q0 U, Q
# return None
a+ D I# V# a$ C( E$ j
' E& g' D) e0 @5 G) x
第六种玩法:爬虫网页保存
" h6 Q! z1 u$ L
听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!
0 h& p8 g1 j' W
1 b; {7 H; p0 S s
特点:
+ H* F! G/ C) ?; z; |
持续输出断续笔记。
3 N4 f6 j( S5 H2 X; ?( z8 p, G a; E
将此次爬虫的 url 地址保存到一个文本文档内部。
: Q0 f9 `0 P/ A: m
下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。
6 ^* M7 U% ]9 h- F
0 ?4 C2 B( i+ w/ O$ ]0 Y3 l9 i
缺点:
! Y1 b8 R4 Z% ^% Z0 K
读取内容不单一。
. R" z2 H+ k$ u o. z; m
导致下次爬虫无法正确读取上次爬虫留下的痕迹。
s) f6 c) S0 H* s0 [
- M' _' H' ^, I: ?; i) n
:return url_file
) Q! b/ V, v- |7 F5 _/ m' Z) A8 G
' }# B8 C' q+ V
request.parse(
( B) ?! ~# T5 ?2 ?3 N
url='https://www.douban.com/group/explore',
5 N2 l& y) [& x* P M
type_url='text',
U) s9 [6 n) F9 ` w: N
#login='taobao',
: ]; [; u& G0 g! o, G: ?4 l7 v
Parsing = 'xpath',
$ H# k+ u* J5 r
label = {
7 V8 x( `# D3 u! J; y% g
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
# u+ j" c, f2 _* h" I
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
0 @* P! e& _# e, S/ @
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
2 O" T0 e" o0 E
},
/ X+ `6 t6 q! \+ C
write='result.pkl',
" N2 z: k* G L* B2 l' q5 H
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
" x6 ~* _% @8 V/ V
# 第一个参数为是否需要断续笔记。
: X* f' f$ O: S+ q
# 第二个参数为断续笔记保存位置。
; g$ c/ o. j k+ v$ Z7 i
page=[True,'url_page.txt']
0 x5 e% c+ o {
).run()
+ ?, J1 y0 U$ D0 M) G6 J) I2 L
# return url_file
. T4 y( v6 |" c' d5 F
/ h3 M+ k6 j/ v1 \8 |8 D
第七种玩法:简单数据清洗
2 z. ]: Z+ Y( E
数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。
7 O* ^) h$ x9 \' Y) C
. @ [ c! T- Q, X
特点:
$ z6 [/ a* ?1 W, E# U2 P
本人曾写过一个底层数据清洗。
# k b$ t# U1 I
能将列表格式数据进行归分清洗。
# W8 y% o5 T+ h4 H, p# d
主要内容请参考另一篇文章
+ d4 G! h6 ?* q+ F
如下连接:数据清洗
& k" J# ]$ c' Z8 y9 `( Y
) z, m& M: ~* U# r4 C
缺点:
7 y) A. h1 L3 p% l
数据清洗格式简单。
% e6 M- x; S; ~2 v
数据清洗内容单一。
2 n5 w) c3 `9 Z b, r$ }" B' j
无法完全做到绝对清洗。
. P- m2 n" x$ g, L2 `: U, V
有待改善。
1 ]9 f7 ~# |" v3 ~$ [' n
- B& O u5 D. z7 s+ {$ E
:return keyword_list, value_list
# ~! }3 v% x0 H* Q# ~' T5 N: G
) Q" L% d* i- Y
request.parse(
& Z! V: `0 F5 D3 j( e2 n) c
url='https://www.douban.com/group/explore',
" P/ ^6 E/ R: {1 d3 a0 x Q4 [
Parsing = 'xpath',
% @/ b9 T9 a2 n$ W) s9 Z
label = {
) m5 n* L% r6 L% P6 ]4 N
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
5 j4 c4 \; @# L; ?
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
" N# N0 Z6 ?6 y# f
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
5 X: r V% O$ a$ Q
},
; u2 P C- i# ?
write='result.pkl',
$ E C/ \2 [) T" D5 x' `
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
5 J+ F: t0 c4 d5 {, w. x8 k, V
page=[True,'url_page.txt'],
; R& ~/ W: X3 m7 L: P
# bool类型,默认不清洗
" ?( s& b# ]& g: a$ _1 {8 N2 F
clean=True
w6 k0 N5 I# f: ?6 w9 `
).run()
: D, o" _5 i g) z) `$ S6 w1 K! Z
j. `' |: |6 D
第八种玩法:爬虫存入数据库
+ O' g0 Q7 [( L% K* ~0 |* r
存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。
5 F* W) x$ B9 k( B' j# x$ c
% |# C+ n, e: t& x
特点:
+ C) w) b! j# f0 K/ f
信息存入MySQL数据库。
; w* M* d% [* s" k* V
可连接docker远程数据库。
1 a% }0 d# s8 y: h& U
数据库的库名可以不存在。
+ }( V d) W+ e* V, b9 v
数据库的表名可以不存在。
. c, d2 H" I% [' w/ t' g& Z
根据之前传入字典键与值参数判断表类型。
% C6 ^! [# o6 B# v: k- C) i
自由建立数据表传入信息。
+ @- R" I0 B/ o6 c& E
6 q7 F. m: F. n+ ^8 v3 L
缺点:
) Y' m/ p# p! ~& ?& Z
仅支持MySQL数据库。
8 ~: w" u# i! D% N; i
% s* f+ |: b$ g9 i' R+ A& S
:return SQL
9 x1 o; p& B, W( c1 T9 y( X- c) A
' D1 i" p! m, X
request.parse(
o, t% k4 c' l& x9 ~0 m# I" c$ b
url='https://www.douban.com/group/explore',
- ~/ l! A( C: d K7 o
Parsing = 'xpath',
6 ~& Q" t- c/ x- k+ n) b: s
label = {
+ U9 \7 ?6 S8 j3 g6 s b
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
) k% i( Y$ s9 o4 p0 t0 R o
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
5 g( t5 x: d+ r0 s- p+ O
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
) w' c4 o! {, m [1 J; [) y" E
},
3 E8 }) a1 i1 Q
write='result.pkl',
8 z! K$ K" T; x |9 b
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
9 `/ r% o* Y, K `) m/ F6 ~
page=[True,'url_page.txt'],
4 `( w2 o# O2 P' T2 T3 R* R& B3 W y
clean=True,
" a( K: C9 _- _1 o; e- K
# 字典格式,
& n" z0 ?2 h/ z2 f; H6 ~. S3 L) h
# host可有可无,默认localhost
3 Q2 n3 c6 R7 F8 E6 z' _' o+ U
# post可有可无,默认3306
z9 C: Q+ v" N/ B
# user可有可无,默认root
9 f6 j! t2 a- h% \
# password必要参数,数据库连接密码
5 e* l' a6 }! I3 I7 s# [
# db必要参数,数据库即将存入的库名
% W+ D+ o5 L6 c4 M1 U. `# y
# table必要参数,数据库即将存入的表名
- A0 F" k4 V4 K Q* ]9 c" }) F- R8 o3 B
write_SQL={
9 W8 V* D7 o2 B$ n3 _$ U3 X
'host':'localhost',
! ~# A m: D6 s# a7 W
'post':'3306',
J; r0 l$ [$ h$ N% h
'user':'root',
5 V, ~$ _' h# G
'password':'123456',
2 w1 Z1 j7 j! p- S2 b# i
'db':'example',
5 q, r2 a4 k* H% W/ L7 d4 y
'table':'example'
% A& B1 x# s" X. ?3 \7 W
}
9 X5 `* t8 d2 F+ \2 K
).run()
$ e; c1 H0 D" m3 J0 v1 O
+ e$ l8 }8 E* t" C
第九种玩法:重新启动爬虫
( P3 x) B5 ]! |) W/ p+ L; \
爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。
8 ^8 z* J# y/ k- k/ o
+ }. K* J, h1 ~. S- [6 O; h
特点:
- e. {5 X$ J8 m; ]
检测报错重新启动爬虫
) u0 t0 m2 F8 z
无需手动处理错误信息
) h2 F) v) P: {
8 e- A9 k/ K, c! p
缺点:
`( p2 `* w( b/ H( s
无法收集子线程错误。
/ H* y+ C9 N$ L6 b) G& g% d
1 d1 k5 S' g: Z6 x e
:return None
' h) h: t! C+ Q, ?
# H- c5 n# i- G9 b4 Z# j; H- j
request.parse(
% h1 z) Z+ \7 T1 F
url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
7 X/ w: g2 Z2 H
#login="taobao",
* X: H1 x9 I6 z- w) ]
type_url = "text",
+ Y+ d9 l0 [* b
Parsing = 'xpath',
I% R6 n- \) `) s- D I6 X: |7 o
label = {
* _# c# X+ ]& U" H& Q
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
( p) X, g& m1 \- D
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
, m2 L6 {. l) t1 k7 H( r3 z& r7 v
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
9 P2 p7 ~# {+ O5 F6 t
},
% ^. f8 t8 I& F/ ]! V
write='result.txt',
/ A. a! V/ N7 z. ?# Z! A2 C
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
$ f9 E3 O/ X, m4 S V% ?7 S( U
page=[True,"now_url.txt"],
) {2 c2 Y2 {" h6 y+ w9 G
# texting 参数为是否启用连续爬虫
8 s; q7 I6 V* @: t* {& X" ]
# 爬虫程序异常报错后重新启动爬虫
: P3 p- |0 e4 I0 o6 f# q- T+ o
texting=True,
7 D5 u- D# H4 T3 E' z3 G" i
###
& E1 [1 Z/ x# X9 j+ a+ J
write_SQL={
/ K3 P ~2 d1 _" K2 ?7 x5 M/ v
'host':'localhost',
% Q* B5 h2 w% {1 @
'post':'3306',
$ q6 L/ G8 F3 Y7 n( D
'user':'root',
9 j' s7 ]! q; @* A
'password':'123456',
- y$ e: n' K! U" {* w- J
'db':'example',
: [; S( y$ u- e+ o. a1 _3 p
'table':'example'
0 E4 B8 |1 E7 Y) Q( \5 |0 \
}
* B! U7 a8 z% B! V; L0 ]" O
).run()
1 d7 p2 Z3 I1 a
* w: z- S, X- c* x, e# \5 h8 g! l
第十种玩法:多线程爬虫
6 x' A. {; M4 O3 b
特点:
3 N) o, C2 @7 r' F' M! ^# L9 R
爬虫速度加快,
y( e& y9 _7 d0 \' M; R
更好的利用了线程。
1 Y+ I; x: J1 _8 L9 U' a' R1 [% }
; l& x" S. W- @" e
缺点:暂无
( w. n1 w+ n0 h# a0 B; P6 j- H" i
' C S/ a+ U: u0 M4 z5 J9 p+ q8 h2 G
:return None
1 `7 N1 o% g: e! i) L
3 \% ^ t; e/ G9 @: z" M
request.parse(
. {( i5 E( ~( j2 A: q7 |8 E
url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
" Q- l; d5 O' b6 G0 p7 L
#login="taobao",
, }* y9 t r' l3 c
type_url = "text",
5 O2 w7 C U% Q: X3 x. e3 C6 f
Parsing = 'xpath',
b2 X/ C$ X0 B$ h E
label = {
5 }5 ~7 q8 M8 I: T# a$ l# K
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
5 z" h* L3 D% |7 w
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
7 @/ \( i4 b! c; j# e5 ^
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
0 M& T: k& ]! {+ n* y* Y) a& M
},
* {9 D% V# |& i+ a' L( y+ M
write='result.txt',
' t* |) M2 j0 j9 b% p
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
( D6 ^+ N! o4 P ?. q) N L$ ]
page=[True,"now_url.txt"],
/ U2 V+ U9 l* g! N" `
#clean=True,
' j! G% O, M9 y
texting=True,
+ l2 B. v9 b) D% g! x0 D; b
# status="threads" 启用多线程爬虫
4 M) u- U2 o0 H; ]$ f: h8 {
# Thread_num 为线程数目,默认为1 单线程
' m( \% _1 ~* D; T- n+ c
status="threads",
' ]# f2 }$ b( p% f
Thread_num=3,
( y. Y" S" Z6 K8 ?% P7 a% D) T# n
###
! D' Z h& {; K: V4 u$ m" ^
write_SQL={
9 s8 }5 a8 f, H, N1 P$ H, T3 u$ k
'host':'localhost',
" E |$ e! w+ U3 h9 q
'post':'3306',
( L0 K: A! `$ m" I+ B; }
'user':'root',
# Q. g1 Q" R& T/ E
'password':'123456',
+ \9 I( T4 P. F6 b" R
'db':'example',
+ r3 Q# C% t. J8 Q( ]
'table':'example'
# L5 d2 s0 q1 l+ l2 K# |0 s
}
6 B' y) F& w5 F& k1 m! U
).run()
/ U$ ~4 r. A9 P7 { Z4 S2 N
2 i2 c) }# u. {6 o: r3 y
第十一种玩法:多进程爬虫
, x1 S: T; M, ?
特点:
1 [. S* B2 E! e: q6 L
爬虫速度加快,
4 V% v: r1 V, E9 c
更好的利用了进程。
$ Q& r, O# P- j! l/ n! v. q% x
, X2 R* e' j! S
缺点:暂无
5 l& C! X7 y( [5 X
9 f( P' _! {$ z! {+ Z* v" L
:return None
8 X+ \0 k- S" V9 i4 I9 D, w
1 _! a) {1 ^! { E* v$ n* F- E
from simple_crawl import request
5 `, E( e3 Y7 z7 n& l
request.parse(
8 z: O1 V) _0 V$ H; E; O2 b! o: H
url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
% P* \0 }& t& ^2 n! Z! h
#login="taobao",
0 U) E# A/ |& `5 s Q/ |- T
type_url = "text",
- }1 h) P8 N/ j$ D+ {) q9 f
Parsing = 'xpath',
% H( U" t; a1 ]# C7 C
label = {
# k7 T' B c( b% X- t
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
3 G, }, @0 d' D9 R
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
7 N, ]6 N% Q/ t( H- A5 n* v5 [
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
& B7 Z' e" a: R
},
: H" z6 F1 M8 u7 g; U/ F% D8 w
write='result.txt',
7 [/ O a; ?* T* F
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
; K% z" r' A1 r/ F
page=[True,"now_url.txt"],
- q$ M# b' q$ f( l( t
#clean=True,
3 r" {6 U* A. X
texting=True,
, R( H1 H8 m0 S9 F8 e p% E
# status="multiprocessing" 启用多进程爬虫
/ X1 e! S9 D$ |
# cpu_count 为启动代码核心数,默认为系统核数一半
+ b$ \, P: n5 g/ }0 r
status="multiprocessing",
! Y+ j: E2 n! p1 |
cpu_count=2,
+ O% ~) Z" L9 K$ ^3 h- A2 \! w& n
###
_( s- [& v& v& S2 V
write_SQL={
7 p) S9 Q9 l' ?' l7 o
'host':'localhost',
/ {1 D4 `' c ?0 B! F
'post':'3306',
1 N( ]; c% c+ B5 l+ @/ t+ N! X9 D
'user':'root',
" |; R, [" i: c' }
'password':'123456',
. v+ c T1 x: z$ ~$ k( l; Y) f
'db':'example',
! J1 d2 M5 o) l+ n& d/ L& K
'table':'example'
6 O% {( i. f6 L0 q) B
}
9 d9 b, I2 I: f$ t
).run()
7 M+ j$ E2 W- m+ }
- n" o) z( t5 f0 l/ o5 \
第十二种玩法:异步多线程爬虫
/ n& F" {# `5 N
特点:
6 u9 z4 ] s t8 ^! K
爬虫速度加快,
) b3 b w) h) `* K" X$ A
异步使得爬虫无等待时间,
/ ?0 v/ ]* Y, |- |& I
同时使用多线程速度明显加快。
G/ d, i$ K$ |# n b; D
& g& K+ ^2 M! [# i l' r
缺点:暂无
7 O# E* p# j/ F) ]( n
: U7 l, P2 c; [+ u$ N$ z1 N- T/ c$ w
:return None
7 H- f4 [' K3 K& z2 V
4 M; {" R) q/ U) G7 L/ w4 U
from simple_crawl import request
6 R* J& |4 n3 S" o! M
request.parse(
6 g$ ` K* |) @! H" g, H! @, K+ o
url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
0 s! H! }0 |; }7 a
#login="taobao",
8 u& m" B, J5 l
type_url = "text",
0 z% g: |+ a; T @
Parsing = 'xpath',
! D$ L$ M: v4 W; D2 d: }: U& D
label = {
4 e: ~# t1 V1 p! j+ j
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
7 F9 d3 C8 \- i& A0 g0 ~
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
2 q# e: D# z* c1 q# L
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
6 h: _3 g2 L4 a6 B: Z0 ^
},
% h; Y" ?$ b5 m3 X' Z
write='result.txt',
+ h* ~+ ~# ?5 p( P1 u# q
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
/ S- c& u2 n3 B. q' l- j0 _
page=[True,"now_url.txt"],
. M7 H% S C# H ~) v* b( k* H
#clean=True,
0 d% } h3 y+ G# }
texting=True,
, k+ ^& Q# t4 S+ h. X7 Q1 |! x
# sem 参数为异步引擎数目,默认为5
- j: \6 u. {3 U! W: ]
# 其他参数同上
! y: C% R) T% @* f
status="aiohttp",
. r' ~0 N8 x' h7 C& y% \& j; F: ^
Thread_num=3,
D# L' |9 y/ D" ?$ `3 b
sem=5,
/ f5 ?$ f8 C% X
###
6 D% _' r/ ^" P/ P9 Q% J0 C1 a! E7 |
write_SQL={
) ?5 A; s& P" g' Q
'host':'localhost',
3 {" L2 _5 u6 y* n6 v
'post':'3306',
7 ?3 N$ d1 A8 J& K
'user':'root',
- X. i- g# y; L$ U; _& N- r) w+ r
'password':'123456',
& q y( @ [' E* V2 H3 E
'db':'example',
5 K# n w# z% M1 C) D1 F1 Z
'table':'example'
& g# @0 d8 r8 i8 S. K
}
4 j( ~0 } ?) K; W7 b/ C' Z
).run()
# \$ X5 }1 V7 U+ j: e$ S
" `" j% f7 H$ \) @) I. ~/ `3 ]
第十三种玩法:异步多进程爬虫
' b1 d& t7 r' N
特点:
; p4 n% }" I4 @/ k7 V
爬虫速度加快,
, E8 l* i% k% o: v* W3 r
异步使得爬虫无等待时间,
! r8 v8 Z2 m- `+ t: w9 M4 \ E& ?" ?
同时使用多进程速度明显加快。
. f9 J' i7 s5 |5 p, ]) P- P8 [
) U' _3 _) K1 w/ a
缺点:暂无
4 o* N, W, @4 z$ K; p
$ |1 }( r. z& ?7 R1 u7 F
:return None
" }9 ?( f4 P, x/ c
0 l& e, ^- l" x2 r \
from simple_crawl import request
! _3 `+ o9 d1 W' J! J* y4 a! L% {
request.parse(
- C n0 F3 ~4 \3 E
url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
7 Q0 B& W# L+ `7 O; t
#login="taobao",
' x% b, |6 S' V( n
type_url = "text",
# X+ v$ u0 Q0 h, f
Parsing = 'xpath',
, B. s8 ^. K$ U$ W
label = {
8 ^! `2 o- @ ^0 ~6 X
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
7 |- W( y5 ^# ^8 x
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
8 E+ U: Y: n* a8 u6 m
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
+ S h8 J; B2 P% {( Z2 g
},
0 Q8 U5 F* |& T: t+ [9 ]' e
write='result.txt',
$ f" }# f/ P8 V& n2 x9 |& E4 U
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
* u/ I5 C+ r% F4 a& |
page=[True,"now_url.txt"],
v/ ]& b( a2 T& _( H" z, s
#clean=True,
5 u- v) }. k' W: W4 I2 I/ O2 K m: ^
texting=True,
$ h# r8 j. f% v) Z( \
# 参数如上
' z' l1 [) y" k
status="between",
/ s* c- t$ f' U' U x
cpu_count=1,
4 |- [+ C6 ~, @! {, v* l
sem=5,
$ K) R0 A9 N7 F" m
###
" q3 I! A) `, [) h( T, [% v* u
write_SQL={
8 d+ T# \( V# `' S7 p k
'host':'localhost',
9 Z$ C. y; c/ O
'post':'3306',
9 d6 |# n) E7 n! ]
'user':'root',
$ g9 C1 h D! N% C b* r
'password':'123456',
( I2 w( `! _/ ^
'db':'example',
! U# q1 ^: d8 g, B
'table':'example'
+ C" N- q4 z! u8 W$ a3 [
}
! ~, |4 a% Y( H% l
).run()
- U9 Y2 G ?6 N3 l9 Z8 u: A4 l5 }
8 Z- _4 \1 t( {8 C
2 E- l2 P% _9 ~
功能介绍完毕🤞
# W9 f* Q' `! i# w/ H
最后还是希望你们能给我点一波小小的关注。
. e1 i" | X) ?$ j# U4 d
奉上自己诚挚的爱心💖
7 M! ?4 o2 e! G( g
————————————————
, @3 |/ E' z8 J" @ z& v' F# Z: J
版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
7 v. u: c3 V0 W2 a( k2 {: R
原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684
" c/ }! j. I+ J
8 c/ S& U z# j4 B) ^( T9 x& x
" f2 e- ^3 j3 `9 e; F& j
作者:
738391227
时间:
2022-2-19 15:34
66666666666666666666666666666
* z/ F8 n( A3 s7 b% ^4 g& C
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5