数学建模社区-数学中国
标题:
Python爬虫仅需一行代码----crawl第三方库
[打印本页]
作者:
zhangtt123
时间:
2020-6-2 16:00
标题:
Python爬虫仅需一行代码----crawl第三方库
仅需一行代码写爬虫–simple_crawl
7 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( w
pip 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 request
6 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 k
8 \- 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 |- r
5 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 l
9 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 text
6 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_results
1 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 o
request.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$ F
request.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 {" x
request.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+ H
9 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可有可无,默认root
9 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. D
9 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- s
request.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 |: v
request.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 c
from simple_crawl import request
n7 \# `4 E8 n L9 x2 l3 U
request.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 J
from simple_crawl import request
5 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 request
3 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