数学建模社区-数学中国

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

作者: zhangtt123    时间: 2020-6-2 16:00
标题: Python爬虫仅需一行代码----crawl第三方库
仅需一行代码写爬虫–simple_crawl7 M; N3 H4 |) q( P3 g
simple_crawl
, V  ^# Z  I- u仅需一行代码即可达到爬虫效果; W9 ]! f! e$ L6 U2 d4 U
项目地址(欢迎star):https://github.com/Amiee-well/crawl
5 r7 c" p7 M8 X# Z使用方法
9 _- u2 A) e( wpip install simple_crawl- }# y# w7 F5 Y+ J, L& e7 \2 H+ d. \/ a- I

9 B2 l% [, a0 ]- U, o### 以下源代码为简单介绍,详细功能介绍再源代码之下( t0 D4 h6 f+ c% h
from simple_crawl import request6 J" M4 b! ^5 I; r
request.parse(
' U  a: s- G% p) {4 |; h        # status 参数为运行状态,支持单线程多线程多进程协程以及联合6 X0 S; J# ^0 j7 u, L5 d# b
        status="aiohttp",
. {6 Z8 a  v6 v        # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式# _- e7 V9 {; T- B# s: P6 c
        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],) C7 e6 a  ]) q
        # login 参数为获取登陆信息,如淘宝等网址需要登陆信息
# x+ `6 `! o/ d* U: g3 k1 q    #login="taobao",
+ w0 Y" R/ m  O, }4 r    # type_url 参数为返回源代码格式,支持text和json,默认返回text
' L# C# w, G- R; U; _    type_url = "text",
# v3 w) a* ~$ Q: U4 G    # Parsing 参数为解析方法,支持re、xpath和beautifulsoup
1 \$ G9 {/ U8 [; d' `" z( R    Parsing = 'xpath',& X7 {; Z1 {! a2 q+ _
    # label 参数为爬虫解析过程,字典格式,详情见下方
) @1 ^0 s5 v/ |: ~    label = {( [. g* p' F! ]9 B( ?2 ]
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],) I) Y7 ~& a7 o& y
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],1 e9 q9 n+ m3 @  d0 j5 `
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]$ f; \2 f. f' K5 p$ V
     },- P. B) I; \0 B
     # write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱1 ~; h9 O) w5 p' ~* S9 B
     write='result.txt',
0 ?. J. B7 `/ [: U2 u* _' O     # next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫: z# }% p# d1 x9 D: Y+ i
     next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
/ S; Q* Q/ ^; T. }     # page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫
+ ?; q) G2 y7 {6 h$ D6 ?     page=[True,"now_url.txt"],
1 f# X8 E. a2 Q- A     # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息* j! m- z5 ?% t
     #clean=True,) B9 b3 z/ f. a( n  Y' ~- N3 |
     # texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序
, Q  V+ v* p' f/ z) D7 j! W2 f     texting=True,
- A  n+ V# b1 m, f     # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态
8 Q- M0 C6 ]8 D  A     Thread_num=3,2 m0 W) S) v+ d/ l/ e
     # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态0 _7 y' L) s! o0 X( a4 ^* D
     cpu_count=1,
( {! f0 S, i) k2 W/ J: W, [" v' b     # sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态
9 ]* ?: u4 r* Y3 |1 w2 T) D     sem=5,
. c& o" _- O" S     # write_SQL 为是否写入数据库,默认否
  ^2 R8 q  [% D( s) g     # host 参数默认localhost: L" T& V! k' C% V
     # post 参数默认3306
5 n. F1 d2 F8 h1 f     # user 参数默认root
6 X& S! z: \5 \7 l  t6 q$ V5 j     # password 参数必填,必须正确0 K- L' P& Y' t+ k: _6 B  {
     # db 参数为即将存入的数据库名,若不存在自动创建0 s2 T- U- D0 o6 f
     # table 参数为即将存入的数据表名,若不存在自动创建
- }& r' m& e) s     write_SQL={
' w  E* F; P& `$ K9 {7 e8 f         'host':'localhost',- Z3 c7 j. l* F
         'post':'3306',* q4 n. B* {5 Z. E
         'user':'root',2 ?5 C, C. w: E0 h
         'password':'123456',. f* h2 j4 u2 Y, ]
         'db':'example',
  z- e( V& K; d0 s0 P" f" E5 |, {         'table':'example'7 v7 b! F9 R+ w' V* `% j
      }$ n. ~$ g5 T0 t7 \# k
).run()
% O9 b1 z& d0 J8 o
* W% A7 z9 Q& j) U. @3 o介绍一下crawl参数设置:
  p9 t0 K' j# u1 k8 \- B2 l4 G- w  @( @/ V6 h
