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