QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2705|回复: 0
打印 上一主题 下一主题

爬虫抓取信息

[复制链接]
字体大小: 正常 放大

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:18 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
#!/usr/bin/env python
: S" F/ i' u* S# -*- coding:utf-8 -*-/ g* H0 G+ u+ ~9 `2 d# g" r6 \
"""
  P* p6 Q' G& G! s! B$ ?Python爬虫,抓取一卡通相关企业信息  x$ j2 X# O; {. o
Anthor: yangyongzhen
% y/ h% S- G& ~! N2 ZVersion: 0.0.22 ~$ a, e& G2 E7 j& k8 N
Date: 2014-12-14
, X" w6 {  S0 y6 w. I$ OLanguage: Python2.7.5# v3 W( E5 M. d
Editor: Sublime Text2
8 y, Z) e+ b/ y" E1 |"""
" _1 q+ t# b3 v- }
7 y4 Z  r2 ]3 F/ R0 r  V1 U; ximport urllib2, re, string
- G/ B3 O4 M: i8 kimport threading, Queue, time
4 w# E4 ?! D1 j, U( j2 fimport sys# ~  {7 K& Y' L' ]/ N9 A- F" I
import os
+ P  K8 V# c/ e8 R5 sfrom bs4 import BeautifulSoup
. q/ Y9 r: b: `: P& h#from pprint import pprint
0 w, L' n' A* i( V
. b+ U5 {# `# X, W# d4 V+ Sreload(sys)2 A! Q" B- H* D# p- T2 U8 S
sys.setdefaultencoding('utf8')7 \$ l) s1 w8 Q, d
_DATA = []% O- I4 m1 a0 A, n  f; W
FILE_LOCK = threading.Lock()6 j4 q" U, R4 c& [# {
SHARE_Q = Queue.Queue()  #构造一个不限制大小的的队列
  T  L9 o/ z0 K% q9 n2 K* \- W_WORKER_THREAD_NUM = 3  #设置线程的个数
# N. m& a" B# X3 Z# E: R, K
( Y0 t& t4 k. s_Num = 0 #总条数4 k+ Y/ V* T" F9 @2 M
class MyThread(threading.Thread) :
  g) @/ s( e; g% A% Y  j; @2 D" S. t; U4 @! W' V
    def __init__(self, func,num) :
5 P& \* H5 \$ ]% h        super(MyThread, self).__init__()  #调用父类的构造函数
7 \! {) f8 A+ K, F4 O9 c        self.func = func  #传入线程函数逻辑
2 H$ a* L5 V- ?, J  h        self.thread_num = num  # B8 V3 @8 S7 |% }3 P2 s; j; M: |
    def run(self) :
/ ?7 }, L1 W/ w1 _3 G        self.func()+ B$ o0 G4 s1 F, u# J
        #print u'线程ID:',self.thread_num
) {9 |. v- T! r0 i/ c  a7 Y2 [2 P
+ e) J+ B1 ?7 q) `def worker() :
( P- f% Q3 f& |: v2 _& N  c% j& ?  O    global SHARE_Q( D. b0 }. ^0 ^$ a
    while not SHARE_Q.empty():
: e2 ]7 I# c$ a' ^9 K7 t        url = SHARE_Q.get() #获得任务. M, R$ w5 M! l, h
        my_page = get_page(url)/ \1 k, ^  \; k- u
        find_data(my_page)  #获得当前页面的数据5 p% X7 \! m$ P" n/ O4 l$ f
        #write_into_file(temp_data)
. }0 N$ Z" }, y+ M8 M        time.sleep(1)0 g; n# i7 u, k2 Y8 J4 P# b. N
        SHARE_Q.task_done()2 g: F3 l- N8 o6 z$ K
8 F3 ^- {& q* s) P( L8 s5 `
def get_page(url) :
- ~! C5 ?; T  r) ^* n    """
& V. h( F( b1 m/ L' \    根据所给的url爬取网页HTML
" g  D# h1 P7 P( p    Args:
+ v4 D( H, A. l( y! e& q, O- H        url: 表示当前要爬取页面的url
" k( q% ^" S# v; H! Y2 s' C3 ^    Returns:; u5 Z. P- @; l! M, ?2 Q$ n+ O4 i
        返回抓取到整个页面的HTML(unicode编码)
5 s- h4 x" s/ g    Raises:
5 ^7 f+ {. ]% g6 e# k        URLError:url引发的异常7 z; h# R2 s- N# b: M9 D( K/ Q9 L
    """
