QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5432|回复: 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_crawl0 N% L9 u6 {* [
    simple_crawl
    7 T' M. S- v2 t" l. C! Y仅需一行代码即可达到爬虫效果
    " F) t7 Y# d  V9 c6 G, h1 K项目地址(欢迎star):https://github.com/Amiee-well/crawl
    " L# ?2 w- B5 O; E3 H% X0 c使用方法/ f6 L; X% Q) T- F; X
    pip install simple_crawl# ^6 B' _; Z- M" J8 J
    1 ^" R' A' G6 }& M$ |2 e8 V( e* ^' i
    ### 以下源代码为简单介绍,详细功能介绍再源代码之下1 x) E  I% ^4 E9 ^( e8 z
    from simple_crawl import request4 D" y. V" V$ _+ [6 {
    request.parse(
    # R' k  c" {+ G5 f% t- X2 n* w, R        # status 参数为运行状态,支持单线程多线程多进程协程以及联合
    1 z% _6 u0 k: U7 x0 A        status="aiohttp",
    - `; T% v8 I- m/ ?' Y" h        # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式
      K7 j+ G: L! s" y        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],$ c( m9 `  ^- L6 H# d
            # login 参数为获取登陆信息,如淘宝等网址需要登陆信息
    9 f  C0 q3 H4 X' M    #login="taobao"," d$ h6 s) L! X* n2 G6 ^
        # type_url 参数为返回源代码格式,支持text和json,默认返回text/ w" @0 Z: i/ n2 w2 S
        type_url = "text",
    $ m3 E0 ^1 Z+ O( f- E7 d    # Parsing 参数为解析方法,支持re、xpath和beautifulsoup
    9 D5 ^7 h3 W9 x/ G0 c    Parsing = 'xpath',4 o, Y& h" }# N. I3 h% _
        # label 参数为爬虫解析过程,字典格式,详情见下方
    + U4 k" A' }( }4 b9 c  b    label = {
    $ \: N1 n1 H1 g( H# ]4 Y            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],3 b5 v0 g: h6 N, Q: p. k' ]0 B
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    - [- _  `+ j4 T6 D& k7 n            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]4 y. P9 w! P$ {, l, }) ]
         },# z6 l+ v/ F% r0 p
         # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱4 X) G) b% e7 ?. [" U
         write='result.txt',
    8 t, ?! _# s4 D1 R) E     # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫
    4 t( |% `8 q; o- i     next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',+ g8 i8 A3 g3 c; [% q. X) o9 [9 D
         # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫
    7 _0 s9 s2 N/ R( v6 R5 l* A, K     page=[True,"now_url.txt"],; ~$ l2 E) G7 E$ a+ |) I/ A
         # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息, ~, a# i% T, s5 L1 z- A, d  c, M
         #clean=True,; V" H* o  N: D' C
         # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序
    $ P$ i% C1 b) B7 Q/ @2 M$ D     texting=True,
    6 K( d! f) f0 _, j* Z* l2 b+ j     # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态$ @& @7 R3 ^7 k) ]4 Y
         Thread_num=3,
    $ k! N3 ~7 a: ^     # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态: A9 U! V9 ^9 R# J- x
         cpu_count=1,, l1 F+ b6 s' B  G0 V* q! ?
         # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态
    ) Y$ o4 Z' _8 w3 m" }  r, B     sem=5,& u# Y8 A1 B( Z, K7 o
         # write_SQL 为是否写入数据库,默认否
    % q. \6 V& @0 \/ a7 M     # host 参数默认localhost
    8 q& |; r; B7 G9 h  b, I- W     # post 参数默认3306
    7 Q9 d+ {& g1 _. G: a  m; S! H, j     # user 参数默认root0 X3 C% i. G1 g; A& n' n7 ]
         # password 参数必填,必须正确& |! ]' R7 ~6 j/ f0 ^  [* k8 Y
         # db 参数为即将存入的数据库名,若不存在自动创建
    . ?8 r: `+ d$ ^' y$ ]$ w& I     # table 参数为即将存入的数据表名,若不存在自动创建4 M9 E1 j- ~3 U4 Y: j. S9 t% x4 ?
         write_SQL={0 j$ ?) _) }8 \' P: D
             'host':'localhost',
    ; `/ U- `1 a) U' P5 d         'post':'3306',
    * b; a" H$ F, T- G9 E$ a! l2 y$ ^6 a         'user':'root',
    ! F0 r9 Z" M$ a  B- e, @0 W: g         'password':'123456',+ Y$ z. E, _( F: q, I
             'db':'example',
    * L3 r6 A. m* q1 E+ V" R5 n" s         'table':'example'
    & Q4 P' j  r, }7 H3 Z) n+ V      }
    5 H/ ~! K; E  b0 v* C4 r).run()# Z1 V$ v( d$ o. K

    $ H0 s& _+ o# G' N2 J# e介绍一下crawl参数设置:
    1 v2 _2 k0 d6 c' {  `, O  W, N; U; f' E2 G& T# k
    '''
    9 f6 o( ]" R" F! V' a" Z单行代码爬虫程序执行
    % @; s) Q9 U7 Z! P0 Y# K# L:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档
    - t4 l" _+ S) y9 l2 T:param url:即将请求的url地址,仅支持get请求
    6 h" o3 W* V6 A& U% K! m:param type_url:请求url后返回格式,支持text和json格式返回
    + m2 ~/ Y5 a# }8 |:param Thread_num:即将启动多线程个数,默认为1单线程# N- m1 \! a6 f7 P
    :param sem:协程信号量,控制协程数,防止爬的过快,默认为5
    $ ~/ S: G  T+ b:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半
    , P8 q2 }7 J  L/ A- a0 ?* F:param login:模拟网站登陆,保存登陆信息
    ) C2 ^# a# \6 Y; S$ C( A) m:param Parsing:爬虫方式,支持re、xpath以及bs4方法
    4 F% ~9 d  x7 @:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,
    8 x: f- B2 K8 r7 S0 n                       多次报错结束程序,默认否
    ( Q  u, ^6 U3 F9 e, O:param label:选择器内容,字典格式保存,3 _3 u3 {" j$ F' h* M0 d/ z  W
                         字典值为列表格式,第一个参数为选择器,第二个参数为转换类型
    * P. |: l# n: P+ j8 z                     第一个参数必填,第二个参数默认str类型2 \6 t3 U8 [. L' @0 J" R7 Z
    :param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否# g: P, t. l% l8 L  h& S' f$ i/ J
    :param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫
    ! d7 G5 [% l4 [* g  O5 Z  A:param page:是否选择断续笔记接手下次爬虫处理,默认否0 U' G. a1 P* H& H' h! e
    :param clean:是否进行简单类型数据清洗,默认否, N( H$ g9 S6 r  A% R
    :param write_sql:是否写入数据库,默认否
    0 ]! E/ N- M% Z7 |6 s' {                         'host'默认为'localhost','post'默认'3306','user'默认'root',
    7 ~2 e  Y2 O! n, X& @% n* z                         'password':'密码','db':'数据库','table':'数据表',
    ( C$ r+ t) L3 d/ X4 j# V                         检测库是否存在,若不存在则创建,若存在则直接插入,% H* ^+ T3 ~0 \
                             检测表是否存在,若不存在则创建,若存在则直接插入1 A5 |& ^# s& t4 p* V: A
    :return True$ B/ G6 d4 U" G4 N; _
    '''
    8 U4 F3 P, _* a2 k! m介绍玩法
    # |: C8 Q$ O8 Q& |7 `2 f接下来介绍的均为调用第三方库的情况下运行:
    6 w3 V# J7 K" ^$ k/ f
    + y: s) u" p% D7 E; t0 w/ D! Gfrom simple_crawl import request  X+ |* w( m. E! {3 d8 X
    第一种玩法:输出源代码
    & V8 `" {* A# [9 d6 W4 r/ c调用requests库进行源代码请求。
    % R& C, _' g( ^( I6 F+ B2 N0 K7 |1 D3 P4 Y( q" Q
    特点:$ e6 b4 \* u+ s( l& h6 x; Z
    请求失败则调用ip池处理重新请求访问,
    $ T- G, Y9 u0 g7 [' U6 t$ u) H" m出现五次失败默认网址输入错误。
    * A& e9 C4 C. b9 j8 d5 l5 N2 `* A支持text以及json字符串返回。默认text。, I5 J, X) R" C$ n

    . w$ p9 ^- I1 _缺点:  R8 A, t& k/ q2 A9 \4 P  H9 x
    暂时只能进行get请求,不支持post访问# [) B; z$ W7 p6 y3 h

    : B# h9 g9 ]9 H+ k! ~6 w:return text or json
      G* `% x* F5 @: W9 N, L7 x0 X' C( t& X8 b: C
    request.parse(0 G& j& u' @( ~+ Y) i$ h
            url = "https://www.douban.com/group/explore",
    ; |. }$ H3 {  ~8 K7 Q        type_url = "text"
    ; c  P4 E% r% u  g3 j3 k/ }).run()
    " n% H7 ]3 x( v) K% S# return text
    , x0 I: |" V/ m9 c
    & Q+ B1 q" C0 i6 q% e& ]第二种玩法:模拟网站登陆并保存信息
    4 n  F, V7 n4 _" l7 H调用DecryptLogin库请求登陆访问。, ^; \* N7 i7 h, L; k* s8 S
    4 a/ H9 ~3 F- U% t+ |$ P5 {
    ps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源
      n/ c: F; Y0 S, y- a0 t在此放出文档地址6 c; q7 G5 J- B0 M, T7 ?; b
    DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/- `" {" {2 E* L0 O' }9 S# L# E
    , y/ @/ d4 b0 @+ A5 e
    特点:) P7 }7 \5 Q+ j, T/ a/ ~5 f+ \* Y  _3 ^
    将DecryptLogin库中二维码继承到此库(非二次开发)
    ! H6 v. G" `$ [0 n) R支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)- }5 X( L/ Q; }
    保存session.pkl信息到本地方便下次登陆运行4 I- U. ?" y4 n4 b
    * r, Y2 K3 M' N1 B* m2 Z) I+ {: q! n9 H2 ?
    缺点:! H9 f- a' O! n+ M5 I% x
    session.pkl登陆信息过时无法自动删除。
    7 q# I$ {  k! y' G导致下次登陆疑似cookie无法正常登陆。
    9 ~3 M' x! o; s' c/ l* z
    ! ~* @+ e% r5 L. t; Y0 m:return session
    5 X& s. v, G0 K7 e( a0 r1 Y7 H! j/ |! T  p
    request.parse(
    # n7 n# B2 E" v$ n: Y  P0 h0 y/ n8 w        # 臭不要脸的推广一下我的店铺4 V( T3 F3 m5 p; {* A: i- R: Y, \1 V
            url="https://shop574805287.taobao.com/",
    ; V) I* k8 z  [1 D  M, b9 r0 f        login="taobao"
    9 p/ n* l0 E* \) j% Q1 e! T1 W).run()) p; U4 N1 R* a
    # return text( T5 c, g0 N) v

    . j, g5 `. c2 d! x第三种玩法:爬取网站信息
    , E' e- l, J& \! v1 d  w) s- B' O爬虫库自然少不了爬虫的过程3 f6 O* a. q6 \
    ( g, Y6 ]' |8 m& o
    特点:
    * q" ?: ]5 K# U6 z* w支持re库,xpath解析以及bs4选择器。+ |3 H8 Y/ s! A( w/ e
    爬取方法为字典格式。单方面输出。
    , I  T2 S/ ~  w* |3 \字典键为保存的字段名称。& L# O3 x+ i( m) n5 P% |, T, q
    字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。$ X2 t7 m$ ~& f: D1 A# G# s% J+ T

    ! |3 g! ^( d) ?: W! ?9 W缺点:暂无(等待小伙伴们发现)
    1 I8 s; x# O; F
    6 u1 v' r+ ?% r- a0 [:return reptile_results
    5 i& y5 ~1 i$ Y. y6 t  @
    , Q* v& _7 G2 j7 b, ~1 b+ X% J5 Z1 irequest.parse(: a+ W! |/ h; F* d! I, c
            url='https://www.douban.com/group/explore',
      y* o2 Z$ i- x' d  z" U* H; l$ I        # 字符串格式,选择器方法。
    + R$ e' }: p0 Q    Parsing = 'xpath',
    : o  O* @" e1 B- K* H7 f    # 字典格式,参数如上。* y7 S# Y/ ~  J! x/ v# `
        label = {
    ; z6 F' k+ G# i        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    2 E! I. p# E% X% r/ q& F" Q0 O! D        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    9 g1 C1 r- A3 B0 y        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    5 g4 \- i9 G, @3 k# N        }2 I5 t: t8 X: x5 K5 E0 z! P
    ).run()9 Y6 |5 _' T- q7 ]% P2 f( y) V
    # return reptile_results(list)9 Q) C6 c  }- o" B& {2 {- e

    3 L. X3 o. `# A# O0 K第四种玩法:自由保存信息
    # ^8 B$ c1 p; R" \8 P目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。
    ) ?% H! o: ~3 B. @8 s  O" S' ^/ B3 ^) i0 i
    特点:, L- e) t9 l) H
    写入文件均为数据格式传入文件。6 [) D  ~) T. p! A4 i2 [* X
    且输入格式规范方便阅读and省事。' ^3 z* U7 Q* w* G! r
    + B4 z( L" `, r7 D; ~- k
    缺点:3 n( n8 G! H: o, @" U
    保存格式仅四种,
    3 j0 y+ F  @! h) Y# g. W不方便用户之后读写操作。% ^6 d- k: W  h# h

    7 ?5 M, _" e1 g2 v& ^:return file
    7 L, L4 J3 V$ d6 ~  Y$ v  z! E% q. M* ]  m4 Z
    request.parse() g2 ~! s) g8 N3 y- w) g& [$ U# S
            url='https://www.douban.com/group/explore',6 y7 u1 o1 S/ u- O0 }1 i, f
        Parsing = 'xpath',, V2 [5 o# ?" B5 s- ~( y% ]
        label = {* D9 c. X* P. H: @5 Q
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    " f/ W. G+ ?' C1 Q0 P, H$ d        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],7 w$ P# y) b8 L* J; a" d- ~
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]& N& T" t, \7 [5 g0 h2 F8 t8 n
            },
    2 j/ |6 X2 H% o8 |% Y7 |: d3 \    # 字符串格式,具体保存位置填写
    : U; w* c* C) O( L    write='result.pkl'0 d( T8 F/ R8 D+ v" ?( }6 E
    ).run()( T1 Q- q7 _/ X+ g. t9 N' n! I
    # return file! b( T4 `4 `( a* G+ S

    9 T/ B) }: o( s) X第五种玩法:读取下一页 url 地址继续爬虫
    ) J* ]3 g1 W: h! `1 M这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~
    + ?# q' G2 V, S  [. ?5 m" k; u; [6 ^1 j1 ~% M/ y8 `
    特点:
    ! Z6 s4 ?' q6 X& I: M: a继承之前的Parsing参数选择器选择方法。% t# p8 V6 R0 T$ E7 x1 S% j( d' k
    在这里可读取到解析后的下一页 url 网址。
    ; E7 J# @5 x* k; @方可继续进行爬虫处理。方便用户使用。3 D0 q& F4 h/ n' [0 `" n- p

    5 C$ G$ _, d9 o1 C1 c3 r0 G缺点:: i- }# V! r3 d' p4 e- l/ `
    若爬虫时下一页 url 地址改变,便结束爬虫。
    " t. P/ S' B- U. }2 z只能爬取所给 url 地址中的信息。
    8 c3 E8 D9 r5 ^- _4 J无法进行某一界面的多个网页爬取返回。/ }- \& V( ~8 l! M& m
    造成访问页面单一流失。$ ~: w" ~; f" i* k3 ^) n
    ( H+ |: o2 g5 B
    :return None& r9 u: q1 h1 T
    7 Y7 M$ f' q. m/ u2 N8 @3 |
    request.parse(
    ' ~9 n: w9 m& @        url='https://www.douban.com/group/explore',) |& P4 B$ X3 \
        Parsing = 'xpath',
    3 N8 V( a* z# o# A* m; s7 ]! J    label = {
    ; Z1 r% J/ Q- g        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    . T6 F) k# Z) O8 A        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    2 x% X3 W" M4 \- }        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    : @; u6 e: Z6 i, k        },; l  G6 O& I( R; }5 Q
        write='result.pkl',
    # O) x0 U7 }+ G9 u. F# J' F2 I! i    # 字符串格式,根据Parsing方法继续请求下一页a中href- _) I# s) [$ Y7 U
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',- L+ G. j3 ~* d! ^: f$ I0 ~
    ).run()$ w2 P( T6 A5 U6 _4 j
    # return None
    & F" b7 o8 e* x$ U# z' j8 \
    4 g$ r5 P2 N2 f7 R. ~: B9 q第六种玩法:爬虫网页保存' T* b8 q. n  H7 P# b, C3 y4 E
    听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!; Z. }2 }. v* F3 J. b. U- `2 L
    ) A0 ?* I# n8 N
    特点:. L; B6 X" B& t) C/ h  \
    持续输出断续笔记。( x# G. e8 q! C, B
    将此次爬虫的 url 地址保存到一个文本文档内部。  w, Q9 Z  {, o/ p1 k- e. L) G1 e
    下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。
    * o; {' ^: H- I, q+ @% Z: [
    1 f" ^+ U1 P* x* A7 ~) ~& Z缺点:
    7 n( C. D6 R5 i( b6 h% A! k读取内容不单一。' L; `' x. \9 B& o8 B% x( Y
    导致下次爬虫无法正确读取上次爬虫留下的痕迹。
    0 k  D+ G+ ~+ F3 j8 N+ o# x3 O) c# b& Y
    :return url_file
    % \7 m6 H9 e$ R/ r' U/ P6 V+ a9 n
      D$ u( B5 r. ~6 M! K& ]; erequest.parse(
    ) D7 C5 D& n. n# f- ]' A; m* M    url='https://www.douban.com/group/explore',
    0 e9 w5 c3 D' ]- r    type_url='text',9 u' `! x* Z. L% q$ n6 s
        #login='taobao',
    1 K6 \) b/ `4 }9 G! R& T/ P4 M    Parsing = 'xpath',; m- G* z2 {- g0 S# h
        label = {- _' k: P7 I2 a. H2 z* P* A
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],# [9 d& J1 s" J3 k2 [! O# a
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    : S* D6 G  @$ o        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]2 l% o% u" Z7 }9 i
            },( l) ]% S8 ?" `( H
        write='result.pkl',
    8 _% V3 a, L7 ~# t( u3 P; w    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    $ V/ `/ M9 D2 X" C    # 第一个参数为是否需要断续笔记。; E0 G7 \  o9 H! d  E, A
        # 第二个参数为断续笔记保存位置。
    & o; ]" F3 _5 h( x7 M# T& R    page=[True,'url_page.txt']
    4 R+ F$ S2 I$ T/ ?2 D' q).run(); v7 Q! Y/ k7 g# @. X9 G- i9 [
    # return url_file+ R( s6 d, k9 G2 C+ S2 J# v

    0 T9 A% ?, z6 {( ^( ^8 W, y- U第七种玩法:简单数据清洗
    ' G- U3 y' Q$ s, q! L* v. M- P数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。, @5 K3 g3 D# c: [0 _

    0 a. R4 Q! ~* @9 E/ O$ w) |特点:" D) ?8 e& J2 o! ]/ ?: q7 j
    本人曾写过一个底层数据清洗。
    ' x9 |1 z7 m5 a. W能将列表格式数据进行归分清洗。& B3 S1 h6 u# x1 p
    主要内容请参考另一篇文章* x: h5 a) W. M: ~
    如下连接:数据清洗* m( }; w, q# \7 ~9 n3 B6 ]

    3 D+ s" l+ ?5 X+ v; f缺点:1 o, M+ |& q4 `. t" e) B
    数据清洗格式简单。" p& P$ Q/ ?( _
    数据清洗内容单一。
    " w/ M) x8 U; {$ [/ l# F无法完全做到绝对清洗。
    + B. _$ a  ^+ D7 }3 ~; q有待改善。+ x  J) a8 \  m5 c

    5 p2 u$ i' l' ^- n. i. m) F:return keyword_list, value_list
    1 \: p# q4 @0 _7 W, K' t8 S+ C0 g! C2 ~6 b
    request.parse(
    ' p3 A  y9 u! s' c1 N/ t  W; s7 p    url='https://www.douban.com/group/explore',
    ! n3 m; S4 v% p5 [! A& o! @0 H    Parsing = 'xpath',
    ' j( w# [9 ]: }" r    label = {- @+ l4 {# Y- e$ `
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],7 X& E. g% V% n) u
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    . L: U8 K" v. W$ C/ |7 x        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    / E/ Z  z# D* |7 b5 c; _7 g        },  m+ H" _( X7 P" w
        write='result.pkl',3 R% X& C5 X: J' g
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',* q# o5 `- f+ C8 {
        page=[True,'url_page.txt'],
    * }) r" n+ r2 g1 z    # bool类型,默认不清洗& I( o# Y" N* y! v. r/ L) o
        clean=True; p# {2 {+ p9 B6 m/ @) |; |4 J* H- q
    ).run()- c8 L# n1 c# e" V# M# a# X8 m
    $ C# m* e! e! Y2 q# }4 Z9 G$ Y
    第八种玩法:爬虫存入数据库
    " k% ^9 \7 s9 U$ y存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。
    ( \# V4 S& I9 G4 t! q' \) d: ?" h1 D, C2 O# {5 Q' d
    特点:
    & X1 P+ O* y9 w* ]信息存入MySQL数据库。. f2 `0 u$ O! i9 z
    可连接docker远程数据库。
    7 j1 K2 o8 ?" d8 P. J, t数据库的库名可以不存在。! g3 A3 w  {0 v& y0 ~. r
    数据库的表名可以不存在。2 d! v9 R1 X! q* @1 D
    根据之前传入字典键与值参数判断表类型。! U! g0 H) j5 {
    自由建立数据表传入信息。
    7 h+ B) T% ^- A5 O; }9 R- ^' e0 C% W7 V' @3 `1 s6 |2 d- f: M4 a
    缺点:7 V* }. A. v/ v
    仅支持MySQL数据库。, g# T& U' L: E4 X. \1 v

    % R3 E3 y7 f8 A:return SQL; U  s0 @1 s- M# ?9 e! J9 o7 {

    6 ?: ^9 h( K) X0 R/ i5 S5 mrequest.parse(
    , `. ]0 F1 |' a+ o9 [* B) N3 S    url='https://www.douban.com/group/explore',
    : y; A2 M, B- u! f0 p' ^) j! P    Parsing = 'xpath',0 g# ^  z* A. N7 E1 J- z* k
        label = {2 e+ ^5 r4 g* h
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    & _9 G, u5 f$ O: L+ b( n4 R" @% w        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    . l2 f# d* e. {5 K, }8 O        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]5 U) ~# M( W2 j# `
            },
    3 k" b# k+ L  X& G9 R! R8 \: K    write='result.pkl',! O2 ?* a  W( s! z+ A, x9 i
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ; j3 _; G/ q7 Z, w" t, x    page=[True,'url_page.txt'],
    5 m; `' o* v5 l7 e/ W' C    clean=True,
    / S2 T& u) {. G6 ~3 u# S# J+ `4 A    # 字典格式,
    " v7 Z' l/ y5 E" O    # host可有可无,默认localhost. t& N$ v% ]; }# @$ c
        # post可有可无,默认3306
    $ L* m; A8 k/ ~9 e1 l. j& A, P3 _9 m( z    # user可有可无,默认root: E. T+ \! Z4 D" d* r% o& p% j4 O. Q
        # password必要参数,数据库连接密码
    1 R3 @( x* t# A6 v2 M7 P* s% M    # db必要参数,数据库即将存入的库名
    7 x  i5 v- C* l* t1 \  E    # table必要参数,数据库即将存入的表名  v1 i* C- F) Q
        write_SQL={  K" I! [; G( T8 n9 E# N$ t2 x6 q
            'host':'localhost',1 N5 X7 X% X$ }  Z; n! i
            'post':'3306',
    " n* g% k' D! l2 d! B        'user':'root',
    / P  z5 ?, v9 k$ n3 I        'password':'123456',5 b; ~6 v% J" B, Y- L$ Z# a
            'db':'example',3 A& s! H( r( z1 A) T6 s- J; e9 `9 S. a
            'table':'example'% A, V& T7 P/ m
            }
    & u. h- E5 L: P* q% ~/ e    ).run()
    $ O1 u! h" y+ [+ N: n7 T% s0 `4 ~) a) \3 n  E/ G- j3 @
    第九种玩法:重新启动爬虫
    ) r: {( H1 d2 {- q爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。
    4 e9 z3 @0 E) o4 o  J7 c5 ~: \8 l  D2 y- I! b6 W
    特点:7 A& R3 N2 {" a; @$ C) ]# A
    检测报错重新启动爬虫
    , A& w# W0 n% B, d" |7 j9 g% @无需手动处理错误信息
    6 R& N; H1 _, s) [2 X# }' w) ]2 N6 o# m1 U' ], f
    缺点:& p# ~( V) i) v( Q/ ]
    无法收集子线程错误。0 m( S7 o- _9 |. M' e' L, X
    6 {1 a. s$ k, x7 q
    :return None
    # v6 P, U3 c' |  |6 L
    9 M1 _+ B# Z* Zrequest.parse(
    / J( Y" X/ \3 _8 I& N  d" }        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],( }) `6 K( {* y: N2 w" X' J1 I! G$ R
            #login="taobao",' M& {, h" b5 b# Y
            type_url = "text",* w* R' x  y+ k: C" |7 C
            Parsing = 'xpath',) W0 o, S. {1 i* o9 U8 j3 @4 k
            label = {5 V. e7 D( ~4 b
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    3 F+ ^+ R; ]6 q) }+ T9 V            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],* _9 u! q% ?5 ?
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]# N* l  `  L- @, u9 Z# ]
                },- s# i0 g5 C" G* b9 g
            write='result.txt',
    % A/ T7 Z1 Y6 F: I        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',) k! ]' Q# Z- k
            page=[True,"now_url.txt"],! u6 C2 }. j5 N( h& M
            # texting 参数为是否启用连续爬虫& I9 U% ]. f! M7 b( z# ^: z; e, V
            # 爬虫程序异常报错后重新启动爬虫5 C/ x" K4 I. ]  T0 X2 K
            texting=True,9 ]0 |! ^! O+ c
            ###8 Q+ z7 l- |! V. J1 S  w& A
            write_SQL={
    1 b* x; ^+ F1 w( H( i            'host':'localhost',
    : @+ ]3 a2 h- R' `/ W7 h5 Q            'post':'3306',4 _; `% ]3 G, O- w8 ]
                'user':'root',- @3 l  V, m  [4 P
                'password':'123456',! ?1 P! u. u1 N+ G* z
                'db':'example',
    : a: _& d3 H  c            'table':'example'0 e/ z; W) i" K- \2 p* E  r
                }
    3 ?( O# }1 ~& s. R+ n- ^+ P).run()% {* V& X! O. K) |: t" ^1 `
    . d' d5 [& h+ ]( x  a4 m
    第十种玩法:多线程爬虫
    * E% D# m" I3 U/ Z" G/ P- f3 y$ U' G+ t特点:- I1 G6 J+ w. n. Z1 `
    爬虫速度加快,
    6 e5 p. ~% O5 _5 `# e/ p更好的利用了线程。
    6 E# Q: ~( ]- a3 p# G( l  a1 B* g/ o9 k7 ~6 a5 ?8 X! C0 ]3 L
    缺点:暂无
    * n2 Q+ C8 Q' ?0 M, O8 I. p  @; |' O  O! a5 D
    :return None
    9 o% H) R$ P2 P
    7 v6 `8 h, p% }/ Urequest.parse(
    6 c/ D, X7 `6 |* q: t% N4 _        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    ( b& U9 g. L6 ^4 k        #login="taobao",( C3 J! U9 d2 M' N$ q. t; K& g
            type_url = "text",
    . q6 c; s# n+ c2 _3 @8 }. v        Parsing = 'xpath',; t; F  }- P0 g' l% X9 X
            label = {
    7 W# ^0 \2 g! J: ?. k- U            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ) A0 k# g  E: q, \7 S& e3 O6 n            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],7 O: u; k' z0 A
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]0 }9 B. e/ Q" f3 Q/ G- a# V* f
                },4 E. ?% v$ T) ^' }
            write='result.txt',: e" x$ J2 E. ~) C8 ?9 ^- p! [
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',9 y3 |/ c- N8 N$ G3 [% ~0 e2 r* y
            page=[True,"now_url.txt"],; K9 B8 J% q% |0 O% P; M1 @
            #clean=True,8 ?1 }7 M3 R" n: s7 r' }3 E
            texting=True,
    2 C' ]7 y7 T, g, i5 H; r8 A        # status="threads" 启用多线程爬虫+ l& Z: i0 H- ^
            # Thread_num 为线程数目,默认为1 单线程+ A/ K* H6 @- l; n. L
            status="threads",2 P4 V, H4 l2 i: ?# n
            Thread_num=3,  N3 o6 K2 c6 i# ]# t/ c) x
            ###
    2 Y; t1 ^6 r. i- ^; E# {% S        write_SQL={
    % h3 i& d: r/ p4 v+ {& A  n            'host':'localhost',
    7 W5 m# B6 v  s/ J, t* d3 b4 n; D            'post':'3306',
    ( E4 t2 j* M2 t7 t+ d            'user':'root',
    - M- ?1 S0 y2 Q& X; ^  _4 G4 L. a            'password':'123456',
    6 x7 ?& m  U0 T4 d" Z% `            'db':'example',
    , {! |$ v$ j7 P" m& V& ]; H            'table':'example'. }$ C; }# W8 v' b
                }
    ' F, P$ @5 V! F. K9 E) `  u% y).run()
    % S) b! D$ u2 ?8 A  S- z' K, t! |6 i5 i' Y3 R
    第十一种玩法:多进程爬虫
    ! i' s( }: }3 D8 z; U$ ^3 K特点:/ q$ S4 H6 s' \! d
    爬虫速度加快,
    1 X; O+ ]3 g' y更好的利用了进程。) ~; d5 p3 j  J& ~; P8 `! ^, R& x
    , d' b' F! g) u5 S& h$ C  V- B# s
    缺点:暂无
    4 V! E7 G0 \) a
    % K+ C  D6 d3 z- V' C1 ~:return None
    $ i- i4 i: h6 P! @
    " z% H4 g" j* T3 ?2 _$ [- tfrom simple_crawl import request
    * u( I2 W; B7 Y$ o* vrequest.parse(
      Y# A9 O, g" ~        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],/ i( z5 f" ~1 c1 N6 r9 m4 e
            #login="taobao",
    6 z, F3 S7 ^, H: A; `& e6 `/ g        type_url = "text",
    . G- R" M' A& F6 o8 @        Parsing = 'xpath',$ u5 S% `% a) Q6 C  s0 a
            label = {9 ?' `5 ?' D1 U# O0 r* ^
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],, b) I' F6 e" U% p' Z- Y! }9 L" O, R/ \
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],0 _" W2 n8 T4 m4 p5 b. b: e- c
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]: U* X6 }* O  [0 E
                },# E, W' y! p- X  _/ H/ G. o
            write='result.txt',
    5 p3 S, e" C" U6 n8 v3 _: T        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',7 ~+ k7 _' x( A; m' I* {
            page=[True,"now_url.txt"],$ |2 B1 u: W& A
            #clean=True,7 F1 W* S# T2 r2 I4 W- p' M  g
            texting=True,  G- n  S6 x# h& H1 @/ B: v
            # status="multiprocessing" 启用多进程爬虫- Z1 g0 o+ @4 R
            # cpu_count 为启动代码核心数,默认为系统核数一半
    - U& _2 j( L& q7 }3 z9 ^' h+ U( m        status="multiprocessing",. J7 H  P! C1 @) m5 y
            cpu_count=2," J# A9 E) t8 N& f
            ###
    ' w8 a& e2 t- U8 K( X, m% T/ N  z        write_SQL={9 n6 V: g( Z3 v! C
                'host':'localhost',
    / \# x8 m5 G0 O! O4 t5 X; _0 r0 L            'post':'3306',
    ( w4 M  x) R) v: h0 H" p- w            'user':'root',
    , h; Y  p2 Z. C1 W6 c7 _7 T0 q% a            'password':'123456',* x( V0 ]+ ?5 E3 r8 K
                'db':'example',
    3 |5 _  z+ {+ X+ l# t            'table':'example'
      s% T" C- F" b' O* b2 K) B            }
    - [2 L3 c" `; S4 v: _8 h9 P4 O).run()
    % k4 t/ n. \5 K* U) o! H- m) m/ I8 z) R; t5 Q, B
    第十二种玩法:异步多线程爬虫
    ; Z, o! P( [, u; \! d特点:* t+ _9 O  g! o; ?9 ]$ B+ H
    爬虫速度加快,8 T- B7 g6 R; {+ ?( K1 h4 C- P
    异步使得爬虫无等待时间,. U8 Y: t. c; t: G- D
    同时使用多线程速度明显加快。
      r# I  {2 E8 |' U" r3 N1 m3 C0 O& k! o
    缺点:暂无: H# q' ?& r1 i

    ' g8 a8 C8 A& [5 l. D7 Q:return None/ E7 [8 d# V( |( g  I2 V# H

    9 Z4 X2 p% J& C8 Jfrom simple_crawl import request
    % S5 n7 A# B. j! ]request.parse(
    ' s& _1 Z( E6 _* u% H        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],9 q9 P% C" R* Y$ u" p* P4 D
            #login="taobao",
    ) f+ g( f( v7 P        type_url = "text",& ?4 k! L* O. q4 R# i
            Parsing = 'xpath',
    8 S/ e! }6 w( U. @3 K4 H        label = {: d. U9 o8 `; ]7 K; y1 t: R- @
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ! v3 u+ L8 a5 a: Q7 H0 Y0 K8 y& p            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    2 ^+ O: a$ Y$ {: _1 d  G6 K, s            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]1 e1 @7 n& g& \/ O6 e( Z
                },( l/ r) B6 b  p
            write='result.txt',
    + j# B* q5 O, \( \        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    % [8 L8 ?7 w4 w7 y8 b" [        page=[True,"now_url.txt"],9 X$ A6 z1 f3 Z, |$ }$ N
            #clean=True,
    - [% E* P. J7 s) s" X7 n! Y        texting=True,6 r& x6 @' e6 K& n
            # sem 参数为异步引擎数目,默认为5
    6 _! _1 o; D( T        # 其他参数同上4 f9 g  y, o. {- A1 p9 O
            status="aiohttp",
    9 }# I, h0 G7 ]        Thread_num=3,
    1 _: G! e- h) T        sem=5,
    2 l. G! y6 X* v6 w7 @' X        ###
    " v9 w; T6 H1 z4 a        write_SQL={" H0 Q4 z, W: c) ^; p
                'host':'localhost',
    9 m* V6 L/ _, x: Q/ V" C) _7 ]            'post':'3306',; i$ w) X. r4 A) Y/ C+ Z
                'user':'root',
    . q6 a# A7 a- e# {! ]0 F            'password':'123456',7 L6 W, x# Z1 K
                'db':'example',' _. b+ e- r( i6 H5 l" z$ u
                'table':'example'
    ' t$ H3 l4 s4 @3 F5 U            }
    / x/ q" Q9 V- W- S).run()" H4 r( Y% q. b: A" f- x( V

    ' t* c$ l4 ?5 b( r# v  K7 Y第十三种玩法:异步多进程爬虫
    4 i- f2 L  N9 Y! C" y特点:
    4 z* S7 h. ^- C% K0 }1 M* R; v爬虫速度加快,
    3 j8 Q  D5 H0 M' Z6 e- G$ G- ^1 k" U异步使得爬虫无等待时间,' D/ C, @/ M9 ]# c4 ]
    同时使用多进程速度明显加快。
    0 h& M' d! N' z3 Z6 [) [/ e- W5 N2 g- j' v
    缺点:暂无
    : v* O$ f. A' g( ~0 v5 ]
    ) B# o7 ]( c+ H$ L9 G# M:return None
    4 Z' z4 o/ E3 h# X! {$ o# N+ P" v2 Q; T: p. M
    from simple_crawl import request- K4 Z( E! N& H* B4 _
    request.parse(
    4 E, k3 B4 D. Z# x0 X        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    0 ^* ~: V2 I8 J- q; H6 |        #login="taobao",
    " }9 m# ^, N/ O1 e+ k3 s3 f        type_url = "text",! u: j& f. O8 d- p, b
            Parsing = 'xpath',) O* i& S: @( X  o+ \4 `
            label = {* c& O( T+ c+ z5 f- Z( J4 J
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],; j. A$ X9 _9 [# E' l+ [6 t  x
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],; s. f! @4 @0 z
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]: x4 T+ d! @1 y4 `/ u' J- u
                },
    3 A% u$ u/ E+ W8 f# r3 u3 [( v        write='result.txt',& ^- V# j5 u; V# I
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',; m& u# v( b( S6 z
            page=[True,"now_url.txt"],
    7 U3 H  A8 W6 w" N6 `        #clean=True,2 M0 E$ Z+ m1 k( ~$ r
            texting=True,
    , N. H; K& ~3 b6 o3 x. F* V; W        # 参数如上
    6 k3 U* i) E/ X5 m. Y        status="between",
    * w% z7 x; o+ t8 p& V        cpu_count=1,3 ]- Y3 k, g. V
            sem=5,
    5 S! R) G, R/ J2 k7 w% v        ###8 M, [$ o6 X/ s7 M
            write_SQL={
    8 A$ r9 [' v2 x! w2 ]% c, _            'host':'localhost',
    3 O$ h& S- a( \            'post':'3306',; I- H! c9 ^& F; b) j! |6 O
                'user':'root',
    9 M4 _5 q2 X' Y( O6 o            'password':'123456',# E. ^$ o. f) A) ]5 C. o5 B- {
                'db':'example',
    7 z' r6 B' {5 I) T( Y* q& @            'table':'example'7 }! ^; N/ T4 R3 w2 \7 ~
                }* t9 a8 I( x% i& v7 V2 j3 Y
    ).run()
    : w; H. H& ~- Q# }' H) M6 O/ l/ F  M3 L, i

    " |  v; l  ?( m/ s9 [功能介绍完毕🤞1 h% a& `. `0 w. p/ w; A, y6 o
    最后还是希望你们能给我点一波小小的关注。; Z8 u% O: ^3 z7 O) E
    奉上自己诚挚的爱心💖  q: E! I* X" M8 f
    ————————————————0 ~( J9 Y/ d1 l+ d) i9 W
    版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。" o" D5 u, u* S4 J# L- ]0 I: t6 w' k
    原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684
    . @. r9 D) N4 M" {4 }9 ^* K6 u; m, M: ?8 E0 Y( h  K1 p
    ( S2 u& }7 r6 r9 p6 r" s/ D$ b, e
    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-6-11 11:10 , Processed in 0.460532 second(s), 55 queries .

    回顶部