数学建模社区-数学中国

标题: Python爬虫仅需一行代码----crawl第三方库 [打印本页]

作者: zhangtt123    时间: 2020-6-2 16:00
标题: Python爬虫仅需一行代码----crawl第三方库
仅需一行代码写爬虫–simple_crawl
4 [" C% b& h' d/ Y% O2 K: Bsimple_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 参数默认localhost7 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:协程信号量,控制协程数,防止爬的过快,默认为51 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 True6 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" @) Pfrom 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' f4 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" q5 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+ ODecryptLogin库中文文档: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 session7 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" X9 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_results9 w$ P6 C2 @9 v. V4 f! y0 e

6 F. M' l: L- u6 W: p9 z% erequest.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 zrequest.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 file3 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( s3 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) krequest.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 F1 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* s3 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) `  {) }) w9 N7 {2 b; `0 m" k2 Z# z  a
from simple_crawl import request
  W; L% o# {1 z  _6 u5 C0 `: grequest.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; @' Mfrom 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" l5 R% n  ?& s# N5 ^  {
from simple_crawl import request
6 R  r2 A( d: I7 Zrequest.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/1060056842 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
666666666666666666666666666661 c" b0 J- h3 t5 c





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5