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