'''+ t6 w& m0 H1 n* B
单行代码爬虫程序执行
3 O; ~5 l0 y$ B+ Q:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档
; r1 Q& Q5 \0 P. P& F:param url:即将请求的url地址,仅支持get请求: p9 r$ P4 M6 ~3 g# y( {
:param type_url:请求url后返回格式,支持text和json格式返回
1 ?! p$ x$ O: ^. Y  V/ S- Y" U, B:param Thread_num:即将启动多线程个数,默认为1单线程
' c. o! V- R" f0 x0 R:param sem:协程信号量,控制协程数,防止爬的过快,默认为5
  I4 W: K. m* R% S:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半
0 u4 ^* W; V: K8 j8 D. g6 o: q- y:param login:模拟网站登陆,保存登陆信息
& e8 N2 s4 e, Z/ Z# w/ V3 c:param Parsing:爬虫方式,支持re、xpath以及bs4方法/ Q% m6 ?# j, y1 t
:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,
+ \* H  [1 s6 n8 {                       多次报错结束程序,默认否
$ r7 p: W, b. d, F( j" r/ a+ i:param label:选择器内容,字典格式保存," I4 r0 X  {, Q7 p' G
                     字典值为列表格式,第一个参数为选择器,第二个参数为转换类型
! A7 e/ y" p5 o" G                     第一个参数必填,第二个参数默认str类型
# I9 a5 a# a( |& {& Q: f:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否
7 @7 t8 x! q" ?0 P, O:param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫
3 u7 b: H# [5 W+ D: @:param page:是否选择断续笔记接手下次爬虫处理,默认否. w; _' e2 f  V! l' C% E# K% k6 X
:param clean:是否进行简单类型数据清洗,默认否# t# @# s; h2 ^9 N' C- L# q
:param write_sql:是否写入数据库,默认否
0 D3 E  ~/ p) U                         'host'默认为'localhost','post'默认'3306','user'默认'root',% j6 k) n  ]6 i! h, s* B* ^' S
                         'password':'密码','db':'数据库','table':'数据表',4 d1 N) x! r+ r) d- D
                         检测库是否存在,若不存在则创建,若存在则直接插入,0 Z- D5 e9 K2 C: r! b
                         检测表是否存在,若不存在则创建,若存在则直接插入3 F3 k* I+ w% B) Q
:return True
5 B* k7 i# o3 Q5 w  n'''" Q/ p$ l6 m  y
介绍玩法
/ E# V$ M: P; u. p) k接下来介绍的均为调用第三方库的情况下运行:
/ u% U. @- e) t% Z" c, m+ K6 m/ L/ {( O& X$ J
from simple_crawl import request
: d! f9 L) y1 I; V" d4 L, J第一种玩法:输出源代码
, G" i; q5 R: t1 K$ J4 Z调用requests库进行源代码请求。+ q, Y- g! W- u6 H% I% N
( a: s! k8 a4 |" G
特点:& p+ a$ V1 s& H# p; Y+ V8 ^
请求失败则调用ip池处理重新请求访问,1 e# m5 K  d0 \' |( w0 g
出现五次失败默认网址输入错误。3 g' o3 t$ }4 X" O( z
支持text以及json字符串返回。默认text。
7 q+ a  U) b5 O8 |- r5 B6 x8 a% B) a# z5 b: S: A- g
缺点:
5 {/ l$ z7 f: H4 `; g; f* u暂时只能进行get请求,不支持post访问
# \) L  _* M1 j: D
: U. L1 n+ y& x! K:return text or json
7 u' o6 d4 @! ?2 [) }6 p- o1 P9 r3 M0 T6 z
request.parse(* V8 m! r4 g& s2 {
        url = "https://www.douban.com/group/explore",
6 W  J3 }' Y0 C4 A$ A- R0 a. I) I        type_url = "text"- E" N, o8 `5 K1 @* e' s0 _/ B# b) y
).run(), d9 E2 _+ g0 i( I  B
# return text
2 K( N* m: D- X5 y5 S6 l9 q8 W% x) c+ O' O4 v* Y; q
第二种玩法:模拟网站登陆并保存信息/ t" ^* z3 ~- ]2 \: e. e
调用DecryptLogin库请求登陆访问。
- u+ F1 `( _! ]2 d) B6 O, X. Y8 A) ~
ps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源
! ]4 K! ~% G8 w1 E- Y' r1 k# @在此放出文档地址# {4 {6 z2 S: d8 H* d' [3 o: @
DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/
" S7 W! {; h* c# ?( J+ D, Q4 _/ Y. l3 F7 j
特点:
# l( L/ y& ~+ `) v9 [" ~将DecryptLogin库中二维码继承到此库(非二次开发)6 F; z( D: V% J, C4 |. P
支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)
+ d$ E5 \+ Y" E1 T保存session.pkl信息到本地方便下次登陆运行
5 s4 b4 Y8 A* x5 ^2 R: q; a  Y' v# @: ]
缺点:
' O- g0 w/ Y7 S) Y9 Z; s) _session.pkl登陆信息过时无法自动删除。7 w1 r9 F! d- a
导致下次登陆疑似cookie无法正常登陆。
# s# b: k6 D  q# j' A1 V. y! A4 N$ |+ X' @1 T
:return session
9 J! n( P* y* ]+ u$ S$ E& I3 l: N, t5 ]
request.parse(
7 g) Q( G' z) v) ]" F+ h% |        # 臭不要脸的推广一下我的店铺
* V3 u$ e& g4 D3 i9 y" ~1 C# D4 ?        url="https://shop574805287.taobao.com/",# g3 I/ ~7 {# P$ y2 w* v
        login="taobao". _* p, r9 V( U  r  T; ^
).run()' ]0 u* {* i* ]( ]9 M* ?
# return text6 H' l9 J6 b; [: n

4 j: g4 Y3 X1 O第三种玩法:爬取网站信息
4 D9 W7 L0 M% b( v3 a+ t/ K1 j爬虫库自然少不了爬虫的过程8 a6 V8 N. T0 j$ A4 r( x
# z+ P9 H8 a' s% I/ I9 i
特点:
. C; a: H5 S, H4 E, }支持re库,xpath解析以及bs4选择器。
0 K3 }3 x- j! M1 J- g3 E爬取方法为字典格式。单方面输出。' j6 o1 R! k! O! G
字典键为保存的字段名称。
/ |( K2 @: t, e7 u字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。
# `- |1 u: U  w# h% ]& y+ M* {- k0 I6 i& l& C  C4 X7 T0 u
缺点:暂无(等待小伙伴们发现)
: h+ R  H2 M; E2 a! \' C) C) e7 ]$ U2 p& c. z$ h* Y
:return reptile_results1 A' ?8 V* c. O- R$ |$ S
+ m, k4 n7 u4 Y- e" Q" k1 Q
request.parse(, B; m( z# g7 F- K# \' _8 B: G
        url='https://www.douban.com/group/explore',. `# v/ m# r* V& ]
        # 字符串格式,选择器方法。
. F+ H/ Y4 S) Y' }$ p5 s3 W    Parsing = 'xpath',
# D4 x# v2 n( d; w    # 字典格式,参数如上。
$ C' l2 ]1 }2 e' ^2 L3 @( Z. M* P    label = {/ G& v. h# Y# D
        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
4 m8 U& }2 X5 R" m6 y1 T        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
+ o. L5 L: y4 Z1 b        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]$ H: h- _' b$ J% ^% O9 F8 s
        }
! c+ J# ]4 {8 n/ _4 V).run()
, V$ y9 f0 C, r" k( z8 N3 X5 M( ~& z# return reptile_results(list)3 n" v$ [$ k8 p/ X

& I. j" o: q6 e& w9 m( m第四种玩法:自由保存信息
! F! o$ G  q4 N* D目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。
& c6 X) j, Y+ z1 {
5 d; I. B  d  l/ z% t. e特点:
+ d1 \9 n$ W" C写入文件均为数据格式传入文件。
# O, W; M' ^! L* q  ^5 J8 `1 `且输入格式规范方便阅读and省事。( V$ ?1 F# I) ~* D9 _( [4 g8 X

% c1 M1 r7 J: I缺点:
. Z) F5 F1 I$ r9 k+ G2 y4 ?% h2 X保存格式仅四种,) E) i- D; G' z+ t% A) h
不方便用户之后读写操作。% X' I$ M$ Q) G& s/ {3 n+ U0 B+ ]

/ a/ m7 j* V# M0 l:return file
6 g8 h6 y- ?" }; g0 V. s
5 W% _4 n% @! x. x6 {7 H6 Y9 orequest.parse(
- f- n1 a5 z6 q4 o        url='https://www.douban.com/group/explore',% F* z+ {5 m0 y+ F1 @
    Parsing = 'xpath',
) ~# p5 |4 C: {; s: M9 c    label = {# u3 B4 b. V* E! v- C
        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],2 e5 i! g- Y1 q2 h, z# O' _/ d
        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],& j1 V8 z2 L, {
        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]0 l- B6 |% l9 s2 J( Z# ]
        },4 v3 e0 `+ h$ e% O
    # 字符串格式,具体保存位置填写
$ X5 \0 O( Q* K$ o9 c    write='result.pkl'! k5 U/ [" X( t8 x" S6 e
).run()) X' O% G0 T/ ^' h: T
# return file
+ o% i# X8 ?3 P; ^
, y3 I$ G; M/ C; v( W, r8 V( F第五种玩法:读取下一页 url 地址继续爬虫# G! u3 S+ k$ \- F) T
这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~; ^8 q: w! @( T& U3 k2 F
* f; ~0 b0 a0 \7 W2 d) ^% ^
特点:( ]' q4 A6 W8 e% o, E2 i3 [0 C
继承之前的Parsing参数选择器选择方法。# g, |- v. g6 w# n3 J! x
在这里可读取到解析后的下一页 url 网址。: ?, V! c" _0 u; k& [
方可继续进行爬虫处理。方便用户使用。
( k2 b) r) W: \% G: {# x# n
) h! _9 g0 H/ B1 x缺点:
6 b. Z2 m1 W) C若爬虫时下一页 url 地址改变,便结束爬虫。
" m: _$ O2 N! u3 V# z0 p% j只能爬取所给 url 地址中的信息。
, E8 T" o9 [5 f5 L* b无法进行某一界面的多个网页爬取返回。# Q* _  n# N  I0 r
造成访问页面单一流失。
: `( W6 [# a+ W+ ^, R! `: A6 \, t& o5 [+ I2 X6 w6 ]/ W
:return None
8 c' Z& Y2 h# p, d8 L$ }
# ~; `* P9 M# J& x+ C5 v$ Frequest.parse(% m- w0 b/ k4 }" S* q6 o0 t! J; J, n6 M0 I
        url='https://www.douban.com/group/explore',
8 r8 Q# h0 v4 c" ]$ c5 G0 p, [    Parsing = 'xpath',8 e, e. U, X8 e8 E* f9 j
    label = {
1 u. b9 `/ m2 S9 G- O# T& O        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],, ~% C0 R) q/ k
        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],* w# `$ V. f9 p1 m( A
        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]% G. \0 w2 D) W
        },
0 u, ]  a2 A8 l# m    write='result.pkl',
5 o: Q7 t6 S, I- k4 d7 k" `    # 字符串格式,根据Parsing方法继续请求下一页a中href
  s# P+ s6 ]2 V+ O9 M4 M    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',6 ^1 U6 g. W3 a  ?" D. Y
).run()
8 b: e9 X3 r5 v2 n# ^* O# return None
4 L/ d  R3 Z; I2 s/ ]0 J: ]- \6 I9 o- a4 D6 ~' }8 J
第六种玩法:爬虫网页保存# A" F" f1 r+ P* e4 n, y. S
听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!+ Q# i" O3 W  y2 h7 t

