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