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