QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5471|回复: 1
打印 上一主题 下一主题

[个人总经验] Python爬虫仅需一行代码----crawl第三方库

[复制链接]
字体大小: 正常 放大

326

主题

32

听众

1万

积分

  • TA的每日心情
    慵懒
    2020-7-12 09:52
  • 签到天数: 116 天

    [LV.6]常住居民II

    管理员

    群组2018教师培训(呼和浩

    群组2017-05-04 量化投资实

    群组2017“草原杯”夏令营

    群组2018美赛冲刺培训

    群组2017 田老师国赛冲刺课

    跳转到指定楼层
    1#
    发表于 2020-6-2 16:00 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    仅需一行代码写爬虫–simple_crawl! ?& |7 F% O8 z) E2 w5 I
    simple_crawl
    . S$ @3 }. S" |, W+ R仅需一行代码即可达到爬虫效果
    1 t- N3 H1 r- j项目地址(欢迎star):https://github.com/Amiee-well/crawl3 ]  b- u" p& l6 Y' j6 Q+ Q
    使用方法; K# i; @9 w& S/ M. R5 T! K; j
    pip install simple_crawl5 N$ g& d- b. |

    $ n6 w% J+ A# b4 H4 o8 p% k  U### 以下源代码为简单介绍,详细功能介绍再源代码之下! Y+ p( ?  _& V% Y* {4 a/ S2 M
    from simple_crawl import request
    / q, D( S4 u* a( x" C& D3 c" xrequest.parse(9 T8 E# N' X; G8 ~* w
            # status 参数为运行状态,支持单线程多线程多进程协程以及联合
    8 u' K* ]9 g, |: K% E- o* |        status="aiohttp",
    ) _& S( C* k5 f9 Q        # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式+ c% S% O0 c7 {( W0 {! ^
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],9 B* P( X8 I( g0 A0 {9 r; h
            # login 参数为获取登陆信息,如淘宝等网址需要登陆信息  \1 U  v9 R. X* ]/ p# I
        #login="taobao",
    6 G% E$ F4 ]$ R& R; {9 v) H    # type_url 参数为返回源代码格式,支持text和json,默认返回text
    6 w7 x' _2 u- u' c6 I8 @. C; O    type_url = "text"," i3 v( D8 \0 k3 J
        # Parsing 参数为解析方法,支持re、xpath和beautifulsoup& V# k1 o9 I9 Y2 U+ w
        Parsing = 'xpath',
    7 e, p: o: U* I    # label 参数为爬虫解析过程,字典格式,详情见下方; u" [# N" ]2 c2 ?3 U8 r
        label = {
    - t  U0 `( d# E  {            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],, C' H$ R) c* Y1 U
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    / t% t5 W6 w7 v3 ^            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ' z  L. `6 |* E% O  C7 F2 n     },
    + ~+ r; y3 J2 U6 u# h     # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱
    : W0 g+ H6 O1 T' @5 \9 f) f- H  s6 }     write='result.txt',
    . J; E* ~) E" Z6 y& O+ p7 O/ e: \2 z     # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫. i+ }! p+ a) N( l2 m. ^
         next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',& W' Z5 `& S3 |* Q6 f3 y# [7 }
         # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫
    7 a$ q# D7 R- M- |8 G     page=[True,"now_url.txt"],
    + u+ v+ J5 s$ d1 w; G$ J8 [: A     # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息
    ) g) o; f0 P: I8 x8 Q3 Y     #clean=True,
    % o, P6 M4 s9 q! D5 @  y& o$ _& h     # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序
    4 q' _2 W3 T! ^- G0 N, c4 o8 j     texting=True,9 P( O! t4 d! [5 z
         # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态2 m/ H- P6 R) {6 M0 Y; X' B* ?
         Thread_num=3,
    : l/ Z8 F) }( q. q4 }& g/ o  R     # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态
    7 D2 `8 F2 F' t# G6 W     cpu_count=1,
    4 \5 s  q2 S  x+ g( Z. m3 }9 E$ t; R     # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态) b# ]3 k7 M/ K; S
         sem=5,
    2 d; T. S: u: Y: h6 m, S     # write_SQL 为是否写入数据库,默认否' ~# W6 I$ |3 g( w
         # host 参数默认localhost
    0 ^: G3 z+ L- [( c6 h9 \% l     # post 参数默认3306
    + ]6 J5 J$ [) h/ K     # user 参数默认root8 f, G5 E" B5 v; C# l* k% }. P& ]
         # password 参数必填,必须正确
    - c3 }# C% M& w/ O; U! o1 p# w     # db 参数为即将存入的数据库名,若不存在自动创建
    7 r: N  F6 q2 w& F6 ]/ ]. F) |     # table 参数为即将存入的数据表名,若不存在自动创建# g/ g/ {2 k; s
         write_SQL={
    . w4 T% _% _9 \         'host':'localhost',/ T- y- K8 z0 \0 \' Z, v+ Q5 [; J
             'post':'3306',: C, v; A$ Q- L: W0 U  v4 T
             'user':'root',
      n4 G7 U. R) t9 }/ X$ y4 @         'password':'123456',7 f7 H2 b% Y) h, T
             'db':'example',
    1 G0 U8 W4 x- Q* e9 X         'table':'example'
    $ X; H& j+ w; P. u0 w' k      }
    # C3 t8 }" p$ \/ v).run()
    3 F, ]* ]- c4 G* |& s
    0 K4 o- a: c: r  g/ B6 [& H! i介绍一下crawl参数设置:
    0 d. Q( E  R+ S4 g
    3 |) L# `4 Q& n'''' i  x$ x% q1 c9 ]& a5 b
    单行代码爬虫程序执行
    / q+ {0 {+ `' ~:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档
    ' I8 b- h* S) i5 s$ O- m2 ~8 O) a+ {% n:param url:即将请求的url地址,仅支持get请求6 p% d! [+ C3 |0 {# z# q9 W
    :param type_url:请求url后返回格式,支持text和json格式返回9 ?  T' q$ ^+ B5 E+ g  X: C+ Q
    :param Thread_num:即将启动多线程个数,默认为1单线程6 L9 Z! D) X$ P& p- ^
    :param sem:协程信号量,控制协程数,防止爬的过快,默认为5
    2 t$ }2 t3 `/ ^# l  h* m6 G  [:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半
    3 M! k  h5 c8 z& p1 u:param login:模拟网站登陆,保存登陆信息$ a0 J0 K3 M% E5 J
    :param Parsing:爬虫方式,支持re、xpath以及bs4方法
    3 O" N8 ~" f6 R) I4 I- u& l:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,) [' q) w" x' [9 ?! c/ |7 c* j5 \
                           多次报错结束程序,默认否
    * ~8 u$ m8 l, u1 \' |0 H2 i:param label:选择器内容,字典格式保存,7 f4 m. [' P% b" Z
                         字典值为列表格式,第一个参数为选择器,第二个参数为转换类型
    ! Y' J6 f3 J" `# l                     第一个参数必填,第二个参数默认str类型
    3 L. Y- h: O5 R+ @  H& S2 |; _:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否# x6 a6 V0 c, I+ `  @& X( ~, C; e
    :param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫/ q; K5 Y( [; i# l& o9 J1 i
    :param page:是否选择断续笔记接手下次爬虫处理,默认否
    6 d" V* i1 d  k( c( Y:param clean:是否进行简单类型数据清洗,默认否1 ?3 J# T2 s2 q1 K  `/ `
    :param write_sql:是否写入数据库,默认否1 ^) j: w% d) p5 V  y
                             'host'默认为'localhost','post'默认'3306','user'默认'root',9 b& n& W& K  v; \* W
                             'password':'密码','db':'数据库','table':'数据表',
    , D, E4 c9 E2 m3 i0 S* ~6 [6 I                         检测库是否存在,若不存在则创建,若存在则直接插入,
    $ i9 Q- Q; t7 K                         检测表是否存在,若不存在则创建,若存在则直接插入2 h& Y" ?2 D! g: `# R
    :return True
    # t$ i+ X4 ]  S1 q'''  r% d# o) N" j  R+ T
    介绍玩法3 x: Z2 e7 S+ h8 e4 g, g
    接下来介绍的均为调用第三方库的情况下运行:
    ) [2 G- W( |0 h5 O+ J9 o6 e0 B; g# h* q( V* F
    from simple_crawl import request
      h5 G: K1 P7 H0 e7 I第一种玩法:输出源代码
    . c8 x3 h/ {/ E( F  g2 r0 \- I调用requests库进行源代码请求。
    " \! ]3 o1 W( }* v0 r2 ?/ |/ X  T, \6 e2 V( I. l
    特点:
    $ [. D: D$ I$ l) N5 b' b请求失败则调用ip池处理重新请求访问,, w& @& j. i0 Y, ]( |- ?5 ^; \6 S
    出现五次失败默认网址输入错误。
    : B3 Z" ]* i5 x" E支持text以及json字符串返回。默认text。7 @* U0 T, n$ Q; u

    3 A* Z- b7 H4 S' s缺点:- K' ~! d7 K5 `7 ^) E6 b8 \, r
    暂时只能进行get请求,不支持post访问
    ) T6 h/ b- V* A  c3 R6 M1 l8 j. E/ G! b7 ?8 C1 k
    :return text or json' s, [0 ]+ ^3 [. W/ C

    4 `/ j' }9 l. Z' @  {request.parse(
    1 G; n$ g1 D5 t0 u! R1 C# L" W        url = "https://www.douban.com/group/explore",
    - Q1 `0 x: j5 N8 ^/ r, L        type_url = "text"& z8 d, ?& @$ T6 {5 r* U4 Y( b% V2 v9 ~
    ).run(); V7 H/ a, o" Z& t3 J4 e) k* D
    # return text8 W1 F6 i3 l: v( @* d& n

    / a1 M7 j- \6 C* W# B" I第二种玩法:模拟网站登陆并保存信息
    ) D' J& U5 d' [2 B( z, `, q调用DecryptLogin库请求登陆访问。5 G) `" I% O' e% s0 b+ a1 |9 @
    4 k' `/ R. |9 f9 ~% `* r
    ps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源; L5 S, i1 l2 ?
    在此放出文档地址+ Z5 a- g- I& c, L
    DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/" u' {  V4 D, f# B- f5 N. u% S1 T/ S9 R
    3 H8 P4 S, c9 l) R  j# ]) J
    特点:$ s- J  M* L! k8 E6 ]/ k
    将DecryptLogin库中二维码继承到此库(非二次开发)
    ( M9 A2 F2 B6 s* \" A6 {/ C% w* y1 A支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)0 {& v$ ~9 N! E/ i) m* u+ g7 v% _
    保存session.pkl信息到本地方便下次登陆运行
    / I$ ^3 w; t% y( C/ \( R2 V$ G  Y5 l6 k0 x8 ^' u: j
    缺点:
    ; D" h3 r  {) ]; G) I! L/ gsession.pkl登陆信息过时无法自动删除。% C3 K4 [2 o- [- I# c
    导致下次登陆疑似cookie无法正常登陆。
    , T! z, x$ t9 Y: m2 m
    + c3 Q+ P$ e4 C$ ^# _1 W:return session8 U( `" p- M3 B0 E

    0 p% r2 T/ v7 y* A2 ^, c) Orequest.parse(, V! t3 O$ H( |6 D
            # 臭不要脸的推广一下我的店铺
    $ j7 P6 O4 ^1 S8 p, j( ~0 @        url="https://shop574805287.taobao.com/",
    ; K4 G# N/ }9 Z/ U) T0 T2 n. R        login="taobao"; J& `+ ^1 o" v2 d6 s, W
    ).run()3 o+ H/ X; T, u% F5 r
    # return text
    9 K  y1 L9 f1 ?- F9 D7 Z2 L6 R8 G- e: R1 a( v4 E' ^" x, X$ G; C
    第三种玩法:爬取网站信息
    # r3 @3 i  E3 G5 a: i爬虫库自然少不了爬虫的过程
    " l, ^. N6 w8 l3 _! a; v; l% G+ P) p5 P1 H
    特点:
    ( G' E/ @8 T; n1 C支持re库,xpath解析以及bs4选择器。
    6 |9 C& M) J+ ?+ d$ r/ X) {4 v爬取方法为字典格式。单方面输出。
    / z7 D7 X( E0 z8 t0 i2 N1 m字典键为保存的字段名称。
    1 B/ k9 @. o: o字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。: }% i0 ~5 w- N) V  E2 c

    ; \+ Q" A) N! l; w- P缺点:暂无(等待小伙伴们发现)
      g/ D' |/ P3 h; D9 d9 r
    - j* _, Y( d+ c! n! l:return reptile_results; ~' F+ t' g' F6 @& [) Y, O, D

    # L! Y2 @9 P' C% A4 Q8 irequest.parse(
    % [9 r9 A' R3 u, ~        url='https://www.douban.com/group/explore',
    4 q1 h! c7 D. _$ n. `2 K        # 字符串格式,选择器方法。: ^$ v$ Y2 k# f3 C+ b
        Parsing = 'xpath',
      z1 |- [4 W  @4 a( B: i# J    # 字典格式,参数如上。
    ' K; w$ }# g$ e. Q: x+ W- A    label = {" g( s( |6 I; {' \; j: Y. m
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    9 Y$ @& q5 }% ~7 {5 Q3 a- }7 ~) o( F        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],* M# v- w3 Q3 m* \
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]8 p+ x5 z8 U# F1 s  \2 }) ^+ x' |% d
            }. D6 ]6 i% Y2 Z) X. f) k$ n0 G
    ).run()
    " z% w2 V1 I. N& o# return reptile_results(list)' l: b: U6 u5 G; t' h9 Y
    9 g* v# _& [% B* P9 l5 J3 b8 z' z
    第四种玩法:自由保存信息
    : ~: G' E5 `. u: P4 t* I) A目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。
    / O2 `. W$ A$ v; q2 H4 z& `
    ) L; W6 M" s7 ~3 q9 G* }特点:
    " W8 v4 _6 }" w/ T- h写入文件均为数据格式传入文件。$ r8 ~! Q' W7 Y7 R4 V  f8 j$ H
    且输入格式规范方便阅读and省事。. c" _  E. y: J

    ) n6 \9 ~! b4 Y! V  Z' u1 e2 K缺点:
    . h) b! |2 X" d" F5 l保存格式仅四种,% o' x3 [8 E* n( k9 c
    不方便用户之后读写操作。) v2 L* [% R# f+ t8 @! y- j

    , i: f. W- O# o% D: L' c:return file
    " ~: C" E: S& F, i' Q7 X. W2 E' L9 o
    / M8 A( g/ G, J5 Z! b. Frequest.parse(% F; `2 W! Q, a3 X. o8 E
            url='https://www.douban.com/group/explore',
    6 ^" _# U  W3 |3 b. r5 Z    Parsing = 'xpath',
    . w+ e. r9 C% a9 Y- z    label = {
    ) w: N$ k5 x' D# R, @0 l0 d        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],8 `; n8 y2 s) r4 k$ g5 {6 }  s
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    # K! s; b5 L( I' a& Y        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    4 e/ C' w. t8 U: v+ v: E! D2 k        },- U( \% l' o$ e8 ^% G( A
        # 字符串格式,具体保存位置填写
    " u- x0 k  i& T% `0 N% h' G5 X    write='result.pkl': |3 K, L" T% [0 D% A. q
    ).run()' |) {2 ^8 J. _' B
    # return file
    % q( r- A$ E; a9 z" F/ C, N
    . R$ v( g- }9 b9 B7 ~2 e& {5 A2 _第五种玩法:读取下一页 url 地址继续爬虫
    4 e" @" c. ]9 X这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~  V3 i% V/ b8 N. W0 A4 d  ^6 C

      y) e! d4 Q1 |, b特点:
    7 z3 p" ~; ~$ c继承之前的Parsing参数选择器选择方法。3 M! ]% b; ~3 B0 l
    在这里可读取到解析后的下一页 url 网址。
    . L, O  A# t: G# F+ b* C9 S方可继续进行爬虫处理。方便用户使用。' G7 W! a7 [0 L- E

    9 a" I3 C& w& J0 |9 N# }缺点:* y6 o7 P9 ^; g3 w  _% q
    若爬虫时下一页 url 地址改变,便结束爬虫。' x- B  z) I5 {" X$ J) N' [' p
    只能爬取所给 url 地址中的信息。% c/ u4 {  H! h; ~$ J& S$ s
    无法进行某一界面的多个网页爬取返回。$ a, u& O7 ~. I1 T9 F. D/ i2 B
    造成访问页面单一流失。
    9 o' z9 o4 V7 U* `2 W
    , b6 q' L6 Y( u6 X" K:return None
    2 f$ _  J0 V# z4 z1 m4 Q/ [* N
    4 J! l; X1 o, N. E' |+ [request.parse(
    . ?8 r- M9 G' e5 _        url='https://www.douban.com/group/explore',
    * B6 q  C$ s4 a  C' j- |8 C    Parsing = 'xpath',4 x' D4 M* ?, h6 x
        label = {
    ( \+ ~: M' k( Y% l* r        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],. v$ e9 _- C& t6 T9 _1 _$ [: z
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],- m8 F+ @5 G: Q1 ?
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    % L3 ~% g8 ]- o: k1 j% v        },5 @' u4 P$ }" S4 o
        write='result.pkl',) J3 u* L* [, ^$ K! P2 l$ V. J) }
        # 字符串格式,根据Parsing方法继续请求下一页a中href
    " k3 U4 j' A- i+ W; M    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    / \! n, c1 i- [2 Y& m).run()- D4 C9 ?' F. `* |9 t! l+ \
    # return None
    3 V  V( H7 Q1 x9 b5 N/ b7 J
    & ^1 C' Y8 {' I* h" `3 c$ _5 m第六种玩法:爬虫网页保存9 q( p$ @- m8 x( D
    听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!
    , j/ ~: I# A" K" A4 \) E
    0 X8 _1 N; \. s0 J+ l特点:
    # D+ n6 V! G3 s  r, }持续输出断续笔记。/ j  i" \8 s; A
    将此次爬虫的 url 地址保存到一个文本文档内部。
    6 {$ G, ?+ z6 ?& T) S, u, {下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。
    8 t. Q" p2 q# B* d3 Q" z" m
    & }; b# G' F+ p' [8 d缺点:, `2 M( J, e# A9 ?& d5 Z
    读取内容不单一。
    7 u+ S- e6 v, D导致下次爬虫无法正确读取上次爬虫留下的痕迹。
    , f* g- g, [' d/ o3 L6 A8 u& a: t0 d1 q, ^. r+ l8 S5 ?
    :return url_file9 _' V' T6 M, l0 ]; L' a9 l7 `/ u$ w
    6 T# M7 r5 G# e/ v: d
    request.parse(# b, g' U. ~9 b
        url='https://www.douban.com/group/explore',$ `" f3 u( `7 D' c6 p. S2 ]* U
        type_url='text',
    ' k$ q2 f) z$ e0 L    #login='taobao',( t$ |! B# E( s* {
        Parsing = 'xpath',3 `% w  z2 Y% E# n% @: x& ^; ^
        label = {3 ]1 S9 H  w. Y2 M  f
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],; W2 i& L) B2 f
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],5 P& A1 K2 T( E
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    1 w& L( f0 {. b4 A! e; L) d) ?        },
    1 N6 {. ^; L2 `6 r    write='result.pkl',
    * N' v- {3 Y6 [; g1 l    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',! ^! |6 y5 n/ @
        # 第一个参数为是否需要断续笔记。
    2 Y  {4 b3 t% @" S( P    # 第二个参数为断续笔记保存位置。
    $ D; ?; c: t9 N    page=[True,'url_page.txt']
    : k+ w. y2 ~  ?3 q) O5 A1 A).run()' {6 l# G5 ], z% l' j
    # return url_file0 q( U5 X/ ^) ~1 p
    3 _8 H* F: e& b' v: K0 Q: _( r
    第七种玩法:简单数据清洗
      Y" a5 Q* n4 b; M4 X. b, [7 \数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。# v6 r6 Y- ^- `+ F

    ( V: d/ `' u3 U- k特点:* c, Z) T  B: C; ^: d
    本人曾写过一个底层数据清洗。' V" g6 [$ J2 a( N
    能将列表格式数据进行归分清洗。
    ! L7 ], w: [/ a9 {: M主要内容请参考另一篇文章
    2 e( ^& h. r+ T& }0 D9 w% y如下连接:数据清洗; y- s9 c( c& h' N7 D, F8 e8 M2 T

    , e3 A) X* s) P6 y* r缺点:/ X2 x, i1 N5 _$ L( ]9 B
    数据清洗格式简单。5 [9 X8 B' k  H5 @/ _+ T
    数据清洗内容单一。- y4 y; |# W9 H. I: H7 a
    无法完全做到绝对清洗。9 I1 {! l. P6 W. c% G5 X
    有待改善。
    6 M1 v, C2 \% v) a- u
    , c! H, _0 \1 G:return keyword_list, value_list
    7 {* m/ Y! e, p% Z! w. s* _3 @+ q" ^" V" F- V: e3 O, c
    request.parse(
    3 Q. G$ a% J. }; B: Q4 \    url='https://www.douban.com/group/explore',5 n! t: x/ J9 s9 s$ ]( n
        Parsing = 'xpath',0 P: h! ]$ X6 p/ Z3 B
        label = {
    . ^# a6 u) ^! ]2 ~2 S+ ~        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    9 ]9 ~# S" G" J7 S% m( }        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],7 H1 L% W7 j2 B
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]" X' q2 t7 M! W0 d, D* e" ]+ \" W
            },2 g4 l( w) I/ j; C0 N6 L  T9 |
        write='result.pkl',
    ; V. U7 V! K* |8 i6 `+ z$ K  L' R    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',1 g- P) m8 b, X$ h7 A& Z
        page=[True,'url_page.txt'],
    , Z# |# q/ v. P2 Q% R  I0 i8 e    # bool类型,默认不清洗4 R: N  }. B+ x/ v# N1 A  L
        clean=True
    / P+ V( k6 A, ?# X/ n).run(); ?( X1 o1 p. ~5 _# z
    , o( [8 ?( i  O' `; ?$ X
    第八种玩法:爬虫存入数据库2 v: j! k& k2 W
    存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。
    6 w, p* [3 I7 L# c4 ^( I9 [
    1 e+ z9 U4 S. ]$ \7 I; Z特点:6 l+ w/ ~0 ?# P# W7 g
    信息存入MySQL数据库。% Z( p$ ~3 |. ^- H+ x8 e2 E; W
    可连接docker远程数据库。2 V: C' j  N: m) c" v3 D* A5 [) W" p
    数据库的库名可以不存在。
    $ F0 Q. K9 `# y/ D, _数据库的表名可以不存在。
    ; W" n' T3 G7 p3 n' D: a根据之前传入字典键与值参数判断表类型。
    : T2 Y  w$ e0 W# q0 D- u( K5 N自由建立数据表传入信息。
    : P' V* i& }& E% y& K+ s9 @0 A! K+ ~4 R3 v0 {
    缺点:) d' K7 F* q. @* p* G* U
    仅支持MySQL数据库。
    5 g0 E) q. ^2 P5 z2 P
    6 e  ?' H* T) p  [7 Z8 l6 d:return SQL
    + l5 q+ g0 }( N% K3 K% z
    ; B/ y1 P/ j/ N  S5 wrequest.parse(7 N/ R( ~& F8 p" l3 K: K
        url='https://www.douban.com/group/explore',( j/ @* p3 ?/ p. u5 X0 n" g
        Parsing = 'xpath',. G  Q" ^+ ]5 Y. A& \) k2 q
        label = {
    9 N8 @5 E1 E! n# Z. N3 r6 O        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],9 `4 {3 R3 @* D& A. W1 U3 G' i1 m
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],5 M0 Z+ e5 D; C7 s3 I) L" q
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]1 `+ K7 O$ T0 s9 @
            },4 ^' @* ]+ S: P7 j3 ^( M
        write='result.pkl',
    $ L  Q. q1 |2 c' O    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',: x; e1 f/ _3 I/ V
        page=[True,'url_page.txt'],4 L+ @% ~. n# x/ L
        clean=True,
    $ r! L9 J7 a6 s- }% v5 x    # 字典格式,6 t  `% f7 z6 n
        # host可有可无,默认localhost
    * |. K. g$ V. x7 p& y    # post可有可无,默认3306; [. H. M$ p4 f, n. L1 ?/ Q
        # user可有可无,默认root
    & ^3 g5 I! Z: ]7 O  P) r5 M    # password必要参数,数据库连接密码
    + ~2 q0 W+ Y8 c! f: O9 v    # db必要参数,数据库即将存入的库名
    ' i1 s: H. \1 [: L& a    # table必要参数,数据库即将存入的表名
    # p7 y3 w: \0 V% t. P! C4 y& d    write_SQL={8 p- |% i/ H7 b
            'host':'localhost',
    . ]1 R0 s! L1 j$ h1 v& H! }( T        'post':'3306',
    : G( _8 p5 y- X6 X2 |        'user':'root',
    5 {( \  D& W2 V: f        'password':'123456',
    5 B" p2 R/ q  m- ~6 O        'db':'example',. n# g3 r) r/ u3 \4 m: V3 a
            'table':'example'
    * D$ |, q+ |/ z$ I- G        }
    1 F1 U; k: M6 Q! N    ).run()  F& [: q$ d6 U8 f

    2 B$ l! v% a* M6 B  h第九种玩法:重新启动爬虫
    - Z! u. {# z7 |爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。
    4 K7 I* I8 \/ G) d, S0 n, R+ n" U- }- L) B# \4 @6 s+ D1 w
    特点:( d, I. t6 v' s( P1 e
    检测报错重新启动爬虫& g* u. n( }- W0 @1 G
    无需手动处理错误信息
    3 P# {8 [" }! J2 B# k/ L! x9 O# m$ e$ j+ q# u) L' C5 u3 O
    缺点:' _& E! h* w  q" c) ~. h
    无法收集子线程错误。
    , K" a7 n6 S) n9 H! d
    ' k6 h9 D5 T" Z6 ]:return None
    ) ^' i& m7 g  ?  @# j: [4 f- Q4 f; b3 W/ x" `
    request.parse(
    * V4 T! R2 L4 B0 ]* y1 o        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],* b2 r) c7 z+ v1 D  T
            #login="taobao",. p/ V; l" H3 e! g6 T7 p
            type_url = "text",* G2 j: z9 t' n. B8 x# g
            Parsing = 'xpath',
      |5 ?1 o; I- M9 [9 x1 \        label = {% M( {: [1 j5 B2 `
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    6 O5 O3 t* j1 m            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    # k# B. D8 n; s. X            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]5 Y. D& ?7 _3 ~9 b% e
                },0 U6 Y: i. ]: c# ]* ?
            write='result.txt',
      |8 [/ N) z3 a8 |" @        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',2 _3 v% m& c6 B! m+ H% O9 A
            page=[True,"now_url.txt"],
    % f+ @( I. E2 e+ j$ v. _        # texting 参数为是否启用连续爬虫9 E& s/ U; @9 r( V# j* n, f
            # 爬虫程序异常报错后重新启动爬虫. P# X7 H) k7 c% m' G. f
            texting=True,0 w7 ]0 I) h+ V; l
            ###
    7 X% t7 G, w  k! Q% M0 r( r) e        write_SQL={
    $ V. w/ e4 a- G/ u- e. u            'host':'localhost',
    5 }0 B- `; T( n( J$ O            'post':'3306',, w' S2 q& j0 \4 v5 O
                'user':'root',& G& a1 g) Z- J8 v
                'password':'123456',
    7 i" @; |) A% y4 y5 g& W            'db':'example',5 o. {% e8 }9 J7 q$ c* ]4 v
                'table':'example'
    " z' \2 N& J  {( U7 I' C& k            }3 f! ^/ b2 \1 j6 _& v
    ).run()
    $ ^8 ], D: S3 ^* S- c4 g7 \! V4 K* Z6 o  e" B* E- v" z3 V, U
    第十种玩法:多线程爬虫
    - \( J, `8 U/ R" E特点:
    - O2 o" C. ~+ e& R( U爬虫速度加快,7 V, t$ A. f1 H
    更好的利用了线程。9 s' k- t; ?  X0 M4 ?' U) l  u
    8 ]' [, \% |* r4 G1 H1 A& f% b7 A
    缺点:暂无7 a/ [5 s$ o. ]0 D6 E

    / W9 w0 ^: x% g* z* ]:return None4 S  h$ t' r6 q" g* a6 n( F. `

    3 w+ ~5 p3 Y% P" C$ [, yrequest.parse(
    " i2 K+ M* G# e' E" d5 a: b3 H        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    4 D1 {9 C0 n  E# ~        #login="taobao",
    - U8 G! E3 }8 N7 {8 d3 \! J        type_url = "text",: H; w% k& I! S& l9 v! e
            Parsing = 'xpath',
    6 A! `. e: r7 f% v! H% h2 c' J        label = {
    % B5 X& C: e% S; B! ~1 r            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],2 C% H- @) g" I  Z* c
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ; n# }. S! o" [8 R            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    0 v. d! j. D* S- E3 Q            },
    : B, V* n9 x7 ]        write='result.txt',
    1 v0 V: u! T- k/ c0 C        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',, J$ X+ E2 j9 k3 G5 C/ R& `2 ?" ^
            page=[True,"now_url.txt"],; W  H& g% r4 D2 @% x' G" R" k
            #clean=True,
    # Y# B2 c8 S# V0 n; g: V0 x        texting=True,# J. b& _5 T) |! _1 K
            # status="threads" 启用多线程爬虫
    . D9 Q9 W5 I1 O: w        # Thread_num 为线程数目,默认为1 单线程
    . T( n) t1 L( X; h0 H# [        status="threads",
    0 b% m# K) t2 t- R$ _1 o5 x; C        Thread_num=3,
    ' T! m% `; t# r, j3 R        ###
    # ]3 f' E. e' N/ @* J        write_SQL={. t" k1 \; b4 I
                'host':'localhost',( Q+ N8 i2 ^6 x6 C
                'post':'3306',- \1 t* ?( P) B5 t9 u6 G
                'user':'root',' t9 C3 y- _9 C8 c7 M' ]) V2 X
                'password':'123456',$ h% o# R) \' o& M
                'db':'example',
    & f7 a' p  m3 b' t  p  o0 T6 t- R0 h! s            'table':'example'/ U7 c: W7 P# h) c( P, o
                }
    ' ]' h2 ^0 u% y1 e' v).run()/ E; n1 k# A8 B5 l  ~  m
    ' r# r2 T, I2 S
    第十一种玩法:多进程爬虫
    ; k6 M7 j5 {3 _% W+ Y特点:# s% A8 A2 g  q- @
    爬虫速度加快,2 ~  l7 _9 Y! i/ }# U! ^
    更好的利用了进程。, @- Q( N! }( |- u2 @( Y, ^5 V
    + K0 f, j* r: p9 W. s+ ?4 A
    缺点:暂无
    4 R# T% H; f4 }# u! n2 |7 c/ T3 {$ ~7 y) k  j+ K/ D. \
    :return None* O) I# p# f% v  E) U# A
    8 t- ~) y, @6 ~3 Z5 U4 c0 |
    from simple_crawl import request* d! ]5 ~5 S  z
    request.parse(
    & u3 Y4 H4 ^7 D7 q        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],- w: D9 r- V" O4 G, ^% ^& t
            #login="taobao",
    - c2 _, r& ]$ `& s" f4 S        type_url = "text",$ D& }/ Y  i9 b$ I
            Parsing = 'xpath',6 g4 Q# [+ O0 A
            label = {# }; L+ s4 P8 |7 q6 O) B
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],7 n0 A. l* ]" C4 O4 `4 D
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],% a& a7 e: L; y0 ^$ C
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ) x+ b6 G  d( [" L1 y  g' \2 u& L            },
    5 }" e- W. w* G6 H/ t+ Z6 ]        write='result.txt',
    / q% L: J& O2 g2 _! g& k        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href'," _( e7 @% |+ a  t
            page=[True,"now_url.txt"],
    ( n) D' a2 |" u7 q& @  j! w- y' |        #clean=True,
    4 H1 m) D% X$ e! `! y3 o# q8 g        texting=True,
    8 O3 G& F2 I9 \6 C1 g& ]. `; |( K        # status="multiprocessing" 启用多进程爬虫* U" j6 ^7 P6 K0 Q$ G* s
            # cpu_count 为启动代码核心数,默认为系统核数一半* ]& f% F, i5 k7 f2 \
            status="multiprocessing",- E+ N1 u$ W5 n+ |) T) I; O
            cpu_count=2,0 U9 k2 R) u$ b, O
            ###
    : A# F# z0 y5 Y6 j4 r  D5 ^        write_SQL={5 D2 }/ Q" g6 |& |* G: l
                'host':'localhost',
      i5 V3 J* Q7 s            'post':'3306',3 E% e3 I# p: Y* Y+ D, B
                'user':'root',- Z# _# I- _4 L& Z* _* J5 B/ k! E
                'password':'123456',8 v: k% q0 A* w1 |; h" g. n; l
                'db':'example',
    ( E& f9 [6 v1 a; ?9 L: |! B            'table':'example'
    4 R% D6 z: u7 R            }9 [7 f0 k* ^0 T3 P3 S. h5 R
    ).run()8 k3 R: D  I5 [

    3 U* K$ ]" G) x, k9 k第十二种玩法:异步多线程爬虫
    : ?7 j* r. r$ X4 ^  _特点:  n, h2 m2 E& T& k3 W& \
    爬虫速度加快,
    7 V4 U& F& v6 C- H异步使得爬虫无等待时间,
    ! l% x8 }. A  C0 `# [. i同时使用多线程速度明显加快。6 k) n  ~" W& l3 W0 N

    ' \" B$ K+ E" _3 J缺点:暂无/ K7 f  ]2 c3 Y, J" A9 a  s; K! z

    / H& J" k& R, k& z1 j) H8 E) v:return None& d1 u& S. k  W  R9 F( j* b

    , A5 M! ]7 @) r( _6 J% T8 Pfrom simple_crawl import request: _) j9 Y% }! c; j! [
    request.parse(
    1 t' v- x, Y! I  `5 T. K        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    / z& ]) `2 W' ^% X! r6 F" b        #login="taobao",
    8 F0 n$ A% u/ [        type_url = "text",
    ; n/ @: k$ |: d( W. g$ k9 P        Parsing = 'xpath',
    & I  {. R: L/ I- H( n        label = {2 [" R' |' S" W
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],0 F% ?( {8 P/ q' C7 @
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    " [9 s2 M% h' A" m            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    % S+ F' g1 D& ^, Q* G            },8 E( K; Z  w7 x8 Q! A4 c6 |
            write='result.txt'," f3 t" N" @5 a
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    . N, B8 v* [/ u, A+ B! z        page=[True,"now_url.txt"],) f( P4 D, R! [& t
            #clean=True,- A/ d, f" U( a8 ^( c2 A3 _
            texting=True,) G# C" E# t" G; `$ L$ G
            # sem 参数为异步引擎数目,默认为52 |$ m2 C. ?4 K* N' p
            # 其他参数同上% {/ z3 i$ I, W. y
            status="aiohttp",
    ; D0 @5 m! n4 n) q$ O6 L        Thread_num=3,! Q& n" R' S5 A2 ^7 l, X5 o& z! j
            sem=5,
    7 {: S4 k7 C, a0 z1 H* r2 p. s9 t        ###2 X  A% i2 v/ X1 h
            write_SQL={
    ( n" J1 V' {- U8 P/ n, r1 [            'host':'localhost',) S) o6 m' @4 V6 `  x
                'post':'3306',
    ( @! T0 D# [2 c  P            'user':'root',
    . J& o+ ?$ p/ t! A+ m8 @9 T* y            'password':'123456',
    ( k# i1 F* q- q5 N            'db':'example',3 Y; O4 _  _5 O
                'table':'example'
    : F: ^: @. v9 v2 A; k( s9 n            }
    , N/ F7 e5 |9 {& Y# [. }" o).run()+ D3 l- q' Z, A( l

    . h1 {% Y9 [5 N第十三种玩法:异步多进程爬虫* j3 X6 w) m( U+ Y! o" y7 X7 a
    特点:
    ( u9 j, e8 N6 a" Y: Q爬虫速度加快,
    : c2 F( _# J# P0 p8 E2 g& f, V7 w异步使得爬虫无等待时间,. ^) J- a# r5 d3 X
    同时使用多进程速度明显加快。
    $ ]) d6 S( k) ?: ~4 n
    1 ~5 d5 ^( h- o- y2 p# U8 k缺点:暂无* ]' h8 Z8 t  j; t# ^  h9 z) r
    ( p. g* j! N1 f$ s7 P6 P
    :return None4 w" g; H' J: l
    3 i, c1 C4 C$ U8 M1 p8 c( B( M/ `
    from simple_crawl import request
    ( v4 M* C3 }* G+ trequest.parse(9 J3 x9 O/ D; `. X4 D
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],* V& i2 w* N8 L" u. }
            #login="taobao",
    : K  M- k7 ]5 d" e( W        type_url = "text",- h0 P4 l# C7 R1 v5 H0 {; A: ]
            Parsing = 'xpath',
    2 I& X6 r* @1 `7 k6 g        label = {" b4 k" i: Y: T* ~1 O5 V9 s
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    0 E  s) b; m9 o( n! ?            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str]," ]6 x( C+ M) M' ^/ [
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]0 P5 L+ X) O* j2 [2 @
                },
    , r& ]& p! q. ~! D7 d        write='result.txt',, Z* y$ L! V' a; m: c* k" o0 N7 c9 W
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ' A7 ^+ K4 o4 M3 l7 v" Z        page=[True,"now_url.txt"],
    2 Q& M/ e3 _( |5 D) I        #clean=True,& t9 P  B1 m/ T5 R9 m* ~. V
            texting=True,
    8 {: P4 K! Q, y3 T        # 参数如上
    + O% M, c6 e- n        status="between",
      U( p8 I+ m, T        cpu_count=1,2 m* o0 w4 |# U5 m5 _
            sem=5,
    - C! c( d: U& A0 N8 Y- w5 y        ###
    4 j1 e& c' I/ n9 F        write_SQL={
    1 V4 `. \4 Y5 o: f/ X  d            'host':'localhost',
    5 w# I5 ~2 L% e            'post':'3306',
    . w! y! }. p" J  Y' K! o            'user':'root',
    , E) L( c  L7 i" f/ ?. n            'password':'123456',
    + ]8 d' i7 m  O; g9 ]5 `            'db':'example',
    + n" c3 q( V3 \5 Q7 W; S, ?8 ]9 P9 O            'table':'example'
    ! ?1 V- k$ l7 v, V% b            }4 D. ?; v( v8 e7 ~: O8 \9 x
    ).run(). k, l0 U2 ^, t
    2 S) J$ }, e2 y' |7 a3 p- q
    8 X  b8 b" O  q/ N' ?5 o2 I
    功能介绍完毕🤞
    3 w+ V& V# d* F) y) b) j最后还是希望你们能给我点一波小小的关注。
    1 _, Z; k5 k% d7 }# \奉上自己诚挚的爱心💖
    % ]8 Z" J  b3 f' u9 F, _————————————————
    : G; H( H* J0 c" C版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。' u, c; Z4 ~1 b8 Y- v7 c) {
    原文链接:https://blog.csdn.net/qq_45414559/article/details/1060056847 J7 G, }$ t* c" p; t

    + c; V* A" Z3 W% n# n9 I9 `% \, _* i% E/ P' a  i, L
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    738391227        

    0

    主题

    6

    听众

    32

    积分

    升级  28.42%

  • TA的每日心情

    2022-2-20 17:52
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    自我介绍
    哈哈哈哈
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-8-8 02:41 , Processed in 0.456541 second(s), 55 queries .

    回顶部