/ t* v1 \. q8 ?* V1 M2 R特点:
  P9 n& U: M5 [! l# o8 U; r" z; i持续输出断续笔记。" F' I3 ^+ P7 s0 Q: I
将此次爬虫的 url 地址保存到一个文本文档内部。9 `) I+ G( u' U0 q% `
下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。
/ i3 I0 k# O3 v
& p/ K) S% X( B+ w! x/ k4 g缺点:
5 R# X4 E3 Y5 v0 Z读取内容不单一。
) W4 J5 u! e1 T6 B导致下次爬虫无法正确读取上次爬虫留下的痕迹。
9 ^5 U6 c/ {2 Q" A3 P2 {3 ^" z3 y5 `$ ]* j1 I
:return url_file
* I5 x- ~# \- v% w4 N" U, E& r8 s& o
request.parse(
9 h$ O8 o) w4 q+ q+ L8 @, i- ~3 H  F    url='https://www.douban.com/group/explore',6 m2 p0 y9 k+ |3 ]
    type_url='text',
; \! l# e9 W) {8 z    #login='taobao',* V$ Q7 G$ u$ k. j3 i; }, h* \, S
    Parsing = 'xpath',7 Q: D7 G- H5 h7 `6 A
    label = {
3 V! P1 j# r  {- }* N& Y& l! T        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
" P; a, w1 k# C; R" E        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],% ]+ H0 N9 l- T, v. W
        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