' A% J3 L: O8 }' K8 O    try :
" P5 _- |8 h. K( Y. |! q            html = urllib2.urlopen(url).read()
% ^: C& N- K: n" u- H            my_page = html.decode("gbk",'ignore')
8 ~5 G0 U9 u: W. K" ^            #my_page = unicode(html,'utf-8','ignore').encode('utf-8','ignore')% b  C4 h! a# Y8 E+ Z" E
        #my_page = urllib2.urlopen(url).read().decode("utf8")' d9 |1 ]# S9 s; B* b. Z  `" O0 P. j' V
    except urllib2.URLError, e :, G+ V( A2 L- o, ]
        if hasattr(e, "code"):$ M' j7 G* M3 ~. D. ]6 s3 ^% p
            print "The server couldn't fulfill the request."
& p$ x; ]: Y& \8 H            print "Error code: %s" % e.code9 `8 }3 F# r5 O9 V* V
        elif hasattr(e, "reason"):! b- X- E0 T5 \2 |3 a! ~5 K
            print "We failed to reach a server. Please check your url and read the Reason"
$ ]3 ~3 P0 N: H( l            print "Reason: %s" % e.reason% ^6 f: K( |8 X( Y- w
    return my_page
  A, I) K6 i7 h, G+ ^  H* l7 j7 ~, c3 ^& Y, Z( \8 i
def find_data(my_page) :
% u9 {; k5 k- }, }. z3 t    """, \! q" x2 D8 C" E8 H8 `& R
    通过返回的整个网页HTML, 正则匹配名称
