QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5431|回复: 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_crawl1 `* {6 X4 ]7 k5 L3 |0 Q& L- }- {8 I
    simple_crawl* x" A" L0 l% b" a
    仅需一行代码即可达到爬虫效果2 N+ {! X( h  i+ l; r. M( ]
    项目地址(欢迎star):https://github.com/Amiee-well/crawl
    2 F; M8 y/ X. {+ L$ b1 O# x使用方法
    " F  V8 }( B4 B- F! G6 S* gpip install simple_crawl8 e/ W" [' {0 M6 J% f+ x
    ' d/ |9 V0 J# m2 x
    ### 以下源代码为简单介绍,详细功能介绍再源代码之下6 G: x3 t: I& n7 _3 i
    from simple_crawl import request, Z1 _5 V8 V; t/ O: P, T
    request.parse(
    % I+ J: s; ^- z1 M4 U- [        # status 参数为运行状态,支持单线程多线程多进程协程以及联合$ J- ^. Z  G2 D* F8 b/ T! d* R
            status="aiohttp",
    ; }1 e3 Q: E5 M5 X        # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式
    3 J' _1 N: v, ?0 N; y7 h        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
      W5 V, O- @7 F& b/ X        # login 参数为获取登陆信息,如淘宝等网址需要登陆信息% v4 y  \4 g; R9 L! U: J7 m% P
        #login="taobao",6 j8 K9 j% k7 E2 L$ W. c+ }: E
        # type_url 参数为返回源代码格式,支持text和json,默认返回text
    2 D, c- M& ~. n4 W1 [0 o, f    type_url = "text",( X3 D9 N7 z& \0 C: D  X) p( f' k
        # Parsing 参数为解析方法,支持re、xpath和beautifulsoup
    + O7 B0 p/ f! W    Parsing = 'xpath',  i+ X$ U3 x7 s" e/ R3 V6 r" _2 a: W
        # label 参数为爬虫解析过程,字典格式,详情见下方
    6 l% ?; B2 |( Z# T0 b6 N    label = {$ x, Y0 A8 _; N& Q- A0 C
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    ! _2 o) f+ u# I8 W* Z            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    2 V( ~5 T+ e) o; o5 l- F" A            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    7 g* d5 Z9 ~( H- j4 c" r$ g     },- G: b% B& I3 G6 z0 k9 N; ~
         # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱
    1 p- g2 O9 I9 Z. l& \     write='result.txt',
    & I2 Y( h* w0 `, W! p2 S     # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫5 m  `& D  l! O
         next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    ' {4 Q( r  C8 J7 S# v     # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫- m) a. i5 D/ K9 V# v- @7 V' v
         page=[True,"now_url.txt"],3 z; v) v0 n' |, r# B5 z
         # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息9 F8 D% H: h5 E1 O
         #clean=True,- i4 E; n0 h: v$ V
         # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序
    . ?% z( u0 u$ \+ {     texting=True,3 {* g* P+ F6 u& X
         # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态
    2 K; z( U7 i& R  \; v: o0 a     Thread_num=3,
    - {# D1 ], U3 u     # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态
    5 B; S' h2 E- n) {" E     cpu_count=1,
    " q, A6 @& n$ B* \/ V% {8 W     # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态6 X, U# F1 p3 t
         sem=5,
    0 w8 \+ ]$ Y, j+ m' O     # write_SQL 为是否写入数据库,默认否
    ! i/ T- s2 S, |$ L6 }! P1 L" @     # host 参数默认localhost+ F1 f" y$ F! }: f8 J
         # post 参数默认3306
    / m! X: ?# j* F8 |, L4 C" i! x     # user 参数默认root* v0 g( i+ s7 @, W
         # password 参数必填,必须正确
    + E! N. I* s1 I+ k! O     # db 参数为即将存入的数据库名,若不存在自动创建
    6 ^# R! A1 n4 ]3 x5 i( o! @     # table 参数为即将存入的数据表名,若不存在自动创建! X6 O. h/ }; ?  ~
         write_SQL={% a/ N7 O6 l  U2 L0 ~* @1 u
             'host':'localhost',
    & g$ I& I- q0 j" C. @/ k! y         'post':'3306',
    3 [& A3 R4 V' c7 M# J6 a5 k) E         'user':'root',
    ! W! d* T) z& D' K+ F         'password':'123456',; y; {: J, f' e2 v, O
             'db':'example',& v* `$ @" {6 L! g3 B
             'table':'example'. w6 v: T. {2 p2 L6 _
          }8 X5 \, K# @$ e8 p$ v; F
    ).run()8 H* \% a; i/ R# d

    & ~7 P7 S4 B5 r1 K6 K" @介绍一下crawl参数设置:
    $ v7 n5 J/ G: P
    ! e! U( U. r: D* z'''
    7 z% _8 S9 s/ z5 {0 s$ t, G9 E单行代码爬虫程序执行
    ; C+ o6 X# G1 g4 M  W' J: @/ e3 Q:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档5 Y, \! v' ~9 P" L$ M
    :param url:即将请求的url地址,仅支持get请求
    5 t5 D' A/ r. O6 S9 P:param type_url:请求url后返回格式,支持text和json格式返回
    % X2 z7 N/ L1 Z& |' |5 y:param Thread_num:即将启动多线程个数,默认为1单线程$ f# q& r: U9 k' c9 T2 m; }
    :param sem:协程信号量,控制协程数,防止爬的过快,默认为5: u+ u) |! z! Y. [+ z
    :param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半' t  l$ |" k, K; q' K
    :param login:模拟网站登陆,保存登陆信息
    8 x; E/ k$ H' \3 j% Q4 k:param Parsing:爬虫方式,支持re、xpath以及bs4方法
      |* v9 I1 I0 v" f! Q+ C:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,
    / P# U, h/ \* t" `5 a                       多次报错结束程序,默认否" [9 o9 q% h; r, c- X
    :param label:选择器内容,字典格式保存,
    9 a$ r* E8 _. J% D/ k3 P+ j9 ^                     字典值为列表格式,第一个参数为选择器,第二个参数为转换类型
    3 X6 c; V. E0 A: H6 W                     第一个参数必填,第二个参数默认str类型
    0 f5 s8 p! G$ _4 I( ^3 n2 w5 i0 q:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否
    4 W9 S3 }$ x% M, M:param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫" R+ ~* V+ I$ C* Y* |( w6 `/ Q
    :param page:是否选择断续笔记接手下次爬虫处理,默认否% w/ l0 L8 e* |: I/ ]1 N
    :param clean:是否进行简单类型数据清洗,默认否5 M2 G2 c2 x; M! p7 B; K. R
    :param write_sql:是否写入数据库,默认否3 |( o% l1 k7 I
                             'host'默认为'localhost','post'默认'3306','user'默认'root',
    + y& X. p% z9 D# W                         'password':'密码','db':'数据库','table':'数据表',
    4 \3 e1 o* [4 x& k. |- B0 S  o                         检测库是否存在,若不存在则创建,若存在则直接插入,
    , d0 M+ h2 I* b; l1 u7 z                         检测表是否存在,若不存在则创建,若存在则直接插入
    / J: G5 `9 }, o5 N:return True
    ( ?# r0 v* v5 T# x1 @'''/ O* B$ ?( Y5 a3 N  Z; x
    介绍玩法
    $ S" g3 j1 S5 h# w& v接下来介绍的均为调用第三方库的情况下运行:
    ; @/ O- j9 |$ I# d* e
    9 L1 L: X* ^1 z1 Qfrom simple_crawl import request
    " G3 y! l; L: L# B) U. ^第一种玩法:输出源代码
    4 g9 j* L% J" ^- ^% l调用requests库进行源代码请求。% [; s7 f* I9 T' ?( F6 |. R
    - g. p& p" _9 s7 _
    特点:
    2 u5 F1 Z% }3 s1 G) Y9 Y$ A- h, g' f请求失败则调用ip池处理重新请求访问,
    . x8 A! a0 a$ r) W  I5 C3 W出现五次失败默认网址输入错误。$ I4 w0 K" v' p2 k
    支持text以及json字符串返回。默认text。5 {6 v1 q0 g9 R. C6 u- {, R% C- A

    " \% U) L) `* p4 ~# q缺点:
    9 e# e% q3 {6 F& H" j4 ]5 R暂时只能进行get请求,不支持post访问
    - I8 _  C; c% D2 v7 j. |+ d+ w' y2 C+ f: {! S
    :return text or json! c( z% A; _) m" u9 X

    $ F; n& i% E# N: {+ ~; w( r3 Urequest.parse(
    ; |; y; g9 u7 o0 s        url = "https://www.douban.com/group/explore",
      E" P! K! v8 r6 m+ i) z        type_url = "text"
    8 P9 I+ A$ O: p% d- [7 l).run()
    0 t) Q' C7 H7 i1 b, v, n( t# return text
    5 C8 _, f3 f9 x$ R6 P3 \: V
    1 d1 U! D3 I/ C( L) Z8 ~1 f+ u2 I3 v第二种玩法:模拟网站登陆并保存信息, T5 J# m" Y% F/ Q- C( _
    调用DecryptLogin库请求登陆访问。
    $ [7 ^6 l8 ~* @* F  o8 `2 `: {& X6 V
    ps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源
    4 I" M3 P" l! v; }在此放出文档地址: h; C' G7 n, N4 M) S  |
    DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/8 s: {6 w) _/ `1 T5 k' @
    8 T7 s  m7 ~, t, S0 X8 a1 n
    特点:" L- x9 T; Y) A, ~0 v( p8 f
    将DecryptLogin库中二维码继承到此库(非二次开发)8 A& h! \3 H# @3 g$ b
    支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)
    - w% S6 e' e0 I/ p2 v/ E. j& L保存session.pkl信息到本地方便下次登陆运行+ B( N: \2 ?" T( `6 K
    ) F* s/ O8 y) R4 I5 t5 X) S1 ?
    缺点:
      A7 E( _! i' E: C+ n8 N+ B; i/ Qsession.pkl登陆信息过时无法自动删除。
    & b# |% c2 x0 c8 ?& g: Z0 _导致下次登陆疑似cookie无法正常登陆。
    * ?' x  G! Z' g: Q
    7 r! u0 L" G8 Y$ ^1 o# h. F/ J:return session
    ) l& u8 x! |% s  v. D0 z4 g' F$ }7 u9 B4 E( d, F+ l$ w
    request.parse(: d- @) Y3 t( K6 Q
            # 臭不要脸的推广一下我的店铺
    + w4 o7 a. ^9 ~0 ~) M* w* t  u+ t        url="https://shop574805287.taobao.com/",8 w1 {+ w- m9 e) S) b: y) d4 K
            login="taobao"
    + P6 r! j. Z6 r/ U: s).run()
    % v1 l! ]& k9 [' [# return text8 c: y) @% q* L8 a2 b2 Z3 b  v/ d
    0 C- q/ F2 |3 v: U- G& |6 p
    第三种玩法:爬取网站信息6 y0 O3 k. ^& y# Z0 F. w; v
    爬虫库自然少不了爬虫的过程2 ]2 k/ _5 p2 V: v5 Q8 v, l1 L
    : V5 {8 B" f% ^0 j! z' _
    特点:
    $ Y. P; i9 S# z0 Y' s支持re库,xpath解析以及bs4选择器。& I+ d! M7 W9 B( v* S
    爬取方法为字典格式。单方面输出。6 d% _1 a' Y* _, }) s
    字典键为保存的字段名称。* i, V# r8 j, s- F7 s4 e6 j
    字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。+ S6 d$ o6 a* ]. F4 Z: z4 E
    4 n( S* C2 L9 @3 u3 y* Y
    缺点:暂无(等待小伙伴们发现)5 H+ g  X3 r0 ^: g7 d
    " b$ a3 f. W% p0 [) k
    :return reptile_results, A( b) m; J6 o
    / H7 W/ N9 n6 ]% E) n, x7 g6 S0 x
    request.parse(7 J! n0 \2 V1 k4 R
            url='https://www.douban.com/group/explore',/ T( R6 z5 T" s( N% r
            # 字符串格式,选择器方法。
    4 F0 X' v5 ~# U    Parsing = 'xpath',; l, }8 Q$ w% B/ v9 y' J
        # 字典格式,参数如上。
    ( M" T: N. T8 y! K7 x- E  G4 J    label = {
    9 ~& b9 l, Y$ D; M% c! O        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],. I( }$ ~& x- N& ?
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],2 j! D& H1 O1 c* o# M+ E5 z
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]/ Z* w# c: w1 |2 N2 e3 V
            }
    . h- t# R, A, [: K).run()9 n2 ]8 P! V0 X; G- F, Q( v
    # return reptile_results(list)
    $ A" k) v9 ?/ ^. ^9 f' d- G2 M' y( ~% |( H5 x
    第四种玩法:自由保存信息
    0 G' b" a- M  t+ d目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。
    $ S# z" x" p; T, h, \( W; M5 T: f8 g6 J
    特点:+ k7 u6 o6 @1 ?* x3 r0 w3 o8 R
    写入文件均为数据格式传入文件。
    " b' K% y3 H% Y, J: r& V  ~: O且输入格式规范方便阅读and省事。: a% a6 M# P# v6 W' M" T
    : R! g; t/ \3 I0 V; l$ r8 q8 H- [
    缺点:, W- Q2 ?3 H+ Z, L% H
    保存格式仅四种,
    1 {! R8 q; r4 a" A不方便用户之后读写操作。
    / n) x; s% E$ N2 Z/ R* ]5 C" f- Y8 B3 ~, r
    :return file& }0 g8 Q# P2 ~2 x, Y& K

    7 N. }' H8 ?& I; u2 vrequest.parse(6 \3 R8 u, C) l. H. n" A
            url='https://www.douban.com/group/explore',$ p% f/ u, Z# `* U
        Parsing = 'xpath',- j7 A, `, Z9 @. n
        label = {
    - l5 S7 p6 N. z5 q* K% q        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],! [2 a) n. k8 S; a1 t  C2 m7 w; o/ y
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    $ Y9 n2 H+ A* X  J5 }* t  j        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]4 ?6 e& X* j: b* `0 f! o
            },
    5 T9 w: @* n3 R) w  K! d' y- G, f    # 字符串格式,具体保存位置填写* N! y' w5 ^$ U' r' I+ d# h' R
        write='result.pkl'3 O/ ^3 o" A2 o' L. {3 n9 D, s; R' v
    ).run()
    # o+ I" t9 D. v) _7 R) h6 x) K# return file# _! z2 C% m( Q; O: D/ b/ H

    # w% R! t5 \) V6 r* U4 A2 v第五种玩法:读取下一页 url 地址继续爬虫
    2 n! c( |+ h4 s5 r这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~+ V; u" R$ P% s* K% G; P
    ; k8 ^. m( i! H2 I7 N+ r
    特点:
    ; g. }, N- b. l! H/ u$ J' r继承之前的Parsing参数选择器选择方法。
    7 f* v' E6 x4 E$ B/ e在这里可读取到解析后的下一页 url 网址。& u/ t7 N) D2 ?: p* d- [4 i0 f
    方可继续进行爬虫处理。方便用户使用。
    5 q' C0 \: A5 F' e+ n: }& D& _; C' I% O1 I: F7 F) z
    缺点:' j) J# \$ }. H/ K  G+ |
    若爬虫时下一页 url 地址改变,便结束爬虫。
    + u; q3 s; f/ o4 e$ W只能爬取所给 url 地址中的信息。
    ; M' T0 l+ T  `7 `6 Y无法进行某一界面的多个网页爬取返回。
    , m1 _, R  B; Z' }0 G造成访问页面单一流失。
    $ q! b( a2 Z' u: }4 n7 K% D# o  i: p# m3 Q
    :return None6 `: B! X4 p3 Y7 ?2 h

    - E# P9 o5 ]% r- qrequest.parse(
    0 |1 s" ^- h# ?. T5 T  z8 }        url='https://www.douban.com/group/explore',
    ) b3 }4 ]. U' N0 X+ G    Parsing = 'xpath',
    ! b% m/ l: K8 V7 k# q  \    label = {
    , ?% c9 n9 D" v2 R0 p" H        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],5 D7 T; D: C9 R( @5 K5 e1 k
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],2 F  f2 Z! Z+ M% M1 v
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    6 b( x3 i* @5 p% k' G        },9 Q) x2 l- L7 O) h5 F9 x% A' h
        write='result.pkl',
    4 w& S# e% N' C  t$ I    # 字符串格式,根据Parsing方法继续请求下一页a中href! f9 J+ B/ R# W5 J
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',3 M% D$ T: c9 l. K- B  j% F( |
    ).run()& V- b6 d5 }6 [- S+ q$ c4 Y
    # return None . X* v# ?. v* }( f6 R- m7 y) u, U
    " b5 b' O6 K) i  c1 B
    第六种玩法:爬虫网页保存
      y5 h/ G1 H* J* i7 R听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!  e$ _7 E& c' a; t0 x0 ?' R
    1 d  s, A# y4 v' S1 @. ^8 @8 {
    特点:
    2 q% _% [; U3 c- W, y* b持续输出断续笔记。
    0 R1 i  {# E) W# K$ E$ t将此次爬虫的 url 地址保存到一个文本文档内部。' B4 |8 g1 d: d
    下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。, e2 |. U9 t: e; H
    5 \: W8 c- T2 Z. S& {) p% ?2 B; k
    缺点:& d* ^  z7 e0 l, t# j/ `8 V2 `
    读取内容不单一。- q2 n& H) C5 m3 l3 x$ \
    导致下次爬虫无法正确读取上次爬虫留下的痕迹。
    ; _* k' {# ^+ J0 C6 P4 L- {$ z3 b- F+ |3 x+ D* ~& i2 Z
    :return url_file
    9 h5 `  z) P) z& {' h2 f
    0 D# S+ y5 E9 c" u+ z% Irequest.parse(& z1 g0 N0 a$ P# x( Q
        url='https://www.douban.com/group/explore',; J9 Y7 B" I/ b9 D; ]1 Z; N
        type_url='text',; W! W+ h/ P7 |; \$ J: y. @1 Q4 b4 ~
        #login='taobao',
    , O6 v; P( q4 h    Parsing = 'xpath',6 h0 V% `) C' n* |! S# z6 i
        label = {
    , s* B' ~( o" ^' U& h; J3 n. N        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    , g" C, q* Y+ g        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    6 u! v( Q* d7 m2 c& Z% G        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]! g3 a3 Q  d3 i" w" z* a- L- ?. S
            },  Q4 G! u5 Y" b* W5 B# D
        write='result.pkl',
    % q8 D0 v* n! i1 b1 C- ]" V    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    & }& l- Y, b: O& X    # 第一个参数为是否需要断续笔记。2 U) [+ A, L+ t, T
        # 第二个参数为断续笔记保存位置。' k8 ?2 d# G- t" p; }; _
        page=[True,'url_page.txt']
    % r+ Y3 c" r' C! X7 j).run()% d) c7 s: v( ]  r
    # return url_file4 q: u9 p( v. w2 C- R$ F& s- I

    8 F+ T2 s- ]: F第七种玩法:简单数据清洗/ K! Y, y6 B. c9 X$ ^+ T$ U
    数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。% B& Z, ?! m8 U  e& _5 p0 X0 }

    ! k. t3 m7 f9 s5 ~5 S0 r# R5 N& Q# V特点:
    . w4 e& K7 \: Y8 i- _  m8 x本人曾写过一个底层数据清洗。4 h6 K, n/ i( S5 {! k( z
    能将列表格式数据进行归分清洗。
    ' R' Q( _) q* ]/ ^: w0 K主要内容请参考另一篇文章* s! ]2 B8 `' v: D0 d# A: k
    如下连接:数据清洗
    % c9 Z' R$ Q# M. s2 Q& r+ p
    7 d' J( x5 y/ X1 T, D缺点:
    ! w& H: z4 E# t( [/ v( `) k, I数据清洗格式简单。0 ^( @! Y& O) K4 z" ]. z
    数据清洗内容单一。
    9 k. _6 d" Q& O# W6 v0 X" h: u无法完全做到绝对清洗。/ j& P; t, {4 K9 K9 V
    有待改善。* ~% O% K, |6 T( J
    : Y$ s( D1 m/ k0 k
    :return keyword_list, value_list- D( f- {2 I4 [, [0 t

    * S3 ]3 Z, H) H( M# \request.parse(7 P7 M4 l2 c  C. y
        url='https://www.douban.com/group/explore',
    - \( q& Y4 X6 b. F0 w    Parsing = 'xpath',
    % d# [7 M/ F: m  P    label = {/ ^$ z% i( x/ W4 ~. i
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],( ~! R  D& C' `
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],$ {4 n2 V8 l. i: d" ]# O
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]2 z' ^# Q8 p( G# f+ s
            },1 _) G' T  T# F- C- _
        write='result.pkl',' _. c/ o1 q. I' W
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',) @0 N+ H1 B, d7 \; Q- r
        page=[True,'url_page.txt'],
    ' J2 @, s8 h, J0 q7 t: {    # bool类型,默认不清洗0 Q/ _& U5 [/ B
        clean=True, r6 w: Z* v7 L/ W1 M
    ).run()
    0 c) s+ M: ^) O  {* v  a9 c7 P9 I4 k  W: a( Y% J& W  @6 W
    第八种玩法:爬虫存入数据库
    6 `, d* L$ |+ H) A存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。% S# F* n" w8 v: q- i. g& c
    / i( R+ z9 m4 d7 Q, F8 ]1 g
    特点:" Z" F" Y9 N( ?) ?8 d4 ~, n
    信息存入MySQL数据库。
    # K2 C) R0 Z5 v可连接docker远程数据库。
    2 v, }# Y: t0 N- s: d6 a7 r数据库的库名可以不存在。' g$ g" t8 c& ~. f5 \0 c- C7 O
    数据库的表名可以不存在。- N, o1 N! Q4 c) }' X
    根据之前传入字典键与值参数判断表类型。
    3 n/ p  W' f% y# @0 T* C; S自由建立数据表传入信息。5 a( o% A: _* @3 n

    ; B0 y! Y+ B2 @! e" X缺点:
    - ~: v5 f4 Q2 J8 t9 f" ]$ m仅支持MySQL数据库。! ^" \% [# \: }; f

    3 v" c1 N" P7 O, Z# |) k/ V:return SQL
    3 w8 a: p3 X, d+ U$ S! T8 q+ R/ U" @+ Q* G2 V7 e& E5 |! @$ h
    request.parse(
    2 z, g; U/ s! J  \2 N) K    url='https://www.douban.com/group/explore',6 I' }/ c2 I) x  |/ j; f
        Parsing = 'xpath',7 ~- ?  I) u# v
        label = {
    ) X6 ?/ k# n* f0 K( m! S0 L        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],! J0 }5 g+ t7 R9 a  E/ P. N
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],3 S2 C7 D& t6 y0 r+ \6 W
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]4 `  G5 P+ `1 w5 a7 d4 Q
            },
    4 i( D. K& X0 O* R4 c# G, c' g) W    write='result.pkl',
    + k' M, C+ M) ^0 ^0 `% F  X    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    : k- O9 L! Y4 @( [3 o8 I    page=[True,'url_page.txt'],
    % t' F, t" ]* O7 G+ n+ ?; {# U    clean=True,
    , U, v5 d1 r0 j4 q; Q3 W    # 字典格式,/ ]1 q4 R' f& t! Q- U
        # host可有可无,默认localhost
    ! I2 a& X1 D0 |4 ~    # post可有可无,默认3306
    8 a& F( N  z8 Z% Y5 m& Y9 f    # user可有可无,默认root
    - |4 N: J1 m! ^- J2 t1 N. A    # password必要参数,数据库连接密码
    3 J; a0 z0 @3 z- y    # db必要参数,数据库即将存入的库名1 o0 P" Z+ Q: E
        # table必要参数,数据库即将存入的表名; e0 z: }. @; O+ E; x
        write_SQL={- }3 w2 M( v8 R& b3 V/ I
            'host':'localhost',
    8 D, x- i7 q1 u& y        'post':'3306',
    ( g/ p0 L6 B3 `5 \; n- N        'user':'root',3 R# V$ g1 E' q2 O8 C2 U
            'password':'123456',- |/ r: B" [" H
            'db':'example',+ F5 t: Z" W: y( o) W( b/ a
            'table':'example'
    1 N0 r7 I' b% |7 U& G6 q        }
    ; p6 b* h& W- W1 T- }- i    ).run(). ?$ O  K' e2 y) p' u

    ; A+ y- T* A. t9 B' H1 ?+ _第九种玩法:重新启动爬虫4 U! ?( D' E# I
    爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。) ^% Q1 L; q; u* c5 O& H; O
    & U- W/ {; O, F8 `+ U5 X
    特点:3 l; I9 u7 j9 s; |
    检测报错重新启动爬虫9 |  ]! ~% v9 J" Y% W/ |# v4 E* v
    无需手动处理错误信息
    $ @6 z! F6 y$ ?% [* |/ @5 R
    4 E/ J1 y- Y9 W2 Q( e( x缺点:
    8 D1 V; k$ K6 i: n$ x无法收集子线程错误。* q- N- Y7 c& _6 R% j+ X4 C

    6 p8 ?" q9 q  t7 m, l4 I:return None, @0 E$ h3 O. N! g

    0 b4 d5 k% A5 y( K7 _  krequest.parse($ w% @& E: T! J+ H
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],7 A; C: D  M5 i3 A8 T1 x
            #login="taobao",/ s" o- Z) q0 T
            type_url = "text",( Z0 k5 V" Z  Y- x
            Parsing = 'xpath',
    : W5 u1 ~" j8 M3 q; u# n        label = {. P+ t4 D1 ?3 \( C  D: ?
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    % I; z. V1 d% H8 Y! w" `" h            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    . Z$ {' g2 ~3 i( |6 i+ O            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ( a, S! j; `! C" p3 H! q) ]            },2 U' m: m$ t" i/ Z
            write='result.txt',9 d1 `, X8 ]$ E- B
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',1 w) s9 I- r  @% h% S% W
            page=[True,"now_url.txt"],: B4 ^1 G8 l/ {% Z  H/ `4 ^( ?
            # texting 参数为是否启用连续爬虫
    ; N6 b8 h4 m$ R1 |; O) U8 r        # 爬虫程序异常报错后重新启动爬虫; Z+ @" c, R! p  z, s
            texting=True,
    5 w+ Z! n0 a+ J+ Y9 _$ C        ###6 \3 }. w3 [0 D$ g  o. _
            write_SQL={% w0 f# S" U( [5 y
                'host':'localhost',+ g! S; k0 f: ~1 k' {; I! s) s. Y+ Y
                'post':'3306',/ R: s& J1 }; w
                'user':'root',9 q4 v  L6 Q5 p! ~8 `4 ~
                'password':'123456',
    1 `" X! f( d3 H  e' D2 K            'db':'example',$ j* U& S1 E3 a  w, s' |) Y/ i9 H
                'table':'example'
    - u% Z2 K: I2 ~% B            }
    ; G# g$ I8 n+ `0 ?0 i).run()+ _: e+ c8 f7 R' q- k* J8 }

    ! v0 E& D) `' A, C! a+ y4 ^7 W4 n第十种玩法:多线程爬虫; d. S" W& F- n
    特点:
    3 f" a- Z' w& C+ l* k爬虫速度加快,0 g6 X* K+ I& [( U& a% D/ s
    更好的利用了线程。
    * S9 Y# o: ?$ x+ L$ }
    , Y: i, D" \+ k0 x: C9 Z缺点:暂无
    " n) k. n7 R+ W8 j3 \
    , t! m1 g% M7 u- Q  y& \. k, c:return None  p3 Y% s. b! ~4 P0 \

    7 m/ N5 o( |  A. D, |' drequest.parse(
    # ?# o# I1 A4 w9 z9 W0 q3 P+ `+ S        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    ! u6 p" m- p+ e; h! S( `        #login="taobao",
    3 r& K5 F3 F  y) s/ }        type_url = "text",- P) V" Z- T5 |- q" O6 u4 t
            Parsing = 'xpath',
    / Z( L- d$ a8 T$ t        label = {' `  Y% f. B9 x8 ]5 m9 x# G
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
    7 K+ ~( a7 W  ~            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    8 K3 u4 J( H; ^1 ], j$ Q" E! G            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]) C0 ^* ~: s3 _+ e3 U! s' S- x
                },) o( x; J1 d, F( L$ q
            write='result.txt',
    4 _. B8 T* ?( u2 S        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    + n9 o4 S  e, j# |' C; d        page=[True,"now_url.txt"],7 [( T5 G" Y. X0 p/ X% O* j+ J
            #clean=True,; w/ b) P' `* B# ~1 v
            texting=True,
    $ \$ B# W5 Q/ G        # status="threads" 启用多线程爬虫
    2 j4 x* t+ m  |( C( c% W        # Thread_num 为线程数目,默认为1 单线程# F3 d* U; K! X* D' d
            status="threads",* c: b" }; z1 x8 T. e
            Thread_num=3,
    * t) D2 s  W/ u+ s: a( C        ###
    % S6 M1 z$ ?& B7 J9 N        write_SQL={
    8 L3 }" J. e* g) g: w' P' z9 ^! Z            'host':'localhost',
    * m- |  M" A5 G" h            'post':'3306',8 x+ s' e' N0 J7 F* B
                'user':'root',5 B! l! |: G/ B# i) \& m! z* G) c
                'password':'123456',# _' x9 O) X$ R) F. P7 k; S' r
                'db':'example',
    $ H" `- S  }% r) b: T            'table':'example'
    & j* Y) |6 ~5 t: n' E- `            }. f& b' c" R' h5 O
    ).run()
    * Z& ?4 d8 N" m9 i  R3 m' Q& ^* C! s/ _! F0 r- e6 V8 o
    第十一种玩法:多进程爬虫
    " E7 D3 a- k4 I$ J) N特点:
      V0 f3 R' ~" b9 d5 \爬虫速度加快,
    , s( r. O; T+ D3 a4 ~更好的利用了进程。* T' V. `8 ]. O6 v8 v3 ~: N
    1 c. `6 f; ?0 E5 {; X8 K4 `
    缺点:暂无
    / v) n. r0 [! J: }4 {9 Q6 p; q; T1 f0 ^& Z9 q1 G, E4 P
    :return None
    7 q: e/ F5 ^# r% K7 j
    # w/ p! b3 ~/ O; w3 m) sfrom simple_crawl import request; u4 z9 t# Q6 L/ O4 r5 l( s
    request.parse(7 `, ~" \3 Q: S' R& X
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    $ L" U- e* d# A' c7 v3 F        #login="taobao",) D$ E% d: {! w! j" y1 R
            type_url = "text",) ~4 T6 Z' C2 S/ c% ?- j+ w  V
            Parsing = 'xpath',
    ( \1 Z, ]: n5 V$ }/ x+ `        label = {% e, F4 Y7 p& j2 n
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],) ]8 k, o! d' x* t# M$ u
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],4 G2 h# E( x7 U7 Z# w7 a8 ^
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    * J) {0 Z# u4 Z/ p            },$ S" O& N+ y/ M6 J2 b$ f3 O0 V
            write='result.txt',
    9 K# r, O. ~1 m/ r/ u* Z: L        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',5 g! A0 ]$ C2 v# n; V7 v9 I
            page=[True,"now_url.txt"],; a" e" \! p9 k% u! V! s* E  t/ r
            #clean=True,
    , Z! v  k6 \+ x6 c        texting=True,0 D2 X  T' V& \- \+ X, k
            # status="multiprocessing" 启用多进程爬虫+ O% n" N) k$ e7 Z) ^, J5 P7 m. }
            # cpu_count 为启动代码核心数,默认为系统核数一半
    : g* s7 {' ]$ U9 q# Q/ h        status="multiprocessing",
    4 N5 h% L, p" v% }        cpu_count=2,! c% b6 v, `. E8 d
            ###
    0 t5 K4 h& k% @" \" f0 g        write_SQL={
    ! Y; t  u% ~/ U$ E2 m4 i  W2 y            'host':'localhost',
    ; G2 _2 ?$ g* Y8 j            'post':'3306',
    : p" y; W# f+ b3 d            'user':'root',# ]* d, J# x  U, O- [& @! M
                'password':'123456',4 L; F1 j9 A' V* O, P
                'db':'example',* m, b2 [% k4 `2 x/ [6 }
                'table':'example'9 j, S6 H- H' u2 `# o3 |& [0 D  A; V
                }
    ( e  g1 R( v& \) r).run()+ e9 I1 e0 H* J; z- o

    * R$ w# i3 ^$ {( s5 B1 Q第十二种玩法:异步多线程爬虫- c9 ^+ O" A6 P( x& h
    特点:
    * C# f) K# r; g$ d爬虫速度加快,
    . a) P6 b$ }% N异步使得爬虫无等待时间,, O3 W' W: {% m
    同时使用多线程速度明显加快。
    ) O! z- W4 ~" r* e) ^. p+ f- f$ f8 R: F9 X0 `* X
    缺点:暂无
    / G& R/ x% w5 Z$ F9 a1 e4 B% S$ T2 E; t  [% Y1 q9 M
    :return None
    . H5 x4 O4 \9 B3 N/ i# ]+ R; ~9 N0 A6 \5 A! s8 z) ~
    from simple_crawl import request+ u# G; L3 _- q- ~7 p" h
    request.parse(
    & H; V- f3 G* |; B- y        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    # ]" h7 u9 Z- Z3 W- P        #login="taobao",
    ' y8 u# |! ^$ V* m/ C% d) N1 A$ U! j        type_url = "text",5 h, I7 c2 L8 h/ Z2 w
            Parsing = 'xpath',
    " ^+ Q" `0 M8 f: ?9 P        label = {# c) O& m- q) G5 S- Q4 ]/ Q/ e% A
                'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],+ ~& N& r2 U: [& B9 U9 D& G! }
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],6 Z9 d2 T" M2 q, @
                'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]+ L/ j- I7 [! d" x) g, i5 T
                },8 }) ^; O( M0 Y/ L
            write='result.txt',
    * f/ H5 D/ B# G! E9 i; t        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',5 [' U' X; [4 y: l- b
            page=[True,"now_url.txt"],
    : p* y" R7 _( A* O$ B8 F        #clean=True,. g1 \. z5 ^6 i# T8 h7 [
            texting=True,7 @" Y+ N) f1 ^& E8 m5 a5 Y1 C
            # sem 参数为异步引擎数目,默认为5* E3 u  U9 D5 b$ ^, r9 e. h
            # 其他参数同上0 V; N6 v% C! J5 o2 ~) i
            status="aiohttp",' D$ |" c8 X. J9 T& D+ y
            Thread_num=3,
    : c  \$ ^& C& _9 ]        sem=5,& O& y9 ?3 H6 N6 U! j) }
            #### a$ o; M, @2 J7 K' K
            write_SQL={# o  W# _2 f& v  ?1 c+ ]
                'host':'localhost',
    4 l! h# v6 \+ e2 h7 N8 `            'post':'3306',
    " `6 P* y7 G! x$ @            'user':'root',
    ( G8 n& j+ o/ J& ]8 C+ |0 V9 {            'password':'123456',: \5 d+ v& a0 c/ W3 `3 n7 w
                'db':'example',  V: y  u! [; W9 Q
                'table':'example'
    % Z$ P4 {  _& a  C) ^  K& G" x% M            }
    1 i9 q1 q7 W: S! ^).run()
    4 W) [$ t: o8 W4 i0 A0 u! Q. y
    8 \6 e9 q" Q4 e/ ]9 @5 o第十三种玩法:异步多进程爬虫
    ; C4 f& ?, S% P* @& d. a# S( v特点:
    . w. q. h5 j. d: v/ _爬虫速度加快,& V4 q0 G) t/ @: }4 ?! ?0 d7 k" E0 T
    异步使得爬虫无等待时间,& t* i; a' `2 R
    同时使用多进程速度明显加快。
    4 [" u' M5 S" Y3 z" x2 V& [4 |) Q# h1 k3 u
    缺点:暂无
    0 D# t: _' O6 u1 J) g; @8 M! J/ n' k; _- s
    :return None( l8 }" C0 v2 U
    1 j1 T; w" |6 a' s: F
    from simple_crawl import request6 x2 ]( H% _' z
    request.parse(3 N; a* J' g3 a$ x- y
            url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
    3 i0 K! B0 W5 |5 q+ E3 }        #login="taobao",
    ( [2 {1 T6 n+ U9 `8 L) D% Z4 f4 f        type_url = "text",
    6 H1 O: i/ v6 [& |        Parsing = 'xpath',
    * d$ N* d+ y: u        label = {
    2 E5 \# j3 H0 S: N- T            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str]," _% [0 k8 D& j) e: p. y) @! ~
                'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
    $ z3 G/ M; g( C& Y$ {* J* k            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
    ; y: K; `1 a: J4 u+ w            },' H3 }( t" f% X# C
            write='result.txt',0 D+ X3 d. `$ f2 R. U3 p
            next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
    & O6 w( g) [1 U# T        page=[True,"now_url.txt"],
      b0 M5 Z2 \- Y2 m5 D* m, o0 n! Z; b$ K' i- I        #clean=True,
    , V4 K% V. x% Y3 C        texting=True,. K* {5 f2 T  h& m' \
            # 参数如上6 c0 x  [3 z& c/ g3 u3 I
            status="between",
    : _3 d% M$ j3 i- `) |        cpu_count=1,
    . Z7 l4 \' N* B! O' y  K) w        sem=5,
    ) y! {- L( d* f- n5 g# @5 w        ###& }6 i* g$ ~2 v: L) Q8 t( \$ B
            write_SQL={
    / ]! d1 f1 I0 N, \+ N" F& [            'host':'localhost'," e7 C$ P) j0 [
                'post':'3306',* M& V2 s" a- f
                'user':'root',) T9 S0 t$ u: z
                'password':'123456',
    # D- R4 t% X' `4 L* U- R9 Q: i2 G            'db':'example',
    * _: }$ z9 W& \: I3 G            'table':'example'0 [8 P/ ?3 t0 W2 P' v# n
                }9 Y3 @; E. k8 J2 `' Z( j0 m
    ).run()
    5 t. v* P0 i1 ]; {% D; F0 v9 Y( F9 c# E
    + t8 F9 V) O: E' }# A. ^5 b
    功能介绍完毕🤞% o0 c% y( Z" ~/ ?3 O
    最后还是希望你们能给我点一波小小的关注。1 R0 S# i0 d, Q5 l4 k. f
    奉上自己诚挚的爱心💖+ y9 Z$ A% z! F# c3 T! X
    ————————————————
    6 d  \) B/ c+ j1 f# ?版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。4 h! w6 q# |' J! P& U, I8 I
    原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684
    8 R4 a, E. S7 Z- [. P2 v" o
      H$ u# p3 Q, F2 S
    8 c" n0 e$ S. P8 [1 s
    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 09:45 , Processed in 0.613158 second(s), 56 queries .

    回顶部