# q; S4 q  n) x/ {! y        },
( y% o9 x1 _9 _: M; b$ K1 z    write='result.pkl',
4 P; A& B" r- x/ R* m) W- J" b    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',0 [1 M  J6 x) k& v5 x  l
    # 第一个参数为是否需要断续笔记。
2 F/ H! I% n* J; J8 J    # 第二个参数为断续笔记保存位置。
* ]8 `8 }, B/ {: `    page=[True,'url_page.txt']
* w! ~/ k2 a# o3 f9 e).run()
9 }# X' j4 d* S7 w9 _" ^6 M# return url_file* A8 `4 W& t. f  M  @6 W

( P0 a) B2 C6 k( u5 ?第七种玩法:简单数据清洗
" A7 W3 D3 n& L3 A5 X+ {* z数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。
% |+ u3 r" z* g2 l, \2 H2 r6 j
& ^/ o7 J, `9 D. s' k特点:4 c' V+ e5 @+ _8 b, z: o0 g# s, N" q5 Y
本人曾写过一个底层数据清洗。! n8 O# F1 d1 c% G7 M
能将列表格式数据进行归分清洗。  k6 R, Y) b& J$ k
主要内容请参考另一篇文章
( `$ D: F6 x; b6 o- D如下连接:数据清洗% C) [, d" F; |' A  c) @: U) [

, H7 Y3 p8 s, s7 P2 `% ?缺点:
4 |0 E$ O1 d4 O数据清洗格式简单。3 I% a9 h7 F" R, R: C
数据清洗内容单一。$ F& K; ?: {' j
无法完全做到绝对清洗。0 U- d2 f; C) w3 w- {( I  d
有待改善。0 u6 F6 s8 f4 ~+ ~, k2 }* f6 r% `  {

) l5 e  ?( T% I( c# c$ G& i0 ~:return keyword_list, value_list; m8 P" {. ^" I4 T* r

6 q, U; A6 T; u# T" ?' ?3 {" xrequest.parse(
# w* u0 x; x# l& N8 i5 I( X( P8 D    url='https://www.douban.com/group/explore',
! W( K6 ~) v0 C    Parsing = 'xpath'," t3 s( P2 ]" Q- ^+ E4 t0 ?
    label = {
1 N" k, {  z+ J1 a9 l        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
. D% |! `; |+ l        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],2 D1 p' _* T, x( T0 r) a+ D
        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]4 g0 I& l9 ~' }6 J7 v
        },
- G% Z* A8 W4 v* o# Z    write='result.pkl',
; V# p+ z/ r/ S* O    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
% r/ y, U( n1 D3 `& j    page=[True,'url_page.txt'],8 U& g8 `8 r- Z4 t$ y
    # bool类型,默认不清洗
, i0 \) M5 Z  D0 G    clean=True% Z6 D( X; g/ M! E( Z6 I
).run()
5 n. h- @& }4 N1 B8 y* ]; R' |/ U; n+ N% B3 s7 R" w: d
第八种玩法:爬虫存入数据库, r5 [% \5 w! C  f
存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。
1 @4 G, t: G- v' l+ H9 q; F2 _+ Y8 B% P7 G
特点:, r" u, h; b& [
信息存入MySQL数据库。
* [6 H% o( R0 ]4 O5 k可连接docker远程数据库。
3 }7 V1 q; {- K* @: ~4 W" C, h3 c数据库的库名可以不存在。
: a* h- }  i9 }+ n+ r$ ~数据库的表名可以不存在。% P, [8 M$ x2 d7 n' S
根据之前传入字典键与值参数判断表类型。
  [% W& O% U6 C+ G% a自由建立数据表传入信息。
7 [8 M, D: O" W3 D: g
* I4 |2 }* E  J6 H9 |缺点:& U) a; w/ x$ [" T0 H
仅支持MySQL数据库。
2 i1 U9 @  E- ?7 W
+ `* {0 I6 L! _& W+ J7 a:return SQL
/ N* c0 Z1 M) v* l
3 B3 X/ D! S# V5 y* ]request.parse(
/ G! d& x6 G$ T: J8 u* {/ _    url='https://www.douban.com/group/explore',. j5 M5 p$ y- }' R1 @  i1 D" g2 h
    Parsing = 'xpath',
& w* E1 y! C1 ]+ `; I    label = {* z0 Y9 u+ Q& a& ^, k: I
        'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
" R9 x" l1 U; M( M; G        'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
& @! d. r* v! f* C4 o        'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
$ [, d$ Q+ N. A1 M) `% \; `        },6 i2 G1 W& K4 J: t' b0 c4 H  H
    write='result.pkl',+ ^* ^, p6 v+ q; m* ^1 }8 X8 [
    next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',/ t0 L2 q( U' o: G4 `! V
    page=[True,'url_page.txt'],
- h; q. F0 B. [, B. K    clean=True,
" G; b: v2 v0 Z: C    # 字典格式,# B5 [' N) f8 M8 Z) Q- x
    # host可有可无,默认localhost
$ ~3 {! E  Y) I  g( T" Q    # post可有可无,默认3306
4 Q1 M7 }& {/ b8 g1 g) z    # user可有可无,默认root9 b4 ~  [1 P' z, ?
    # password必要参数,数据库连接密码9 K' e7 ]3 {+ Z! n* N% Q: ~
    # db必要参数,数据库即将存入的库名8 g/ L4 O: R' R) ^
    # table必要参数,数据库即将存入的表名
2 N4 T- J! h4 `7 C    write_SQL={
& m% R# n: s  g/ N        'host':'localhost',# @, \: T$ h% C( h. B' H7 y
        'post':'3306',9 \5 h, z+ e' l. _9 y+ z& \* d
        'user':'root',
% W* j$ w; b" J        'password':'123456',# i3 I( x3 x  A" x* e
        'db':'example',
, ~$ H% F* U9 B/ t) p        'table':'example'5 f( b$ N  c9 B% g. P% C5 ^' R' y( S
        }2 s% T# ~5 v3 |4 P9 b3 x
    ).run()8 u: M; T6 W2 L% U3 T& f

: J$ R$ D) A4 K2 F第九种玩法:重新启动爬虫
: G3 G1 }; R1 }& a1 j: Z; j) Z爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。
! _+ Q& u  L2 G- F2 _8 u. D9 K, g& r+ c5 `3 X0 ]
特点:
: M/ @4 h( [& H3 y0 ^4 C检测报错重新启动爬虫
7 z( n1 m9 h/ i8 n无需手动处理错误信息/ c2 s! q0 c# B7 n+ Q) E

' J$ e2 s, `9 c4 ]缺点:1 m/ F& x* W' l
无法收集子线程错误。
' Q/ d( m- H4 y" ?* ?2 K
8 L/ K3 M: b; S* J+ b  {* H. F7 w:return None  N' `0 M6 E* \0 @. {% A

) X, M& g( X- srequest.parse(( P+ _- e. O- H
        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
3 B0 D' P7 A0 A+ F        #login="taobao",
7 J# d9 J+ l2 A        type_url = "text",
' v& S: ~" T# |. v. z/ F# |        Parsing = 'xpath',$ A1 t/ D0 ?4 T; q
        label = {) E2 T; n! r3 G, {) ]( K7 @2 h" q7 Q
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
, E0 b( }: o! a) x* `3 a            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
0 s6 d& E6 h4 C8 X4 {            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
4 ]+ I9 d2 }' I4 c; j& i            },
; v- v9 o; N6 J        write='result.txt',
( X$ z( A. l. |! I8 b        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
8 q0 `) k0 G! {6 x& t        page=[True,"now_url.txt"],
* D" O* r) I: [) N6 d        # texting 参数为是否启用连续爬虫
8 @* F, N+ T/ b; B        # 爬虫程序异常报错后重新启动爬虫* s# p# d/ J, t8 M/ D! Z
        texting=True,9 q- G: I) P! Q- M5 H
        ###
6 k' v4 U* Y! @6 ~$ `2 c) w        write_SQL={
- q- q( m" D  e2 z            'host':'localhost',
" I- c) S' O% }# i3 k            'post':'3306',
/ m% @# s; C( H            'user':'root',
9 B0 F0 [: [# a7 f( v1 V            'password':'123456',; U/ W3 I# C6 u2 q4 K' \
            'db':'example',
7 e7 V0 A3 s6 j" u3 ~            'table':'example'
4 e: d; h$ N% g7 i" X            }
- n& d' f& M' \1 H% u- u. {3 H).run()  U7 K) `+ ~9 D8 r% I2 E- z, |( T
* G% D8 Z$ B- A! c; u$ J: H
第十种玩法:多线程爬虫' f/ C8 @( f0 s  }6 z% M6 o
特点:: l1 i" y( D5 w* ?
爬虫速度加快,
5 f, I8 E3 a. E. k) w" A- I* e, {更好的利用了线程。
, f! m( P1 H% J% @3 G7 O; b. o' b& e8 f/ f
缺点:暂无# W: j" G0 i9 V4 R
9 m! a. M2 o$ ?* Y+ S
:return None
& E5 M9 r' Z0 s" f5 M1 v/ C0 e# L
; m: p- m1 b# t; u# P7 |: vrequest.parse(! Y8 l3 j1 j( _5 A. a- F0 T
        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
" J4 q6 G( Y; \        #login="taobao",
. o' [# g0 e  V: ]& A        type_url = "text",
. D8 c0 k( d4 Z  }        Parsing = 'xpath',( {1 Q6 x# B. k$ ?6 G9 P
        label = {" _7 ]9 h/ r4 m' v; ~
            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],  J: s! `3 l- o) V
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
$ D( h; [# ~& |- S/ M            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
: j( S, Z6 H! ~            },
7 E5 o. N) m# C' B        write='result.txt',4 P' P' ]9 l4 x3 }5 f+ p; U
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
# T5 T1 U: K, x7 q2 h& T( j. I1 ]        page=[True,"now_url.txt"],+ m& z: l: e( G3 k0 V
        #clean=True,
  _( L/ ?# Y7 h5 Z        texting=True,
) a8 ]8 K$ w7 ]2 v" m        # status="threads" 启用多线程爬虫# ]) q6 y. {1 q8 {5 _  h; n
        # Thread_num 为线程数目,默认为1 单线程
2 M& D1 v5 H9 E" ^* E/ }        status="threads",
" A5 I1 ]% I( l1 n5 ]) ^! {1 _/ x        Thread_num=3,
1 e! c, D( a* E/ ]% @6 f: ?6 S        ###
4 W* B) r9 Z- S1 A        write_SQL={
- \' ?- ?# {8 G8 T  W+ V5 o            'host':'localhost',! |! n7 J$ E5 g- ~, K1 g
            'post':'3306',) n- a% {; A8 L/ x8 Y8 ?' X
            'user':'root',
7 ?; j% K' S$ [9 ?2 c( B            'password':'123456',
2 I) v- v7 d) y5 ]            'db':'example',5 p, A7 d6 |0 B
            'table':'example'
/ E: e1 [6 }$ g  ?            }7 O  \4 H. G  n8 {2 e6 O
).run()
4 ^4 |$ L& c! V- T: y
5 t% |2 j$ `* L1 u0 k$ @) ^第十一种玩法:多进程爬虫
) p4 z9 n, M9 O  A特点:
: @) h3 U+ F% \$ e  V' x爬虫速度加快,
5 R4 m. @2 ~) ~: H: b8 {4 F更好的利用了进程。
; h; {1 n/ m, l  E- K# s( @7 {% \1 c6 t. y. R
缺点:暂无! u2 n! K3 \$ H1 y, _/ d# u4 K  Z
" }& P4 B4 U! p  A3 m
:return None( Z( b/ ]  t# {# S2 K

  G/ a. Y. r; }* Q- g, g1 cfrom simple_crawl import request
  n7 \# `4 E8 n  L9 x2 l3 Urequest.parse(/ v: ?0 z8 y( w. D7 a, H9 i
        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
4 M) B/ K- \8 k% k% Y5 p& Y) @        #login="taobao",
& N1 r  v3 e9 `        type_url = "text",
/ |& n9 K6 j$ {% c: P        Parsing = 'xpath',
8 B$ Q- q2 A  }. o: H        label = {
8 Q' Z2 z. V2 ^0 i/ Z( c            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],+ J' s' q& p  C7 C
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
* n: ~3 D( _7 }5 y2 D            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
* l* B7 c- M3 j4 _            },# S6 e8 E. i5 |! u4 s
        write='result.txt',3 I( I3 g: k, n
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
* g- o% U4 R+ J( c2 `1 v' l        page=[True,"now_url.txt"],; r. ~# c! e' p5 l; a3 a
        #clean=True,
9 f8 k5 J5 c# q% V        texting=True,# G: G: b' |" b& f7 d
        # status="multiprocessing" 启用多进程爬虫" h  d( p- _% V2 ?( \' z
        # cpu_count 为启动代码核心数,默认为系统核数一半+ P) B5 Y" M0 h, w
        status="multiprocessing",
8 K6 Z2 e: U+ w4 w7 p- t* B  l7 |        cpu_count=2,
& I% J0 n7 ^) I0 B0 _. r# J* L) ?6 J        ###
2 A, T  @7 p6 {! j$ I- o; R7 |& m, l# r        write_SQL={
* E2 \1 c" x! Q% r, m& v( u5 ~0 s            'host':'localhost',
" }2 f4 _! s4 C3 q- i            'post':'3306',& [7 t/ w# ^* e% K' `4 l
            'user':'root',  R) [" G- \9 q4 ~/ s: J, n9 i2 Y
            'password':'123456',+ Y  ?8 c$ ^; S5 i
            'db':'example',  T; F/ Z/ A9 k: ^
            'table':'example'
; g" I' G3 [0 V+ C+ i6 r4 |, O+ {            }
+ f0 u9 g9 K! o+ v) p1 L# A).run()
; _$ S" y( A# V
/ m4 I+ h) ^* x+ U6 ?: s第十二种玩法:异步多线程爬虫% T/ W/ W1 f7 Y: _1 {
特点:3 s" w# C3 C' m# y( d& \) U
爬虫速度加快,
8 |# i4 E, L- G! J0 @" b0 @0 V  z异步使得爬虫无等待时间,& G/ u" w7 S  O- [
同时使用多线程速度明显加快。
! n; d' X: z" v$ }% U% j5 ]! P: J
7 v& @/ v6 T% D+ ^2 _缺点:暂无
/ c/ S7 X$ x+ `6 h" }: r/ |0 s( ?0 E& ~6 w. _' q  W
:return None
4 g% t- {2 ~7 c2 E. r( ]# i' I+ p0 l' w
' m0 L9 e6 E5 \3 Jfrom simple_crawl import request5 z! c7 [! W/ C# s1 @, C
request.parse(* ]& q/ p9 \& R. ~, C
        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
" A8 N3 P% j. i        #login="taobao",8 Y, H( O* e& \  F7 \7 @
        type_url = "text",' x- M# r0 s- h; o
        Parsing = 'xpath',! t3 _& O. c9 s) H+ Q% d: B
        label = {
6 H* w  \; {: x9 R            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],  t* s) J+ O2 j6 i% K
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],/ k* `+ G' U5 ^8 {6 f. h6 e
            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
$ v- ]! e5 V: i* g4 \            }," f/ n4 q* t+ c
        write='result.txt',% ~" S2 A/ \( K
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
3 y3 w' ^6 e/ F4 n; S3 a8 S9 @. u        page=[True,"now_url.txt"],
: O6 p& U$ ]+ u1 K7 ]/ {' U        #clean=True,: L' b) t7 K& k- T9 t" A( ~
        texting=True,5 r: {) N4 y# p5 M$ ~+ {
        # sem 参数为异步引擎数目,默认为5/ ?0 `; w# G1 e" R5 ]* W! I! `
        # 其他参数同上