4 h5 A6 P2 e/ q' f2 F
) B* i7 q: r) c' g6 i! i0 {3 Q  N    Args:
* B8 h" b2 L4 A6 c        my_page: 传入页面的HTML文本用于正则匹配1 L/ P/ z3 \$ }/ _+ o
    """
; @8 b9 ~. ?8 t1 n/ i    global _Num4 a6 }: @  n& e3 F7 r9 I+ U: j
    temp_data = []- J7 s7 U# }$ v3 Y8 G& Q; X- g
    items = BeautifulSoup(my_page).find_all("div", style="width:96%;margin:10px;border-bottom:1px #CCC dashed;padding-bottom:10px;")
5 r' X$ w( Q) `5 c    for index, item in enumerate(items) :" `. @0 }  c+ Z$ g
            #print item& M' i1 b, z- Q1 P
            #print item.h10 @- i3 K( h4 ?/ D0 }) N! f
        #print h.group()
) z* Q! F' E( s% w            #temp_data.append(item)
& u3 R/ K! Z7 D) P            #print item.find(re.compile("^a"))7 G0 I/ y. _$ D7 ?( l. K
            href = item.find(re.compile("^a")): P& _4 M  z9 _: o  Y. Z2 N' J! V
            #soup = BeautifulSoup(item)
% B) a$ P( O5 [  S' ~1 d            #公司名称
$ y0 Q# X1 l4 F& k  ]; n, R; q' v  P            if item.a:8 m: w" U: d- ?: z0 W" Q
                    data = item.a.string.encode("gbk","ignore")
) i0 W5 L. G  L4 d) C0 |                    print data) R4 x9 P0 y# _1 m' w
                    temp_data.append(data)  `) U" z; K! ?- ?2 F+ v% B( c

2 h" F4 l2 L7 Z5 d# K( e" \            goods = item.find_all("div", style="font-size:12px;")
) G! u- M: G# z4 n" @5 @( S: z) a           
/ z. t" ~7 J& b% h' i            #经营产品与联系方式3 ^/ x+ P0 U2 W. U- y% J
            for i in goods:; S% z$ g2 y" \6 G
                    data = i.get_text().encode("gbk","ignore"). s7 a% \9 a% w1 _8 r, b
                    temp_data.append(data)
$ i$ \: {+ @2 Q4 f( O- Z1 H                    print data0 w( Q: ?8 t/ M  l. h9 q
            #b = item.find_all("b")
; J4 T1 K" l/ O: p            #print b5 J  ?2 |  \$ H5 d/ c$ ^
            #链接地址+ j7 E! _) o5 k" m+ E3 X( c2 ^
            pat = re.compile(r'href="([^"]*)"')
4 F3 {% T7 H+ ?' t            h = pat.search(str(item))3 K  u) j3 X% p5 |/ P
            if h:( _; C; i; ~3 g9 S/ o
                    #print h.group(0)
/ ]3 r7 P1 X  V' [# X                    href = h.group(1); S2 Z( q% ]' r2 j* b' t
                    print href" K+ y( y1 j1 G
                    temp_data.append(h.group(1))
" R/ @8 P1 G$ s' W( l
% R# Z- x' d" ?            _Num += 19 i& w+ {: q/ S+ j" D
            #b = item.find_all(text=re.compile("Dormouse"))+ t& s# d0 @, m% S5 Z
            #pprint(goods)
7 T# y( Y7 Q8 U4 x/ M. ^! p8 p            #print href" B$ N+ ]$ B+ ~4 E) E' I
            #pat = re.compile(r'title="([^"]*)"')# t+ \; ^2 }. W2 f- F0 ~* s
            #h = pat.search(str(href))
" }1 U- E' l! o4 l1 f7 w/ L            #if h:
7 L8 I! N  W/ L% C                    #print h.group(1)
3 \* w: F' g2 B9 t, D! F6 G                    #temp_data.append(h.group(1))* ?. f9 o8 X" L0 u. |: Q3 t: m
    _DATA.append(temp_data)
" {) k; n' Q8 J- [8 A; v( |4 P3 K( Z! {) D& U9 O* H
#headers = {'User-Agent':"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}##浏览器请求头(大部分网站没有这个请求头会报错、请务必加上哦)- B9 b$ `, X; L0 W
#all_url = 'http://www.mzitu.com/all'  ##开始的URL地址
2 x1 K; c: @1 j/ q4 s) K#start_html = requests.get(all_url,  headers=headers)  ##使用requests中的get方法来获取all_url(就是:http://www.mzitu.com/all这个地址)的内容 headers为上面设置的请求头、请务必参考requests官方文档解释! }0 b. z! A" |4 p
#print(start_html.text) ##打印出start_html (请注意,concent是二进制的数据,一般用于下载图片、视频、音频、等多媒体内容是才使用concent, 对于打印网页内容请使用text)
; c% E5 N& L3 {: ~
# u0 ?: Z* Z9 E( m. @def main() :
% x7 v5 Y. s* |5 H& G8 L% `    global SHARE_Q
8 D2 P) [6 q/ m6 {    threads = []
- h6 }$ Z8 ], d, m4 S( k! h1 A    start = time.clock()
* `1 G. c4 n0 E) r+ w    douban_url = "http://company.yktworld.com/comapny_search.asp?page={page}"
6 T0 \9 H1 Z" L7 v: M/ ]; F    #向队列中放入任务, 真正使用时, 应该设置为可持续的放入任务# p  O: ^2 X' {" L, M
    for index in xrange(20) :     D) o4 r  T0 x0 T$ n& q* r
        SHARE_Q.put(douban_url.format(page = index * 1))0 A6 G7 F8 o5 b$ R% L: a5 A
    for i in xrange(_WORKER_THREAD_NUM) :7 I# Z( y% n9 {# g+ u& R
        thread = MyThread(worker,i)% |. B& ?. O5 ?! B4 G( b: e
        thread.start()  #线程开始处理任务
7 }( K( L0 k- T7 ~+ o
/ V( N  |4 l$ Y, e9 ?        threads.append(thread)
. L' R3 C) Y4 p! A9 C    for thread in threads :
+ b- w1 i6 t& x* \4 h  m; X% K2 H5 W        thread.join()
$ Q5 R: f, ]' P. |    SHARE_Q.join()
9 E5 @' c! q5 w! w# w; h6 S    i = 0, ]0 L" p% V. s/ p$ g( C
    with open("down.txt", "w+") as my_file :3 z* B1 Q! O! ]  |
        for page in _DATA :5 a# a2 `- s' r5 U" x! Z0 @$ f3 a
                i += 16 v; D% W7 H  B
                for name in page:1 Q; b  d0 c! }8 m
                        my_file.write(name + "\n")
2 N! C5 h3 l% l" t$ ]' r! B* c& A; i2 @# G
    print "Spider Successful!!!"/ d; y" k" h# E
    end = time.clock()% J0 ^' u& `, f
    print u'抓取完成!'" W0 S6 S* o, v0 Z: n: r6 J
    print u'总页数:',i4 `; l) E9 n; @3 P
    print u'总条数:',_Num
3 g! S0 Y. I) a1 |+ Y+ {    print u'一共用时:',end-start,u'秒'
& d5 ^* T- Q& Q9 q7 t6 |
: O( ?- L5 R1 [1 D8 Kif __name__ == '__main__':/ d3 o( p& c# L3 b( x# ~
    main()
  L9 U( g. Y) w; X2 G8 X* g8 k: r9 p
7 G+ h: s) i1 ]# e8 ~
" @4 C# e# Z" R0 X5 n6 Z- l7 p
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-7-18 12:30 , Processed in 0.432811 second(s), 51 queries .

回顶部