QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5539|回复: 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_crawl5 R; K4 D  `" E/ }, E
    simple_crawl
    0 Q. U6 K* u1 @" \3 D8 R0 j# @仅需一行代码即可达到爬虫效果
    1 }4 z$ P. A; S- w5 u- s: K; a项目地址(欢迎star):https://github.com/Amiee-well/crawl1 c1 s' S  W4 ^2 D0 o3 u
    使用方法
    . M) K4 s3 w, E4 m- S8 \pip install simple_crawl) z# v# J+ k' V, E5 R) e

    5 K/ z: u8 \# v### 以下源代码为简单介绍,详细功能介绍再源代码之下
    ! @( ^1 j, G9 G" x- Kfrom simple_crawl import request
    8 X% \% P; S3 C1 }' r& D4 k0 F+ Hrequest.parse(9 x  O3 u. \! [  d) ^# B; E  c
            # status 参数为运行状态,支持单线程多线程多进程协程以及联合1 P/ t- |) [+ {* S/ K
            status="aiohttp",
    7 p! X# o$ A% c/ g* @% h5 g3 j7 y        # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式  [$ @) x6 N; i$ U/ ?" @
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],: a7 |5 e$ Q# s. J
            # login 参数为获取登陆信息,如淘宝等网址需要登陆信息9 H7 m3 Q5 q% a
        #login="taobao",2 C( r( }4 K* g7 Y5 h: t" G
        # type_url 参数为返回源代码格式,支持text和json,默认返回text
    9 {8 ]- A9 L' W/ K6 M3 _7 \0 J/ R    type_url = "text",
    ' H0 e/ X% L8 e8 h6 X" b" P5 [    # Parsing 参数为解析方法,支持re、xpath和beautifulsoup
    2 Y5 H# [4 |: W7 O    Parsing = 'xpath',/ B* q; }- [0 h  y5 \  n- F5 u
        # label 参数为爬虫解析过程,字典格式,详情见下方. B6 M+ G3 G# f7 k
        label = {
    # y% ^7 _% Q4 e0 @            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],; Q* Y5 X! k: u& F* |- N: B0 i" ~
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    # n* k: [) S1 }% w# `, E, `            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    , \, t6 ^8 E. O% c' c& G     },; s# I# L) U& f. g! r  I
         # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱
    5 t6 f/ L# j5 l     write='result.txt',
    , {5 e: L5 _, F     # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫
    , ^& D5 R+ ~: ?     next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',  }" A! p7 m( b4 E- @3 z
         # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫# }. A' }! Q2 }/ z8 L0 K( r
         page=[True,"now_url.txt"],6 _/ K9 \% b5 o- X% w6 r
         # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息
    . m1 M  e' [: t& ~     #clean=True,
    3 B3 L8 R8 _, G8 h7 z     # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序. E( f7 |# t2 I1 i6 ~2 R
         texting=True,9 I: ]4 t$ W& y  a. j  Y6 i
         # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态
    * [+ f' |, ~3 v: R) r     Thread_num=3,
    $ A4 S; [4 P$ ~- j, V     # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态# ?$ z; A0 z# p( V7 S+ t
         cpu_count=1,1 _6 B4 ?; \  x7 |* D( y
         # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态2 N; C" s* q! `6 X
         sem=5,
    ! \3 j3 Z+ `/ ~. q( I, H2 M     # write_SQL 为是否写入数据库,默认否6 v% `. c2 R5 a, q
         # host 参数默认localhost) Q2 t/ w, L9 C$ L
         # post 参数默认3306
      R+ N% \; V- a6 C- q) R     # user 参数默认root
    & [* a$ i" R" h* g& t' O     # password 参数必填,必须正确/ N9 R* o* y: b1 ]' f0 t  R
         # db 参数为即将存入的数据库名,若不存在自动创建1 Z4 ^8 S' l3 M( i% O3 U8 l
         # table 参数为即将存入的数据表名,若不存在自动创建
    - ~( Y- n8 I7 `0 p& L2 O     write_SQL={% ], g$ a8 F( o( Q. r4 U; C6 ?' f7 N
             'host':'localhost',
    * m# S2 S$ y& i' h         'post':'3306',% S% v* c) J! k8 w4 H0 T+ o) a' _
             'user':'root',
    1 V) L0 C1 S# u: n' p  b: i' ?4 M         'password':'123456',* H6 V8 X$ }3 }5 h9 G, ^
             'db':'example',0 y1 E5 z! ?- t7 ]4 _# e+ x
             'table':'example'
    3 R8 @$ M' e! k- l& h( W      }0 w. E" K: A) j) x' L3 l/ P) X
    ).run()! e3 z1 b' D" q; p
    ' A9 l' R, ?3 Q. O" Z1 u
    介绍一下crawl参数设置:0 [* q) z5 J- E' l# g* `
    7 t- k/ ^  x- G) ^; w$ L! C( y' I; j
    '''
    4 y2 ~3 _7 l; K. ?4 x3 X单行代码爬虫程序执行
    9 \/ Y2 |, X6 A7 J* J% ]) z! L:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档
    + ^- H- g! M" p! g+ J:param url:即将请求的url地址,仅支持get请求
    $ Z% t( |* A" R) @% N) ^3 ^+ c8 ^:param type_url:请求url后返回格式,支持text和json格式返回  Q6 ]6 U' p; E, O9 ]) I- Q
    :param Thread_num:即将启动多线程个数,默认为1单线程4 U. j6 z. K1 B0 J' I
    :param sem:协程信号量,控制协程数,防止爬的过快,默认为5
    * h. z& r: m4 ^:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半
    ' n' s1 t9 C) S- }6 _:param login:模拟网站登陆,保存登陆信息
    4 d: u" g  P% V9 E/ o:param Parsing:爬虫方式,支持re、xpath以及bs4方法
    & w( W' M, v$ t4 ^% R:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,
    , P$ G$ Y; y4 c* z                       多次报错结束程序,默认否
    ( p5 |7 M" ]6 p5 Q:param label:选择器内容,字典格式保存,4 M7 H% T4 w7 Y$ V9 G$ f. X* s! _
                         字典值为列表格式,第一个参数为选择器,第二个参数为转换类型0 |( R& S3 U: }- E, q  B% Q* D0 R
                         第一个参数必填,第二个参数默认str类型
    9 G/ y- C6 J: s! K% H:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否! q1 h. X, z6 x( U
    :param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫
    % Z2 \1 k6 T" P& Q) S:param page:是否选择断续笔记接手下次爬虫处理,默认否4 ^9 a9 S* F* A0 B+ f* q
    :param clean:是否进行简单类型数据清洗,默认否9 D: s; @; [) L$ @" Z- S- b7 n
    :param write_sql:是否写入数据库,默认否' e- A+ K5 i1 a0 T) I
                             'host'默认为'localhost','post'默认'3306','user'默认'root',
    " ^" s9 n) W. z, P) ]  V& I                         'password':'密码','db':'数据库','table':'数据表',
    . }6 g* n4 N1 Z% @" t                         检测库是否存在,若不存在则创建,若存在则直接插入,
      B2 C8 M6 g' p; w7 ?                         检测表是否存在,若不存在则创建,若存在则直接插入
    5 g* N0 C' B' W) ]) O:return True# q% k: v4 h* a. e! ^
    '''/ o% `+ [+ h5 W% H
    介绍玩法6 t3 u& j# |5 F. Z
    接下来介绍的均为调用第三方库的情况下运行:& j! r( u* Y+ |; A: @2 n; F2 O

      i0 a5 u/ l: tfrom simple_crawl import request
    ) P$ e  ~$ M  t2 H/ T- j" {第一种玩法:输出源代码
    1 h" ?3 c5 b  U* i6 U0 z调用requests库进行源代码请求。8 F7 l7 ]) m- @  b
    6 k) n, E, _- @4 C, j# B, S% ?
    特点:
    " i; _! x' U  k* |* v* J请求失败则调用ip池处理重新请求访问,
    & E$ Z4 `7 N7 f! o# I8 @出现五次失败默认网址输入错误。
    & h  ~' P7 }& Z; N支持text以及json字符串返回。默认text。/ C# I5 K$ B& X2 h( S) x. x8 p4 B
    / C& L' j3 H% [! N7 r' H
    缺点:
    " B5 `8 e& u1 q# o2 [! ]+ e7 l5 w. o# d暂时只能进行get请求,不支持post访问
    2 h  `% E; m; c- m+ j: w
    - H% t, M/ J* c, K:return text or json
    6 {8 I8 a; j$ w* W6 `% U8 x% f- `$ q( W+ T) Z
    request.parse(
    . Z2 k( x3 N: a; y        url = "https://www.douban.com/group/explore",) M* q. N9 B; J) ?
            type_url = "text"
    & @; w; G5 S9 e8 B9 k6 r).run()
    4 r6 Q0 i; B* O4 G4 x# return text# c1 ?& x7 W( z
    ( A! \- r8 N- _% A. Q8 ]
    第二种玩法:模拟网站登陆并保存信息8 b8 J( r8 L* s6 X
    调用DecryptLogin库请求登陆访问。
    - V) |1 f: c/ a- K- |$ w8 c! ]! g) z, u; {
    ps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源
    , D  ?9 v8 g5 q. C在此放出文档地址4 B) W& c& j- {# A  l/ X5 L
    DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/
    % N- ^! r0 ?* b+ u3 f* ~$ I/ ?" M7 g' ?/ n: e5 W
    特点:
    ' Q  ?3 N8 n+ M6 J$ H" x将DecryptLogin库中二维码继承到此库(非二次开发)1 u; t0 ]8 N7 p4 Z! t
    支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)
    ; M! C  A# C( _7 _; B# r& v# K保存session.pkl信息到本地方便下次登陆运行4 ]7 y# l8 c0 s& W1 Q# h
    3 Z. U% M( }- m- K% J. m1 z& B2 G
    缺点:
    # O- m" y0 h. @/ Y. j9 A& N9 I  Hsession.pkl登陆信息过时无法自动删除。
    " ?, a/ {1 G) t3 x( {4 ~6 Q导致下次登陆疑似cookie无法正常登陆。9 B- m: z) k( b, [, @' `
    + y/ e7 N. @0 n4 F! F% c4 s
    :return session/ ~7 d. K5 H, F( U: N0 ]2 r& \
    + X+ [# o9 ~0 B6 A6 n  M5 ^
    request.parse(
      z" @# x5 _, _2 H6 o        # 臭不要脸的推广一下我的店铺
    $ x2 {# r- N3 f: ^0 t, e        url="https://shop574805287.taobao.com/",& W( A- ^2 e/ }
            login="taobao"
    ' L! l+ A' _7 y8 y: l/ u).run()6 W$ }0 u+ d" b0 U" @) F0 ]4 ?/ Q  o
    # return text
    - f$ J" K- Y1 _# j5 S, B* x# C, X# P3 r9 J* w% S" V* Q
    第三种玩法:爬取网站信息
    : \  U) Z9 F" q" g7 x: R2 x% r爬虫库自然少不了爬虫的过程$ P- i+ m* H# v2 S

    ; V( Y& M' g1 ], w) Q  e特点:
    % F6 ~, h* k9 W6 ]7 l4 t, r( b支持re库,xpath解析以及bs4选择器。5 f: n& B, E/ m) x
    爬取方法为字典格式。单方面输出。4 }3 }: K+ W& A% e9 o
    字典键为保存的字段名称。
    / ]8 K4 H& ~, h. s字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。
    # _$ A1 T1 u# Y+ f$ ^$ I/ E" n; M$ u( y5 F5 G* @6 n6 J1 S  z  D/ M$ q
    缺点:暂无(等待小伙伴们发现)( y- z9 q$ x& I) W% k

    ) T/ B8 O7 P. w:return reptile_results4 {5 y# _/ G& `% p6 u/ [  c

    6 b, [: [" |# a; P! h: prequest.parse(
    9 W8 t0 F3 D9 {        url='https://www.douban.com/group/explore',
    . G& c. }% X1 ]  I7 B        # 字符串格式,选择器方法。" s6 Y* W. X& h7 B3 b
        Parsing = 'xpath',
    & _+ a, T8 J8 f9 `6 Y    # 字典格式,参数如上。/ @. s) v+ J1 ]( O& J) U" u
        label = {
    1 Z- j& }- h# m# k$ V* Q        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],7 B' e9 }$ m" x2 |  z
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],( I2 u; u: Q# [7 L
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    4 ?& P( C# L8 m; D& Y        }; v3 V# c9 \. |% g4 v
    ).run()
    / Q( v6 {1 l$ ~+ T4 A' {/ p) T( P, @1 y( h( S# return reptile_results(list)
    ' i% @; s  e: s5 x# m- U& W) J. o+ r* k
    第四种玩法:自由保存信息
    6 i% `. ^- E/ D: W$ _, M目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。  w" H& h4 W3 o1 R' b
    - y: Z' f. n9 F+ Q7 N+ Y# O
    特点:0 |, t9 {& o$ x% k1 G; N) S
    写入文件均为数据格式传入文件。
    - _# a3 z( m# q& y" j: G) H4 o且输入格式规范方便阅读and省事。
    ) c% g  N1 u$ r! K+ D( P
    - {) c0 H, ]0 _2 K2 E缺点:& G) a# K$ ~+ a+ c4 c6 ^  E- k
    保存格式仅四种,
    % s# i$ [/ _; o' j8 [/ s不方便用户之后读写操作。
    " B+ v. g2 @' I( Y" U* `# q2 x# c/ x) @3 ?$ B; Q" s, |
    :return file
    $ s% }6 Y# v/ S( U" R" v7 ^
    8 O& U- t7 D& ~request.parse(- B, `8 ?* w/ }6 \; R, d3 K
            url='https://www.douban.com/group/explore',1 \0 \! }/ r) x
        Parsing = 'xpath',' }" }# ^- p4 ]: C) i0 q
        label = {' _; l; E/ k6 a+ g8 y. M
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    : j* {4 m% `' `6 O% N        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    1 s; Z, Q1 Q& [7 i& S, K' ?        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ( |6 ]$ `2 K# ^1 v9 k        },) h. S* U- }4 Q+ i) @4 F' B
        # 字符串格式,具体保存位置填写
    $ P$ R) J& s6 u; o! G% i    write='result.pkl'# B9 R/ [0 K( L$ L5 h
    ).run()
    . M, }) k, s0 ~( n9 S# return file' L5 b; x/ Y1 r- Q+ ^5 {" W$ X

    , H2 H6 V; p. X0 S1 {% K) K2 k) i第五种玩法:读取下一页 url 地址继续爬虫
    # K- \9 o- r# i这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~( J; {/ u, o- \- t2 S+ f) j

    9 M9 y! B4 k. Z4 R4 d1 Z# \特点:
    8 j9 F* q5 Y5 X: C: o8 w) E继承之前的Parsing参数选择器选择方法。
    4 O& k1 y. F, ]+ A# W在这里可读取到解析后的下一页 url 网址。
    + {8 ?2 q" W7 ?方可继续进行爬虫处理。方便用户使用。
    % M% v% x: h4 Z. n( B' h
    1 P0 J% M' k4 s. q; q. B缺点:
    6 f- @$ |9 c+ N7 |6 S, V& i( s若爬虫时下一页 url 地址改变,便结束爬虫。
    , @8 e' |: ]; }8 ]4 W只能爬取所给 url 地址中的信息。
    / b% k  ?4 N2 {' e无法进行某一界面的多个网页爬取返回。
    . p7 b: y8 _3 [. H2 B造成访问页面单一流失。
    & Y" U7 z9 ^) K: f1 _" \) W
    ! C' @) @3 w$ m8 q2 @:return None1 n$ }! M) q. H( f- b3 |
    ! A, v* J2 o' L$ o  P
    request.parse(( N( Q7 m) J, U. {( z3 ?' _/ I
            url='https://www.douban.com/group/explore',8 \' h3 g3 t! E7 H' h
        Parsing = 'xpath',
    ! a  J: v: C$ g. F/ X9 D/ L    label = {4 n6 m* y" w* J% L+ |0 e
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],4 S+ O- Y( L) U/ t4 B' ]3 ~- Q
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],7 ^; t* R8 w4 B! n- w( ^
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    & ?% b, y' P0 L4 v, A1 O8 v( ?/ s3 q        },
    8 a6 ]2 `) _+ M3 j    write='result.pkl',+ L& A' Y, {) N% F* `& G2 T
        # 字符串格式,根据Parsing方法继续请求下一页a中href. w+ A: j7 w- M, h: i" F
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    2 @! l# }" b8 U2 e).run()' B8 H9 Z3 s8 ?: P+ p- `
    # return None
    6 g" s  F* I1 I) p- T+ x. S5 s+ t. ~5 v0 G+ h! W/ C* |
    第六种玩法:爬虫网页保存
    & f* U" s8 j5 ^9 S听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!" {8 W, _- S0 O! l; d- m6 A

    ; x" p4 E; p3 k9 M特点:
    1 h! Y2 U  L' h+ V! C持续输出断续笔记。) Y0 Z, V( t5 \$ q# m. E
    将此次爬虫的 url 地址保存到一个文本文档内部。6 i* z# O. I: I4 |+ G; n# Y2 i! N
    下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。8 Z7 B. G, E2 X/ }1 o6 [

    & F) c: x2 A% X6 i+ Y9 t缺点:4 }& S7 Z+ p2 x% S3 f2 W( |8 G2 a7 o
    读取内容不单一。% Y" C% W2 F) ]5 l! W* @
    导致下次爬虫无法正确读取上次爬虫留下的痕迹。
    9 D+ Y9 O% |( g# y; K# y% B& i% w0 l1 y2 ]; O- T# @$ Z
    :return url_file
    5 E$ s$ K$ x: e; S1 [$ [- H' x& L% M- V. R( M3 q
    request.parse(
    " I$ v2 d: i. k, x: d5 D    url='https://www.douban.com/group/explore',
    & k. l( Y. H7 e    type_url='text',
    : i* m$ o7 P; q( [/ [    #login='taobao'," g* B/ Y& [- z' w
        Parsing = 'xpath',) J( t! V% S! R: i
        label = {
    8 J2 Q& o5 G0 ]+ C' t6 G        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],. P9 b  R" |+ p' @5 c
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ) l$ K' D2 b' Y9 l$ J        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]! X7 ^1 Z) g+ n0 H
            },
    2 v" Q) s% \# s! P$ Z8 i: @# `2 ~    write='result.pkl',
    * y4 k7 v' y) b0 E" a0 h    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',# l5 B, |; Y6 @  E  S$ ~) r6 T
        # 第一个参数为是否需要断续笔记。4 p! K1 W2 V. u) v( P, D: j
        # 第二个参数为断续笔记保存位置。- O( b# Z3 M" k+ d
        page=[True,'url_page.txt']: q0 X0 a- _! N9 d) r  r& O
    ).run()4 K4 e# S) U1 z4 k1 Y  @* X/ T
    # return url_file
    & r. `. d3 s* r( |, q- B6 S' C. a" {  ?! o+ w
    第七种玩法:简单数据清洗- l3 U; T6 x+ c( E6 ?
    数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。; K8 S+ y! F7 K1 ^6 M! V5 l7 E
    : g# {: a! e0 f; o& |7 _9 y
    特点:( W( V% D0 L5 i/ H5 J8 q! l
    本人曾写过一个底层数据清洗。
    ! q; E/ [- }. _) l7 B5 G0 m能将列表格式数据进行归分清洗。. d% s- O: G# T! F6 Q4 _
    主要内容请参考另一篇文章
    4 v2 e/ i- w' P: G3 G如下连接:数据清洗
    8 d1 h( h; r6 m! M
    3 U3 m# \5 ~7 X- ^" _* H" L; O缺点:, R: B& n/ _7 E( [1 g; V  m
    数据清洗格式简单。7 }9 R3 s+ G- A* J
    数据清洗内容单一。
    7 K( k7 C' w. `7 W无法完全做到绝对清洗。
    ! q( I4 m5 b7 @3 J有待改善。6 Q; x6 l  x3 E5 M

    9 K. m, N1 j% H5 r* j7 z:return keyword_list, value_list* r6 T( |3 w. ?! a( V

    9 a' s, V  u/ [) \) t3 d6 l7 frequest.parse() y1 C, E: H$ f3 v' ~, u
        url='https://www.douban.com/group/explore',
    4 s" r+ z) E- }5 E    Parsing = 'xpath',
    4 b! z$ V9 X' A! H$ `8 p    label = {
    9 w( Q9 C- U8 s& D7 |, H* t& I( F        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    8 c/ x6 O" v4 [# ], v' x        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],: Y6 a: a* }$ |9 w
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    9 l* {! m3 z" u/ R2 ?        },
    1 w" g5 m& R% V$ ?% c5 A1 |6 L  e2 F$ v    write='result.pkl',
    9 A9 z! b3 ?  x! U1 g    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',/ }7 @2 N- i. V) k" e5 W
        page=[True,'url_page.txt'],
    : O3 M8 s2 g/ E    # bool类型,默认不清洗6 L- A+ H1 N2 D0 @' H0 }; g
        clean=True& p+ ?! V8 r" _) a8 P' ?
    ).run()
    2 z- a4 e( s" I) |5 f5 x7 w& J# k8 R! Y" o) W
    第八种玩法:爬虫存入数据库
    ! I. D" ~, S2 b9 e4 M  `存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。
      \. Y2 X8 W$ Q( H9 _- B/ y9 x8 R7 O2 z) F
    特点:
    / x' Z' i& t/ b% s7 r信息存入MySQL数据库。
    : T9 d( s1 d  J( z/ f) B; ^9 h2 U可连接docker远程数据库。
    - n. D, w7 X, Q5 C. s. U数据库的库名可以不存在。
    $ {) X3 A" U- f数据库的表名可以不存在。2 L9 V$ \0 Y, @) @
    根据之前传入字典键与值参数判断表类型。/ w0 {0 u! m; q( B) w
    自由建立数据表传入信息。' C5 [+ Q! A8 ]

    % r8 R, @6 s/ ~  a4 R缺点:/ p7 h0 a3 ]0 |$ n
    仅支持MySQL数据库。5 z  B: x4 E" s
    * ^7 m1 W9 u4 w5 d1 P4 D& w6 l0 K
    :return SQL. Y( G2 ~( D9 T: N

    * |3 Z- G( L0 P* krequest.parse(, j; M' Q8 U" O7 o2 X- C! s% w
        url='https://www.douban.com/group/explore',5 G2 ^7 x' I" q7 o3 h4 d
        Parsing = 'xpath',9 ]$ l$ \- J! x
        label = {/ v# B4 X4 y& j4 E, x. ?
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],  c7 u& P) T) b1 n5 S% S( V/ s- D
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],+ R0 s7 O& B4 @0 B- Y- i. t! ~
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    $ d5 H$ A4 v) s2 T1 n        },1 I6 K& r8 C5 \, c0 |7 o6 Z
        write='result.pkl',
    0 e# |6 I- ^5 Y2 o7 q3 y$ E    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',& G& R8 p' `; |, x8 O. ^
        page=[True,'url_page.txt'],
    3 O! h2 D, C' ~! i( _- l9 j    clean=True,* e; E9 O9 V' N$ @1 S+ G5 o
        # 字典格式,
    6 d3 }$ e, R5 U    # host可有可无,默认localhost
    ; r: N/ p: f- d6 O3 S% u, _! y" Y# R    # post可有可无,默认33068 \" D4 V* n5 w+ O7 }- D5 N4 ~
        # user可有可无,默认root8 N# Y9 Z; A/ Y( I+ m
        # password必要参数,数据库连接密码7 Z  v; I( p2 `& K
        # db必要参数,数据库即将存入的库名
    5 D% l; x* R+ M    # table必要参数,数据库即将存入的表名
    / ?$ K- ?: F- e- \/ _" C) c9 W2 U    write_SQL={; ?: ^/ }# g! y( N  p& ~
            'host':'localhost',
    7 M- r2 a4 c& C# X9 X/ ?* H' |        'post':'3306',
    1 ]8 {4 d3 {& k# D) q7 D8 F        'user':'root',% n, U8 P7 Q/ \3 m! H. d8 [! |
            'password':'123456',
    ( K' z/ S5 c' [2 Y) X        'db':'example',
    # Z' x% [) R* ?$ x' n& I/ J- U        'table':'example'
    ) P$ n6 \/ |& n        }
    ; B( _4 |+ T: t- @- J: G" c5 X+ i& w) [    ).run()
    1 v6 ^; Q5 Y  ^+ ?6 Q0 h
    # V- }$ R: q; s: L2 S第九种玩法:重新启动爬虫* t1 Y0 D7 L) m1 V
    爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。# E1 `4 A% k  u$ l
    , n8 \" s, i2 J
    特点:
    $ p2 O% x" m( l- l9 o9 D检测报错重新启动爬虫
    ) _9 F2 o* q0 F无需手动处理错误信息
    ' E! \( h' j) R* W- Q3 o+ R: ~
      T% K+ u/ R0 D! v: C" s缺点:* B$ D9 x8 r! w$ z5 l. B0 M9 A
    无法收集子线程错误。
    % L' E% [% D2 k$ J* R! e, L! n: `% M7 k" H! }
    :return None
    " z! A0 G9 h% P3 s( r: u6 G) Z# H7 m
    request.parse(. p1 ?$ x( U! e$ U: n3 z6 w
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],- F* {# p! t2 r/ W, \4 F9 h
            #login="taobao",0 w* d% s2 A5 O( t6 E% M
            type_url = "text",0 V  N) ]- i3 P' ^5 A8 D% z' B
            Parsing = 'xpath',+ w1 u  ?) Z- B, h
            label = {
    0 S  t, h1 W7 z2 n3 A3 t            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ; J# J7 {8 z( C6 V+ k# ]5 s            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    ' U1 i/ S! }9 v. E% E7 G; m- V! m            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    8 L0 p* A! U. S7 u            },1 `) j, o* |8 |1 ?4 a5 A
            write='result.txt',9 ?% M* J& M% A4 y" \8 ~
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',/ i! O1 {/ ]0 q% P: y+ w: j( e
            page=[True,"now_url.txt"],
    $ x5 ^6 }% V+ V  i! ?; L9 H! H        # texting 参数为是否启用连续爬虫
    1 C& p' S7 T1 S* u- S5 e        # 爬虫程序异常报错后重新启动爬虫
    & ~# d3 r! f0 l/ f3 _6 P        texting=True,
    9 C( ^5 B1 r$ Q, w        ###  N6 ?- n" S8 ?( v$ a3 h
            write_SQL={4 @2 Z% c, e1 d5 g
                'host':'localhost',
    1 L- P' I4 B, R8 l9 ~# e            'post':'3306',
      _9 V  H' J# o, C& W3 d+ F7 N            'user':'root',# n4 U6 s$ O6 d# S' q+ _: t: T
                'password':'123456',
    5 Z* d, [# E. {0 F5 X& f+ ~% U$ i4 h            'db':'example',* ]6 @5 Z% [, n# o4 N, p
                'table':'example'
    - h; K2 N+ g9 C2 }+ I% a  f            }
    , F5 i$ L# _4 N. H; O).run()/ t& k; F( C: t3 j  L
    * {* y% H% a8 d" Z$ {2 a) ]4 d9 i
    第十种玩法:多线程爬虫' m2 C' p" `5 R: X% }: A0 {# y
    特点:
    + J7 }2 ?" n! N! p5 a爬虫速度加快,* h; ]* l- N% t8 b5 i! @( h: D
    更好的利用了线程。
    & |9 ]2 T4 }9 n9 `! H" g
    ; t2 a+ L* N. a2 I; u: t2 M缺点:暂无
    # _! ]3 I+ [' T% N$ d. a' \8 P$ q% q1 j
    :return None
    : O1 h' {; D2 }1 v% u' t
    0 H8 w/ A& e4 u# o; H# Prequest.parse(& t9 Y. D4 R' Y% Z1 k+ d& l+ {
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    0 l7 M1 Y$ L0 A0 z        #login="taobao",
    7 q2 H9 H: q& y6 {) C/ T& k        type_url = "text",
    9 z' J* Y) w6 e- x9 ]' Z        Parsing = 'xpath',7 L$ \9 g$ k6 P# @' [  w, \0 o7 ~* k
            label = {2 X" R- A* Y" T2 x- w
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str]," [' w, u0 {9 g* Y
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],1 ?. G9 m9 F. J$ T$ I
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]( k/ Y7 g& ^$ c+ L9 [4 x3 Y
                },
    ; k: y" C( j% s$ A1 L1 T        write='result.txt',
    ! N. G/ J" R% w/ n& |* M6 ^        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',, f+ \$ Z1 U! v3 Q; o
            page=[True,"now_url.txt"],& E% k  \0 r% ^; e# v
            #clean=True,# \, s+ \3 e& w6 g  ^
            texting=True,
    0 p$ W2 I+ L6 ~" a        # status="threads" 启用多线程爬虫
    ) Y( D7 P( n9 ~2 Z9 H- f        # Thread_num 为线程数目,默认为1 单线程
    , K: M  J/ ^+ F' o/ x        status="threads",& B7 x  i) Z  t0 ]# z1 j
            Thread_num=3,  o2 R1 f) Y, Z4 [0 Z0 I5 j9 C
            ###
    % k) f8 n4 E! [. O4 |( q        write_SQL={
    , U5 h9 n2 `7 ~9 l            'host':'localhost',4 P4 P0 C# B+ \% m
                'post':'3306',) L) n# o4 }& B6 O; a, G: Z2 `$ s
                'user':'root',# _( \8 R' e' f$ \5 S8 k$ U
                'password':'123456',1 R+ K2 y( G3 U. p7 ?/ {- ]6 @
                'db':'example',
      `5 i% l1 m% c            'table':'example'
    + m5 `' H1 C( m# g; f            }5 ?9 T- G* |1 _
    ).run()6 `1 O8 D' i& K, Z- \

    % S2 _8 V* B, k* {9 P. s第十一种玩法:多进程爬虫
      k" F/ I  |% T% [. L+ e+ f特点:" m" x/ J& n# f. J8 e4 c+ s
    爬虫速度加快,
    ! e. [1 h4 ^" G% H更好的利用了进程。
    5 J7 @- T8 x+ P; P! i
    & U3 ]. O, S8 ^8 S! S7 v( X/ h% J缺点:暂无2 y4 J/ M9 E% c; K
    # l3 I. h& I8 ^4 ]! i
    :return None
    8 y$ O! U+ e2 ^) |# `& T
    1 F+ C( h& u# G( pfrom simple_crawl import request4 m- S! H9 M. h7 U+ q
    request.parse(, d" U/ w4 j  g5 J! e# z
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    ; j2 a3 Q6 E$ r% ~/ u. u3 o/ H# F# [        #login="taobao",
    $ U+ V1 n/ [3 r, n+ J        type_url = "text",! B, ~4 D$ A0 T; D* u% I
            Parsing = 'xpath',
    # V7 Z1 A% A/ a9 |* E# q        label = {$ J; }- i8 V; s
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    , [# q- ^8 S0 ^& L3 y            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    8 f1 m: _. `7 f; [: p            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
      I0 z& H; y# i; B2 V            },; q% f: o2 p/ i1 X# W
            write='result.txt',
    + @! k9 _& ^% }- V        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    : [' a3 v4 P3 N2 [0 E# L0 F% k5 Z1 Y        page=[True,"now_url.txt"],5 S& T1 r5 D& g2 b
            #clean=True,: i8 `% E. ]6 a  R  r# Y; ^
            texting=True,
    # W# V) ^6 r0 u- s$ U        # status="multiprocessing" 启用多进程爬虫" R- Z4 v8 a! C0 {* l. ~0 n
            # cpu_count 为启动代码核心数,默认为系统核数一半
    ' ~6 i! Q7 I& z$ V        status="multiprocessing",( ]  x3 q& e: V$ ?$ q: S
            cpu_count=2,! j+ ~! k+ B; H
            ###( w, c) f! h2 J  ]
            write_SQL={7 k. m0 z9 T( y& d/ L, t
                'host':'localhost',
    . K5 q% f8 L" l( O            'post':'3306',
    " i- n$ V3 l! E1 V- A+ G            'user':'root',
    ' D8 I' X; D  i8 |6 k7 D, ]7 H( M' M            'password':'123456',
    ' P5 _4 u$ o. o# r            'db':'example',
    ) Q9 `2 n. _* b2 |' ~( J            'table':'example'& C: B. M7 r0 H
                }5 h" r6 C3 M! S% ]) P& p3 `+ g
    ).run()5 X' {9 X$ W$ o" ?' f  H2 v

    6 o: _" Q8 X+ y3 K$ ^, ^) ^第十二种玩法:异步多线程爬虫
    ! F, D( ^; p( \1 E5 C" S4 f7 N特点:! F) O* e8 q5 i3 p
    爬虫速度加快,
    9 R3 `6 t' t  N; B异步使得爬虫无等待时间,
    0 Y! V- x. h) _, _( k同时使用多线程速度明显加快。8 W1 ]' I% f/ H* H. T8 _2 Z$ ?

    7 U' F% h1 c7 _, A缺点:暂无
    ! S4 q% f6 x+ H8 j1 o" R- x  ]
    ! [) W0 Q' p. I& W:return None
    7 F7 V6 Q' E, z) |
    ) k. e  }8 M  V9 lfrom simple_crawl import request
    4 L& j5 A8 Q1 q% ?' w. Yrequest.parse(
    9 I" j3 d$ K/ |6 I        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],7 h* d# C. D, C
            #login="taobao",
    " N+ m9 a: B, [! ~7 c) \        type_url = "text",
    - k1 p6 l: p7 P        Parsing = 'xpath',
      |6 q% X; k8 [" h5 t( r! k        label = {$ D7 {* ^( n. s( e
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    # i( M5 b/ X8 O  h: O4 @2 T1 H            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],' y$ @, \0 h; j9 I! {# ]; y! p' Q
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]/ k0 h. N+ q2 p* V$ Y' T" ^
                },7 _; L' i7 E5 v  c* V, S  V4 q
            write='result.txt',
    5 \% q6 W% A  Z. p& x( ?, g. v, r+ }" T        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    - v) i7 C: n* j) ~        page=[True,"now_url.txt"],
    1 @& q6 e: ?! k" q        #clean=True,
    1 ]8 Q0 ^& I2 u5 B' W4 _4 l7 V  N        texting=True,
    7 _0 {' k% l% h" f        # sem 参数为异步引擎数目,默认为5
    " n+ A: G& U* `" o' t        # 其他参数同上8 K( e3 K. t% L2 E1 f3 x& C
            status="aiohttp",# l' E. W9 g" U" P: K9 Y  w8 b
            Thread_num=3,: @' B! P; I, o) Z8 Z, m" ?- ]
            sem=5,* F& l6 s- X1 o, U% ^
            ###! P' I/ A" N3 `  A4 a) R* a
            write_SQL={
    ) ]" @0 p( \: f* C6 F& i            'host':'localhost',7 J% `  ~* ?: h4 Z- K# ]5 c8 k
                'post':'3306',  o9 l5 p5 n  K" u
                'user':'root',% P  V$ I+ j" b2 K9 z' k# y
                'password':'123456',9 Z) s, n2 @- ~
                'db':'example',6 R" V, _6 Y# X" y% z
                'table':'example'4 ~* A( p. j- a% D
                }' z. D! l$ r* I7 N/ r
    ).run()
    , m# K7 F( @' K! r# P
    2 g/ C1 M0 M6 Y: \1 I3 u第十三种玩法:异步多进程爬虫
    - x9 \/ y6 P/ ]' O% Q特点:0 a% J/ ]/ H4 ~# }, l; u9 x6 N5 _& N
    爬虫速度加快,/ c) ?1 ?1 x- \& U/ K& t
    异步使得爬虫无等待时间,7 M6 e5 n1 i9 q5 v. Q. S/ x
    同时使用多进程速度明显加快。) n/ ^' m( w- D1 a; x  E
    5 K" \) J" c; q
    缺点:暂无* P9 O( k, k, [4 S* }! a

    1 C- Q2 J! x! d. p:return None
    . F, Z8 l& e/ h% p8 E- s/ T! n; F# M$ {) K+ k) i8 D) w- ^
    from simple_crawl import request4 y9 p. Q" N/ ~$ D' n5 R3 S
    request.parse(0 m! G; U' o& Q1 W2 }
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    8 F. S+ S2 R) k9 Q. s        #login="taobao",/ |, x5 j! A0 G3 K: D
            type_url = "text",! H# {9 Z5 ~5 M
            Parsing = 'xpath',
    1 r& T- ~. d( Y  S& ]  g5 F        label = {6 G1 b3 t) g* v' J8 K
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],4 q: y# i# H8 [" a; d
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    8 G+ y+ o4 I! T            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    4 h4 f# b" c& G' J8 Q+ V+ M: k0 E/ @            },
    # [) d/ C  r" `8 F+ ~        write='result.txt',
    / ~# K, e& H- s7 L3 u2 V9 h. K        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',+ G" ~4 ^8 U2 @" V
            page=[True,"now_url.txt"],
    . L* m8 Z- D( r- J. W        #clean=True,
    ( G6 B/ H. L: X2 N4 \        texting=True,
    5 p# b1 J4 }3 p+ ~" R* ?7 W2 V  G        # 参数如上6 T$ G% N& a% r! p
            status="between",
    + ~- B2 a; I0 k  d0 i" C" @1 r        cpu_count=1,8 a; y/ V0 a! c( c7 w7 B3 F6 Q
            sem=5,
    5 ~0 R8 X3 G1 D% E5 o; W: Z+ a        ###
    $ }0 e, o- ?7 `) @) G        write_SQL={3 b& h2 G7 B7 q. t' `* v3 c% F
                'host':'localhost',
    0 r1 G# `7 p4 q7 h! B! _            'post':'3306',  f( n0 T8 a7 W& k& w
                'user':'root',/ X/ V- c' X0 c  M/ t
                'password':'123456',
    - o+ B) m$ G1 _+ [$ f' {3 H% D: j" j            'db':'example',  @* s8 T( k8 s& ]% n) z7 k
                'table':'example'
    " f; _/ S; j3 H' f+ j            }
    ( T6 C+ Y9 z3 b- B3 o).run()
    3 \/ e& `, z! n* Q$ t$ B. J  V+ `
    0 D) o6 S* Q) b# V" w$ ]- S( Q6 c7 h% r# |4 K6 N% D& b8 B
    功能介绍完毕🤞
    3 [5 O7 [1 {. y0 B7 e最后还是希望你们能给我点一波小小的关注。' v  U# S" K: `: {. {
    奉上自己诚挚的爱心💖$ W# |6 {2 Y/ g
    ————————————————
    2 _0 {% Q$ u5 ~版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    6 E' K# i6 {6 X- x) X% t原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684
    ' i' q, I  p/ i
    ( j9 t( ^: W" g' p2 W
    3 q+ D! _: u' [6 t; f& n
    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-9-22 23:10 , Processed in 1.058408 second(s), 56 queries .

    回顶部