$ M, D1 a1 z- p+ G/ ]        status="aiohttp",
* S7 G, k4 _" s. A/ L        Thread_num=3,9 z* S+ n5 `/ Y9 m% i! ]
        sem=5,
2 A3 I0 }. s5 S3 s$ e        ###+ g4 j. {8 R! `% Q
        write_SQL={
, [6 B" k; a5 C% s0 M3 g- A            'host':'localhost',( N( {' o3 Y2 A/ B( R
            'post':'3306',4 u+ F) F# _% d2 U
            'user':'root',& U! E- C7 g4 E1 M* h
            'password':'123456',6 m3 F! Y9 q: n* Q2 c* B+ |( b" d! V
            'db':'example',
6 o8 Z0 T5 B$ Q6 [  o* K5 Q            'table':'example'8 N6 O( A. L+ c# ^" L5 A
            }
+ }" \# D" P3 p$ Y. k9 V) E* `).run()
0 S9 |, N+ d9 H/ ?$ V" j+ D5 n% U
第十三种玩法:异步多进程爬虫
: b7 i) K$ G; S特点:
7 g; l( V* M( E) J- }9 O爬虫速度加快,
) j  @4 h) b1 f5 G) C异步使得爬虫无等待时间,
3 Z7 `" N. ^4 _2 {同时使用多进程速度明显加快。. u1 Y: D! C2 L' l
1 n! M# i+ ]* V- [
缺点:暂无) n. t, X+ ^3 S4 x4 r

