- 在线时间
- 661 小时
- 最后登录
- 2023-8-1
- 注册时间
- 2017-5-2
- 听众数
- 32
- 收听数
- 1
- 能力
- 10 分
- 体力
- 55510 点
- 威望
- 51 点
- 阅读权限
- 255
- 积分
- 17604
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 447
- 主题
- 326
- 精华
- 1
- 分享
- 0
- 好友
- 79
TA的每日心情 | 慵懒 2020-7-12 09:52 |
---|
签到天数: 116 天 [LV.6]常住居民II 管理员
 群组: 2018教师培训(呼和浩 群组: 2017-05-04 量化投资实 群组: 2017“草原杯”夏令营 群组: 2018美赛冲刺培训 群组: 2017 田老师国赛冲刺课 |
仅需一行代码写爬虫–simple_crawl
6 J9 ]+ `4 v7 I& r F+ bsimple_crawl$ i( C% u4 S" U# L- B' {
仅需一行代码即可达到爬虫效果* L9 O) ~) [" E; O, x; \+ O; v
项目地址(欢迎star):https://github.com/Amiee-well/crawl. }6 W# z' S4 a% c
使用方法
! r4 F3 R5 \4 [% `$ W$ o3 q* lpip install simple_crawl0 g" ^! _& G5 @+ |; k+ S& q
3 W7 b0 K- E2 j; h### 以下源代码为简单介绍,详细功能介绍再源代码之下" ?/ q$ f0 b" }6 e# A
from simple_crawl import request
3 R4 h$ w# ?; g- Lrequest.parse(" X9 A8 z1 | n& Z% q( U( n3 Z
# status 参数为运行状态,支持单线程多线程多进程协程以及联合8 t" _" \( v; K6 P* N9 C( y
status="aiohttp",
- z; i2 S/ {* ?! K% l- N # url 参数为爬虫网址,单线程状态为字符串格式,特殊状态为列表格式
2 W% U; T; ?2 C! P3 A3 b8 p url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],3 w2 _( R; [# C7 {7 H$ L
# login 参数为获取登陆信息,如淘宝等网址需要登陆信息
8 w. r9 Z+ h1 r #login="taobao",
% {* {2 ^ t. F" U; F # type_url 参数为返回源代码格式,支持text和json,默认返回text; }. ~' g* `( Q N* H2 Q
type_url = "text",
) Q- m; O- t- ?. B$ m, d # Parsing 参数为解析方法,支持re、xpath和beautifulsoup# S* ~6 \ ~$ i1 L+ w
Parsing = 'xpath',
/ q. d) r" p3 p0 j% b k7 @, n1 ]/ y # label 参数为爬虫解析过程,字典格式,详情见下方; f7 |, Q D1 ?' T' \
label = {
6 d3 S [3 B6 D/ o. F 'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
3 d8 O% X# N3 X, b* A 'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],* ~# t, m& R5 j9 h5 T( B! H
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
$ R a0 L% ^& t9 C- w( ^. o6 H" Z },% j3 G- z! i7 }7 G, Y( [
# write 参数为爬虫结果保存,支持txt、csv、pkl、json,注:特殊状态爬虫信息容易混乱( K1 u# p* O- o! Z' w& N: W' x
write='result.txt',3 ?: ~2 H. h# w1 J
# next_url 参数为下一页爬虫地址,@必须为href,仅支持单线程爬虫# G: D6 w- [) @5 y Y, I: N' f/ v2 B
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',9 {* n$ D2 w% C7 [( ?1 D. z% K
# page 参数为断续笔记,第一个参数是否启用笔记,第二个参数选填默认page.txt,仅支持单线程爬虫6 T& M) y: F2 r7 `
page=[True,"now_url.txt"],
. j1 x% J; T/ M2 w5 |: Y# n3 T # clean 参数为是否进行数据清洗,防止大量爬虫收集无用信息
6 K0 d1 \. O3 D5 |* J #clean=True," v0 Z I$ c7 H
# texting 参数为是否选择连续爬虫,避免爬虫过程中出现非代码问题报错结束爬虫程序
0 k7 F: p( D( N* [2 g6 w texting=True,
1 h! i K& v1 C0 L # Thread_num 为多线程数,默认为1单线程,支持多线程状态和异步状态+ n: C. h3 A/ z0 O) b/ d
Thread_num=3,
* a. F+ a$ b1 p3 I # cpu_count 为多进程数,默认为1单进程,支持多进程状态和联合状态
/ e6 m" Y0 W3 h4 ?# [ cpu_count=1," k5 X( M+ @( f/ `: `- k6 M. I+ C
# sem 为异步控制数,默认为5同时启动,支持异步状态和联合状态# c ^9 \3 ^( ~
sem=5,2 k! U; {- d% ]. j
# write_SQL 为是否写入数据库,默认否2 \5 d, X0 t) w) ^# U' r9 X
# host 参数默认localhost
9 S, M4 j4 N, {5 w! m # post 参数默认3306% l, }4 L$ u" i$ D9 @
# user 参数默认root
& Z7 J" `& f/ R5 h' U # password 参数必填,必须正确( U7 R" p8 S, `5 S' m; Y
# db 参数为即将存入的数据库名,若不存在自动创建
# ]8 `+ a/ ?. v/ W+ I # table 参数为即将存入的数据表名,若不存在自动创建+ S/ n; m5 v$ r4 S
write_SQL={
3 v2 d# q( T' n( y5 M0 u 'host':'localhost',8 \0 Q: U2 R) ^: k) x7 r
'post':'3306',
: U8 s$ B% D' F 'user':'root',
* O) t( d; c& T2 z* g2 h 'password':'123456',
V- N: ?" }* O* P% R 'db':'example',; ?8 x; z, u. k
'table':'example'
+ ~* c+ W9 i3 @3 J }" u; f! x1 b; J
).run()
, b( o6 |/ n+ F* d
, [0 ?5 e; e$ R8 C% h介绍一下crawl参数设置:- Q/ c5 v5 w7 F) |
' f% i9 C+ d1 K3 z'''& e. [( O3 l$ F( m, n# w+ v
单行代码爬虫程序执行
& ]1 \0 _" }# U8 y:param status:启用爬虫类型,支持普通爬虫、多进程爬虫、多线程爬虫、异步爬虫、异步多进程爬虫,参数请参考文档
$ G9 ^& h5 |; K! X6 {0 d$ i4 a:param url:即将请求的url地址,仅支持get请求
J/ `! @0 P: ]:param type_url:请求url后返回格式,支持text和json格式返回
) V2 I% ~7 t: V5 k6 d:param Thread_num:即将启动多线程个数,默认为1单线程
4 e& `/ { `! K' _:param sem:协程信号量,控制协程数,防止爬的过快,默认为5 c7 ~# ?) }- s* l, `( m
:param cpu_count:运行爬虫使用多进程cpu核数,默认为系统核数一半6 v% @9 I E; N2 a/ i
:param login:模拟网站登陆,保存登陆信息( Z8 x- {! t5 ]& k3 R6 E# [
:param Parsing:爬虫方式,支持re、xpath以及bs4方法
a& H5 o( [/ l: A:param texting:是否启用连续爬虫,爬虫程序异常报错后重新启动爬虫,
* X2 a: W/ V9 S# N& g 多次报错结束程序,默认否3 P8 C E% r b
:param label:选择器内容,字典格式保存,$ j+ N7 G0 l/ c! }* `0 j- T! i- Z
字典值为列表格式,第一个参数为选择器,第二个参数为转换类型
( {: H0 d8 ~ _7 b. c7 w" P6 ` 第一个参数必填,第二个参数默认str类型
2 a/ [# z ~+ V/ ~7 `$ G( t/ m:param write:是否写入文件,支持txt格式、csv格式、json格式以及pkl格式,默认否# M6 m& M0 z6 H' M
:param next_url:是否跨页爬虫,选择器内容使爬虫继续翻页爬虫
& o( a% T, `) a. s:param page:是否选择断续笔记接手下次爬虫处理,默认否
z u3 h. N X' w% ]( O:param clean:是否进行简单类型数据清洗,默认否: W4 C8 {0 C3 J, E" U; O: I9 `. C
:param write_sql:是否写入数据库,默认否
9 S- I9 w& D( {/ H j 'host'默认为'localhost','post'默认'3306','user'默认'root',
; C7 u6 c1 i- f9 T# n/ Z 'password':'密码','db':'数据库','table':'数据表',
6 m7 a" v9 E. x5 e2 D 检测库是否存在,若不存在则创建,若存在则直接插入,6 R1 s3 d: a& W8 n
检测表是否存在,若不存在则创建,若存在则直接插入
, V0 a0 m5 O1 q/ q; S) _* f:return True, X' D, Q8 E" E5 S7 D
'''
' J5 k) G, X. k) ]介绍玩法
8 ^. h7 X+ M9 Y接下来介绍的均为调用第三方库的情况下运行:! I$ M$ P; S9 w* W
- G1 B, v Y( o$ |4 `5 Z7 M1 @
from simple_crawl import request
0 l/ E! v( T' X: F5 G第一种玩法:输出源代码
# U# G/ e1 B- G* w. t调用requests库进行源代码请求。+ p" J0 H6 H! s6 O: T9 S( K
4 {0 W1 K4 p' [! N( o# v# f( [$ u1 X
特点:" W2 t; L. e9 I* |" Y
请求失败则调用ip池处理重新请求访问,
8 N% w5 V$ W! Q# h& A" I出现五次失败默认网址输入错误。) \; @- Y+ p2 {6 W: ?
支持text以及json字符串返回。默认text。5 l4 V: f' T% `- t- s+ v
' d. n5 U# F2 X( n; ^$ s缺点:
0 w. k, q# G$ k7 G3 P' U0 n暂时只能进行get请求,不支持post访问 i8 U. [ ]; c! n! b
* G; |4 a* l# Q) A:return text or json- ?6 b2 r: z2 u0 V: X. P6 h' |3 ^
) t1 @! r. F3 E/ a- C2 N. b* Yrequest.parse(; t6 j( `. k" n7 A, k% ^) P2 D
url = "https://www.douban.com/group/explore",, h. g: F' F4 m8 `% x! m
type_url = "text"7 _) B. I7 b0 p4 f7 v
).run() v: U% r" v; {+ @# ]: E; N
# return text
. t/ ]# W7 W# z" s% u! A
* ]5 [2 O% Y# l第二种玩法:模拟网站登陆并保存信息: o9 R5 P- d# ?$ x; g6 ?3 g" Y# E
调用DecryptLogin库请求登陆访问。0 m& ~5 V8 B$ q/ S2 i
( [' y$ H2 K/ n4 Y3 u* X
ps:DecryptLogin库为大佬皮卡丘写的一个很不错的模拟网站登陆库,在此引用一下,因为单行爬虫原因不支持账号密码登陆,我将大佬写的二维码登陆使用过来了。再次感谢大佬开源8 r. _. j2 _+ H. E; g& {" d
在此放出文档地址$ H2 E0 b: @# [* u+ ^
DecryptLogin库中文文档:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/
; L+ E$ R' q" _$ s& d& Z$ R+ m1 c# j/ K* w; W
特点:3 ^% K; `( l/ V: H2 O' @
将DecryptLogin库中二维码继承到此库(非二次开发)
3 \) x! V7 Q/ p: x( a5 t支持QQ群、QQ空间、QQ安全中心、淘宝、京东和斗鱼登陆(大佬登陆库中所有的二维码登陆)
4 f3 V {8 `& C2 z; \0 l保存session.pkl信息到本地方便下次登陆运行: F v2 ]: X, m. ]' n7 ?( D
2 a; E4 `2 |) x1 k缺点:( Z4 D* M# `! _, X( C
session.pkl登陆信息过时无法自动删除。0 l2 p& y) b3 J4 J
导致下次登陆疑似cookie无法正常登陆。5 f: w4 B# y+ v/ l: e. J% o2 s( \
, A! F4 I# N* x; W4 R/ s4 A:return session
* N4 f8 M( I* k
; }% _: M% G! {2 t) h* Xrequest.parse(
8 l# G% M* R1 m: | # 臭不要脸的推广一下我的店铺. B* x: n: `8 r! [5 C
url="https://shop574805287.taobao.com/"," n1 N. l6 B7 C: K
login="taobao"3 V4 C. Q2 W, D- P9 X
).run()
# M: F* K/ j6 P7 _9 Q- e! u# return text
$ N- s, `, o4 G O4 C
_+ [; J6 I8 C6 I; g+ A+ D第三种玩法:爬取网站信息
* y+ U% A7 j( h e/ u- w& h! p2 H爬虫库自然少不了爬虫的过程
; Y# I G8 ]4 ]: U9 n1 k/ h h9 c. c' H
特点:
# a1 U( N4 ]7 i* m5 x支持re库,xpath解析以及bs4选择器。
% j5 }: w- G2 @' H爬取方法为字典格式。单方面输出。
- i) n) h; H/ a: A; [5 X7 Z! N字典键为保存的字段名称。5 A( D- }% u( \% K3 |) R
字典值为列表格式:第一个参数为选择器,第二个参数为转换类型。第一个参数必填,第二个参数默认str类型。
4 ~, L! t) n3 ~
$ _; X3 `* O F$ {缺点:暂无(等待小伙伴们发现)
$ i& c4 T7 \- W
3 y) t/ r6 \% B g) Z, C& z( V% J: U:return reptile_results4 Q( Q+ h; u' Y$ i( `0 E
: t7 h2 V4 H& S, q& d1 n; vrequest.parse(, l) n% p6 z5 @% d
url='https://www.douban.com/group/explore',
# G- x2 K* _% J # 字符串格式,选择器方法。
( X9 e3 g2 }6 J( l5 q! u Parsing = 'xpath',
6 e- U" U. `6 `, m$ j # 字典格式,参数如上。
& A2 }+ _: Z9 |2 D& N1 M2 m label = {
! Y( `% A# F& N6 { 'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
9 r/ R( w* M2 K, `" D: A% a 'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],* ]. r" H6 C7 m8 }& |( Z
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
0 R) ?5 v( F( `: d( S: R5 f( u }
# |6 k" X6 K7 V% C" j).run(), i/ a" k% h$ q; f# _
# return reptile_results(list)
. x" \$ X6 h: v7 T+ n6 G
3 a& Y8 T9 `! B# r2 {# Y. E第四种玩法:自由保存信息
5 \9 o% v! P# H% D4 g目前版本支持保存txt、csv、json以及pkl四大主流文件。日后版本更新将发布更为全面的保存方法。
6 |5 W' C/ W6 k" c1 ?/ a R. h9 I; P# L7 |5 ]) q# c; D" _6 D
特点:
; e' T" k! B! S+ C写入文件均为数据格式传入文件。
z$ G4 D# u! K6 \+ d5 `且输入格式规范方便阅读and省事。
& l+ ?) w- Q! s2 J/ y5 R: F& V' h6 f7 j2 Z! t3 i9 R* g. v
缺点:
' A+ \9 h2 a7 l9 E: v1 B I0 y保存格式仅四种,
" h, n) _+ u7 p, i2 |- t不方便用户之后读写操作。
: @9 H/ I9 G Q- d3 N' ]2 q
) p- t/ G: @$ K; t6 O+ Q8 Z) W9 w:return file
* M7 q0 n+ | }0 L& J% J7 `( t+ y
request.parse(
9 J- @: O. x+ ^/ m5 e' e' l url='https://www.douban.com/group/explore',* s2 p. P# m$ z( U+ m4 M- J. b
Parsing = 'xpath',
9 w* w9 p6 g; y' a! K: Z h label = {
: ~# s6 p: J0 T+ ^+ z4 k7 Y 'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
G. I* i I: D3 m 'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
( J! i' @; a5 P3 D 'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
, X0 y' T L, J* K" ]* B* p2 \ },7 O" _( P# [! b V! d0 W- @7 d/ _
# 字符串格式,具体保存位置填写
5 s7 S% y: s/ H- `# \/ } Q write='result.pkl': _& e7 R- a+ {; f& A# q
).run()
. M& P: f$ f ^( _: D( z% c# return file% s' ~+ M: ]: x, t6 L% ^( _
' D- U- U; l: I* I6 G5 J第五种玩法:读取下一页 url 地址继续爬虫
: @. o* M7 W) @& h T5 y这也是每个人都担心的问题,仅仅一行代码怎么可能翻页爬虫。这还真能做到哦~, F" R6 Z2 o; O
6 t: R3 ^% M7 m3 m& R, C特点:
: f8 F) L" g0 }3 t继承之前的Parsing参数选择器选择方法。' X1 s2 h$ R' z/ H1 y" A
在这里可读取到解析后的下一页 url 网址。
# E. [' X4 Y& e( E7 X5 t方可继续进行爬虫处理。方便用户使用。% j; K; t, _9 b3 C3 _
+ D7 w Q+ J2 P9 S缺点:
! G$ J; g I: I# i" O若爬虫时下一页 url 地址改变,便结束爬虫。
" U' B% t. U/ ]; e2 b7 A只能爬取所给 url 地址中的信息。. Y6 s9 a+ [/ }3 o: `
无法进行某一界面的多个网页爬取返回。 v& S& F) r7 I4 q9 _1 q2 R
造成访问页面单一流失。
9 ?1 }, \; V. r# I* J- R# F
9 V2 V6 d8 x7 m7 z( W }2 F/ y+ Q6 [5 X:return None
5 A- S! M0 }# `6 `* F' j0 n y( d' z" f
request.parse(
; R1 M7 ~2 E, R! Z url='https://www.douban.com/group/explore',) }% i% Q7 h0 @* g$ c6 u
Parsing = 'xpath', V% k- P3 ?1 x' B
label = {5 X1 O% e/ @( g2 i/ M- p
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
$ a2 [5 h/ O7 M3 c% O 'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],% ~' M; X8 u0 a$ Z& B0 i
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
4 d u, s+ d7 t0 U },
- s0 z7 K6 F: |* R7 x write='result.pkl',
. y1 }+ b5 t$ p # 字符串格式,根据Parsing方法继续请求下一页a中href# Y4 p5 F( K. x l
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',9 |2 o$ h2 ?0 x$ u' O. f
).run()
# K: s5 z! s9 R# p6 Z( i1 l2 W# return None ! y, B9 z, K- B* i5 \! y8 {! {+ N
! z# W) D3 k) p5 A2 P
第六种玩法:爬虫网页保存2 H( I' y, p# s7 v6 a
听说过爬虫断续重连的朋友应该懂得这是个什么神仙操作。每次爬虫运行期间好好的,睡一觉醒来发现代码报错了。。。这就是个很难受的事,还不知道之前爬取到哪一页了,只能重新爬虫了啊!
* |' [; V: Q8 v' w, m# G
k, z+ F2 g# T2 O8 x特点:1 s. ]; ]: T5 Y* S k4 i
持续输出断续笔记。
% V& Q# v2 |+ ?- u1 @+ r. B: \- F3 Z将此次爬虫的 url 地址保存到一个文本文档内部。
: j" ~1 o, k( f* _- C0 C下次读取文本文档即可快速进行直接断掉的爬虫 url 地址继续爬取所需。- V# c( R3 `. h0 Z
. y# j# S( i' [5 R3 I缺点:( g0 P/ ?1 A6 P$ W# l
读取内容不单一。" L; r; s6 T/ s; m$ ]& g# a* y
导致下次爬虫无法正确读取上次爬虫留下的痕迹。
: N( E% i+ I9 l. S; p1 k" f4 V8 y: f. S; a
:return url_file" S4 V7 a9 V% M( a7 ?
9 A# ~ L; u. z/ u8 b8 z7 Irequest.parse($ W2 P/ H, t% ]
url='https://www.douban.com/group/explore',& ?* F, _$ w# F( Z, F$ H+ O I0 c9 ^
type_url='text',
7 v/ g9 \/ ^- p: O #login='taobao',3 @" @5 {7 m/ M2 o
Parsing = 'xpath',
/ i: c9 K) u# o$ V label = {6 S- n3 C5 z) L% T6 V
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],7 d5 s g; E+ ~3 l# r
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
3 I9 L6 D/ H K) x; J 'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
/ x0 V$ R6 l) B' E" `# q },3 n, U' a/ o/ r* B) A
write='result.pkl',# F m5 `2 v' r( F5 L" e
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',& v) K9 O5 ?7 |" x) R( N0 j9 S
# 第一个参数为是否需要断续笔记。
) {! V( O# Z* r: o: g! w # 第二个参数为断续笔记保存位置。5 r* r6 ?; C" s/ z" n
page=[True,'url_page.txt']. e3 }1 u8 g8 j2 t( `# J. |0 R. Y
).run()
3 S7 T6 I* l" O! n0 S# {; m8 G# D# return url_file' W8 m: ?) S/ T
+ o+ S: W3 v4 L! c
第七种玩法:简单数据清洗
( H: w0 w$ ?& p1 \8 R数据拿下后,直接保存到本地有些大佬可能觉得很辣鸡,连清洗都不清洗就存入本地了?那得拿到多少废数据脏数据。那么接下来介绍一下清洗参数。
6 A$ h8 G, [; @+ V2 O# j2 Z# |# d+ r& \& H' G/ f# Q/ x6 W* u
特点:
' _) ~: {& _0 E; T8 f. N7 E4 Y r3 Y本人曾写过一个底层数据清洗。! L" j" H5 _1 ]/ x' Q
能将列表格式数据进行归分清洗。" e3 {7 G% M" @! `
主要内容请参考另一篇文章, b; z) k. R2 Y3 d" B
如下连接:数据清洗
) x4 I" `+ \* D6 a* M! w
) c2 V- _: b7 V! o& O8 p: u; F缺点:1 I; N; S) t/ g* W$ l0 h
数据清洗格式简单。3 W+ D. t( F! T0 _" C. h( _
数据清洗内容单一。
' ^1 f. V1 A$ \5 b5 P/ [3 V无法完全做到绝对清洗。
6 e3 U2 ]- L, k4 V5 U9 Y2 r有待改善。0 _/ p1 N S5 a2 P& Z6 `
) |: {$ |' L4 a( O& ^ }:return keyword_list, value_list# `# L& ]) c* N5 ^2 O
% Y) Q1 w2 w5 R h
request.parse(
+ I @5 T/ s" Z, F" x& S( T' P url='https://www.douban.com/group/explore',5 P* T, H$ n9 P
Parsing = 'xpath',: r& K. Y7 ]* Z) u5 t# U1 z
label = {
# I) r, n0 { X8 ]$ w# o 'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
. Q" g) r9 X% I. K3 L. c6 W& _ 'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
a$ s2 w8 i1 U0 L9 J 'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
+ p7 A4 b$ Z/ i/ b$ `1 `' b+ W+ Y },
5 K2 n1 L) i5 F# N* C5 g8 Y write='result.pkl',& P' V$ C8 [6 g
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
: X5 J( |7 @( C& w" \+ m9 [/ e page=[True,'url_page.txt'],3 t \0 C) O& ^2 v' x4 d# i4 M
# bool类型,默认不清洗$ ^( @- }" O+ N' w
clean=True
5 k& g: n% q5 n1 j& c$ h+ ?$ @).run()
2 m$ s+ c6 u9 J$ n
+ g0 v# X& |5 j2 A3 o第八种玩法:爬虫存入数据库
: [ H. i- \& q) |$ j8 ]! j( e存到txt、存到csv、存到json、存到pkl,那也太low了吧。现在流行的数据库用不了么?那是不可能的。。
7 u: L& t! M: N0 t, T5 S" M
' }* q, |$ O: I' |9 b特点:
6 E3 n2 x2 } X; G) {. X信息存入MySQL数据库。
; \4 H* K: |; O* V可连接docker远程数据库。
y$ Z2 Y5 u# \/ I* `数据库的库名可以不存在。- E: y, Y# N2 z* F8 N# ^0 h
数据库的表名可以不存在。1 l3 r% l( |# z: F7 B7 e6 p
根据之前传入字典键与值参数判断表类型。
4 @. R; l: ?8 q, K' x B自由建立数据表传入信息。
1 r5 d8 l" I% `
! Y% [5 X/ g! Q9 M8 B& f; A缺点:
- t, j) z7 Z9 j7 @& u) a仅支持MySQL数据库。* z( `. ?4 L [# b5 R
! f& v1 y" [3 E# `- T
:return SQL. K; @/ \3 {* ]% X1 {+ M! u! h
! \& J6 g1 L) d7 l; _+ @5 ?0 [request.parse(! O$ s4 E3 i( E. Z' u) e k9 A3 [
url='https://www.douban.com/group/explore',
1 b4 Y* r8 S) _+ N, \/ `% z Parsing = 'xpath',
: w1 {! ~; ^* W label = {0 N2 B3 J% Y, N/ E7 T
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],( ?8 a) u V. X, I
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],$ i$ ?( X! U& r; J4 ~
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
|' @ |; U+ `' W },% U+ B4 X1 J, ?" d6 z! o
write='result.pkl',' u0 O: i' Q; k# [
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',; s l; P5 ]1 k; b2 B! [. C7 b5 l
page=[True,'url_page.txt'],
2 E2 J+ C' T' D+ N m6 Z clean=True,9 y* M* b, s, o! q/ g) x
# 字典格式,3 }; Y8 Q5 g9 A. I- s b
# host可有可无,默认localhost
3 g2 F: H4 I X # post可有可无,默认33061 @- C& [/ m z0 D* t9 }
# user可有可无,默认root
, Z# F, z' f9 u% {+ M8 q4 G6 V( n # password必要参数,数据库连接密码; j; R* _. U3 l
# db必要参数,数据库即将存入的库名
( r* p) d8 I5 T # table必要参数,数据库即将存入的表名8 ~9 `3 L9 Z& t5 v# y, X
write_SQL={
2 q: S5 F+ k6 h5 X 'host':'localhost',# Y2 a6 R- D( T0 g3 i
'post':'3306',
# C4 h) i- g5 h5 x! J2 U& k 'user':'root',+ b: @$ B1 `2 O+ D( ]
'password':'123456'," |5 J6 I6 I! I4 Q% b: Q( e
'db':'example',5 I. g( x/ w5 [7 t: }" @
'table':'example'
! \" C* K; O) B, ^- l3 o }
4 P6 L8 N& i9 d, e3 n, X! e ).run()
3 P! }" U" ]# u, Y# L" S; W/ y% i" X& f& y
第九种玩法:重新启动爬虫
2 v; K8 ~* Y# G) [: T, K- {爬虫最让人厌烦的就是被一个不痛不痒的错误信息给终止爬虫了,比如意外的远程断开链接等低级非代码错误,报错之后还得重新启动断续爬虫,就显得很麻烦。我做了一期爬虫程序异常报错后重新启动爬虫,多次报错结束程序。9 X3 O1 t6 J, D7 P! N5 e) Z' L
1 X5 v1 ]: ~7 k$ F9 d$ K特点:
7 u) U8 K- H' f' u: i检测报错重新启动爬虫
0 b% w6 }- Y6 J* K3 z3 [无需手动处理错误信息, E# Q4 V! r) P5 O
% b( P, n4 T- H0 h& }1 ]* X! w
缺点:; b% K1 k! O; m* P
无法收集子线程错误。
& F0 G. |' |4 p) M( i [( P) k9 \/ r! F1 U
:return None- V* X* u& |+ B+ g
7 A/ q& p5 J) W" frequest.parse(
7 V% z( M, b3 V# w url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
$ O* X( O" A0 L4 D6 \# z #login="taobao",% i. P8 J, r& N3 C! n. d+ }
type_url = "text",
: s, h4 J8 z) _+ N Parsing = 'xpath',
- C) L& x0 }" E" L label = {
2 S( K% A* `9 _ 'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
% c- i" `2 y ?1 L# w/ P 'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
& O+ p* E! R% z& @4 _ 'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]4 w2 D y4 m! t0 }8 h. |- X
},
+ H; s w, L% ~, A; B% A write='result.txt',
, z% K9 d* Z2 U% |2 e next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
, l" e9 F* H: c' V5 l1 R page=[True,"now_url.txt"],- v+ R6 ?9 G" {) @# U. W
# texting 参数为是否启用连续爬虫9 m \' h* c- f0 f8 o+ Y
# 爬虫程序异常报错后重新启动爬虫
2 n+ E4 z& }3 @# A' }6 j texting=True,
7 o) z0 T3 a$ F, o: G3 \ `) J/ ?- x ###. Q0 U- s) O: }' R; E7 s+ q
write_SQL={
8 L2 H+ {9 H8 _8 _, `6 ? 'host':'localhost',
+ Z3 n: y8 d n) g5 W 'post':'3306',
0 E" u- \4 q" Q2 \9 E: J0 v5 s w 'user':'root',) e# d6 q! g/ E5 z4 P4 O
'password':'123456',
2 ?( [3 y) p1 N5 }) g' U: C 'db':'example',7 _2 U; M$ N9 I! z9 L( t
'table':'example'8 }9 [" W2 y1 D, a! v& ], N7 {, e
}
6 w' Z$ S1 V. [ w).run()
6 ?, G1 \5 j& I d( f0 |4 L. n2 i: ?$ o
第十种玩法:多线程爬虫% t# Y* j0 D; j- f: q, [4 m9 ~6 `
特点:
O" b' _( c2 x+ C. W9 t* e爬虫速度加快,
6 M G2 E! @% l: A0 \4 K更好的利用了线程。
( J3 U" C6 H. k* ]- s# b/ ]5 m! c+ g" k# L3 t5 v
缺点:暂无, N" y& e) b2 L2 j9 }
) y) o- A8 j6 L$ C0 }8 F0 b:return None) n( R$ Q' F; r" L
5 h7 c4 S# S7 m# I
request.parse(
8 E5 r( I, T& c2 `! O url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],/ |' ?2 a# h4 F* v
#login="taobao",
G u2 S+ @/ }* P& s type_url = "text",% F4 ?: `3 i2 P4 \" y9 D' E
Parsing = 'xpath',+ Y& J3 Y( Z+ _0 m/ j- [" ^
label = {
/ X# p$ ~5 N2 J- z 'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
8 q: H7 U$ k! Z% T! H& p 'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],7 ^3 u; B7 d! [: V) T2 T. M
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]6 C5 S% ~# @/ N3 ?! m# b/ a
},9 I+ H" t4 u) f0 U) J4 [
write='result.txt',
' i( T+ U. o6 M1 U( e2 E next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
4 p; D; G) V) W& L page=[True,"now_url.txt"],- S, H; Q% p, @! @' B9 @
#clean=True,
( ?' A _3 b. `( V texting=True,. \( t8 U* J6 ~: c( n
# status="threads" 启用多线程爬虫
: b# k" T4 ^# p' E/ J/ k # Thread_num 为线程数目,默认为1 单线程
/ ]& \* I5 [8 f9 m2 {: q, L6 v status="threads",
! |' S- }, d8 S) W Thread_num=3,
. n) y$ K _. Q ###' B7 i6 y+ q' A$ g% k' N4 u% c
write_SQL={
2 r Q. g4 z0 S% \ u 'host':'localhost',
: O- _' I* W; L! n 'post':'3306',' u6 ?$ Y% a# A) J( O/ N: G7 B
'user':'root',8 Z" ~7 t( T5 Z1 E* Q$ c, D
'password':'123456',, H/ I1 ?! [$ }7 n4 G
'db':'example',
( _( W: g/ k" e ]3 k9 k+ G k 'table':'example'
/ I# n3 t6 F' M- {; _ }! T9 k1 k" N( O o# L
).run()
: p3 }& h+ V; N, b/ P; O* S, f: [7 Y2 V. M
第十一种玩法:多进程爬虫
/ ^" w( R% n8 P特点:
* |8 a$ P9 h0 a o爬虫速度加快,/ u3 I% y; b8 ]1 e
更好的利用了进程。
1 p) B" [6 X8 ^* f9 C
! T2 r' S. W' w缺点:暂无
. g0 s' G% o0 p- Z7 s
) D/ z; D- {2 A2 u:return None
. K" s0 t* u3 _0 i$ d& R. p( b2 _/ _( p( v8 p
from simple_crawl import request
, M I8 v) a7 D5 erequest.parse(
0 ^4 T& b! `7 C m# j/ e url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],. _6 v2 z' U+ o7 @! K
#login="taobao",
1 _7 C0 J& `' L type_url = "text",
( m+ |/ b9 u7 D$ h9 u8 k3 c Parsing = 'xpath',
+ i8 o) t! e# x }+ L! j0 W* X8 E label = {0 G3 x8 K/ o* q+ E# o
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],( V+ k, O! Z: M5 s; z' P
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],7 v9 ]( _5 H& n- B
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]4 P$ L9 o- c/ h% \; R: _) ]
},
& b) ?1 F5 F; L6 ^$ J write='result.txt',
+ g; u o/ w/ ?, [0 [- d next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
7 u5 i: s. O' d) \* x page=[True,"now_url.txt"],
" j' m- v* W6 l& R #clean=True,
1 F8 e4 f9 m/ A* c" A texting=True,; l' l5 L v0 L. _( M# i
# status="multiprocessing" 启用多进程爬虫
# I5 C7 e/ j) J# o% m # cpu_count 为启动代码核心数,默认为系统核数一半
+ q& P! x' b% z+ N; O0 E) a8 \ status="multiprocessing",
9 f6 ~4 i* t2 ~8 m$ X5 r* d cpu_count=2,0 C8 X2 ~9 [$ _' T
###) U! p" @; d K
write_SQL={
3 _' a' ^/ f3 n3 G" G/ Q/ a 'host':'localhost',# a H9 K9 e7 V5 H2 k; o
'post':'3306',' E" [ }/ Q0 E |
'user':'root', Z: d/ }% H2 H- m
'password':'123456',
) O+ X& d1 d5 M- _/ S 'db':'example',
$ E& w s1 f3 q5 k3 g- F8 P 'table':'example'
6 a1 i& m$ b! V0 Y }
! _3 E& A; F3 [/ a% o0 Q' K: f).run() [# v& ?8 k; w
0 e! I s4 h4 Y5 |. H5 o/ k第十二种玩法:异步多线程爬虫. G3 G, C) G% W. ]0 Q, Q3 {7 P" X; v
特点:9 a8 ]& M3 m1 G
爬虫速度加快,
& |' n3 O$ ]. M/ S+ ]3 W/ ~1 m异步使得爬虫无等待时间,
: ^; \7 E6 H+ p# o! U* R同时使用多线程速度明显加快。- K9 H+ v3 L& b7 K( |: X
$ s8 ]( u5 }, a" |
缺点:暂无# w$ ~4 ^2 ^3 c: M+ Y2 V
6 H% W- m, X9 i% Y+ i: i:return None
* s9 s/ z1 H! A, C# U3 Q( \* |+ Y/ ?6 A2 y u! L: b' G
from simple_crawl import request
7 t" |3 W4 F$ _0 ]4 jrequest.parse(4 X# S( b2 A W8 j
url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
) V( U6 Y; }$ `! W% n #login="taobao",
$ V9 S- s) U) k type_url = "text",
% m" o" v! o+ f+ X+ p Parsing = 'xpath',
- n9 o: R8 v. E label = {
, P8 u2 K3 r8 V4 L 'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],+ V/ _. M. B! o4 X) s7 {% K* W
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
$ w+ \: ]) P( H; z4 G, g: X 'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]5 n- r+ ~) M/ G! L/ V! E
},1 c- ~) x6 S# ]; m+ f$ f, u
write='result.txt',
( c6 M/ w; q* h& o! }8 j& J/ I- o9 W next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
; S) x$ g5 P! d O; M ^ page=[True,"now_url.txt"],
9 T6 R: A- y7 G: h1 d #clean=True," D5 `* P# k, }% l, `/ ~8 t0 O
texting=True,
; n: X- c% x& y, x: z" V # sem 参数为异步引擎数目,默认为51 d8 h8 z# U i9 k# |
# 其他参数同上; O( o3 I. E+ k7 Q! o7 M" I! b
status="aiohttp",: g* G4 G( V7 j, _
Thread_num=3,4 `$ P5 q3 n$ v# H2 v/ u
sem=5,
! d6 e" E6 w* U+ X ###
7 _" A7 H) W8 x1 G! x5 y/ H2 K7 L write_SQL={
0 _" F2 w) k, _# t: W- C9 E 'host':'localhost',
( |3 ~1 k$ ?( b3 I" M 'post':'3306',2 O Q% ~2 ]3 W; G
'user':'root',
5 U1 x7 G! w0 y& E 'password':'123456',
* d8 Z9 S+ j7 C! L 'db':'example',
: q X* n& }2 R# J6 W2 e. c 'table':'example'
/ I4 Y6 X0 G1 z: r }6 y# \" z7 S* F3 g$ l
).run()
4 n/ l; [" x' Z* i8 ?0 _7 h: \; g0 `2 X
第十三种玩法:异步多进程爬虫
- ?0 d3 r) X! e/ L9 Q5 U% I特点:
1 w2 c! c3 ^' I q2 K爬虫速度加快,+ w2 A4 y0 G! X. a# q' h0 U5 f
异步使得爬虫无等待时间,
. E' c: l& v \# s& K; n& k同时使用多进程速度明显加快。& c0 U: m# F+ G. g) e9 H. E5 m* _
6 f# E2 b1 B0 X- h: K$ r4 J8 m缺点:暂无
4 C2 ?# D, u) C
2 L3 O- H) [$ ~1 u:return None
$ }) @3 G, r+ k- ~: H7 `, R; K9 W9 L2 W6 o# {8 `2 A5 b- {- g
from simple_crawl import request+ S' t9 R( P0 G: z* W& y3 B, X
request.parse() B5 G# R" t$ n4 |
url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
1 `% o9 G& a1 R, _- |" f" V5 B& w. ` #login="taobao",9 W: V) h7 r+ |% d7 e- H3 \
type_url = "text",( m: r$ `* c3 a+ ]
Parsing = 'xpath',
; f" q) M/ {3 }0 @ label = {
; J. x" |/ n& F1 ` 'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],& B% @( d4 s9 ]
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
" @7 ^& u; p, b3 ~6 a) k4 Y 'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]$ w( C. Y2 F O% V5 z0 L! S1 h
},
, v2 I9 f' E/ b! G# O% G- G0 l write='result.txt',
+ M/ M6 G2 |6 }3 e0 Z9 \ next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
7 T! _% T/ v, Q4 q5 s L( E- m4 A( Y page=[True,"now_url.txt"],
: o; M/ R0 V7 f$ m- B$ s #clean=True,% K8 j& c$ k: I: f
texting=True,7 k4 Z. {$ s9 j( w- o
# 参数如上2 y' q- l5 [, o' M3 d8 b; B9 @
status="between",
1 ^8 J% a! E0 @6 M% t cpu_count=1,
: v# W% k2 c- J- x' P7 L sem=5,
3 z" A8 }# |/ a7 Y, t9 V2 Y& P ###
& o+ g7 h+ }) t* o7 T$ T5 v; ?1 L Z write_SQL={
7 {$ B$ H( ~! o+ l& z 'host':'localhost',
5 L: T+ V, o3 R; r4 J 'post':'3306',7 x9 k& n& Z3 }
'user':'root',& _6 u0 a& N$ x' S* x3 N A
'password':'123456', }( b& E1 t, }, {6 {6 H) h* {* C
'db':'example',7 K* ?2 x3 j$ Z9 l
'table':'example'
* _5 \3 c0 ~, j' u/ Z4 p( z. a1 d3 L }
4 |- f5 f7 H7 e0 L2 O8 ~- i' ]).run()
6 Q o8 b5 p/ @ r8 n4 ]; G0 V8 Q. V4 x# f4 r& S* I
2 h3 m4 ]# p, I5 x' D9 `/ _; n/ q功能介绍完毕🤞
; Q3 Q: w' Z) m最后还是希望你们能给我点一波小小的关注。
" Q( i3 t( A- N( @6 ?; f% a奉上自己诚挚的爱心💖
' J6 Z6 e" n& I0 V( G————————————————
. x8 `9 O6 c5 _9 g$ g& x# {! ?1 i版权声明:本文为CSDN博主「꧁༺北海以北的等待༻꧂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。' G2 s! t0 Q3 ?1 R2 p" H
原文链接:https://blog.csdn.net/qq_45414559/article/details/1060056843 f. z5 G- o2 J
+ w9 J+ ]7 s/ C! k
# y2 j4 X( F* z$ b7 p# z |
zan
|