& _9 |1 F* s8 Q: R5 S+ y8 D:return None
& Q% g( a: O+ l% i5 P$ Q) U5 F, V- g9 v7 F, }
from simple_crawl import request3 M% y; Y6 e+ x  B
request.parse(+ d9 C* F' d( d% b
        url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
& b# J) [/ E6 q% D3 V        #login="taobao",6 q. ~& S, W0 Q9 y/ b- {0 b
        type_url = "text",3 m9 y1 z3 Q& q  G8 C6 \2 k9 f
        Parsing = 'xpath',; J% A2 P' S9 ]) T5 o! \% {# M
        label = {
. O2 |  H- m* Q% g# ]            'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str]," d% v& [3 {2 g8 s! i  }
            'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
2 l/ w* }2 m* t+ \2 @- ]            'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]& s6 U" d$ P% Y% C. V9 D. E
            },; J2 o* P. ?5 ~+ V& Y6 \" i6 \  x
        write='result.txt',5 L; e2 }0 v9 [
        next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',2 W, x0 s! F2 I# G3 H7 P; S" B
        page=[True,"now_url.txt"],
% j! h; Q1 |- b7 {. \& K& G- T# s        #clean=True,) V  j. |' m2 j' u, R7 {
        texting=True,8 @; o& i' B+ x% p6 y7 q3 ^% V
        # 参数如上0 w0 n' @" {! _2 F& I0 y
        status="between",# v" n2 W+ Z6 W/ l% G
        cpu_count=1,
: u# B) y  h& l4 B) m. ?# L        sem=5,9 c' B* w9 {# w; X5 Z. ~. u
        ###
+ M& m$ q3 G5 M- M1 N( d9 i1 R        write_SQL={" h5 G, w3 m7 ~% v) W
            'host':'localhost',
' ]% W# i) J; P$ y            'post':'3306',! r6 \/ I4 G2 C/ F# ]9 ^; ]! B
            'user':'root',
6 `  l1 G% L4 B- o            'password':'123456',
8 O% e& W2 ^' X0 u* K. g) B7 K            'db':'example',
( H) r- q" J0 H5 G. t9 L0 Q) F& p            'table':'example') q  I& E& T/ F5 M
            }, K" U: H7 Q, q  }) y; h% L7 V5 ]6 s/ E
).run()
. r( h  s$ v" p5 {( F  u
2 L! k. U0 ]# s+ b0 W# w
8 u8 t7 A- B6 f; \; a8 m功能介绍完毕🤞
4 G) R( X: v( ~6 z( X最后还是希望你们能给我点一波小小的关注。
8 |# i; D, @7 t奉上自己诚挚的爱心💖9 l' f8 C6 Y% Q" w8 R
————————————————
. \( U, J6 F/ p0 Y版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
* Z$ K' B& P; v% v原文链接:https://blog.csdn.net/qq_45414559/article/details/106005684
% `$ H6 Q$ `8 i& z! E& t. V2 y* H5 |& b; d2 |! ]" Z! {8 R( {5 d

$ _( o5 Z9 V2 c: `* u
作者: 738391227    时间: 2022-2-19 15:34
66666666666666666666666666666
. S  m& W6 Q+ A0 ?$ U. F




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