QQ登录

只需要一步,快速开始

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

爬虫抓取信息

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

1192

主题

4

听众

2946

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:18 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
#!/usr/bin/env python
& o* j. F( m! B& P% f# -*- coding:utf-8 -*-* J) {4 G% u2 n" I
""". l6 v" a- S( u5 O( Z5 ?" e" ~3 [
Python爬虫,抓取一卡通相关企业信息
2 K0 B4 H* h0 c$ u. t- A/ G6 T% XAnthor: yangyongzhen
, z0 I: i6 t1 z6 W4 P$ bVersion: 0.0.22 C8 a5 A9 X, {' P9 N5 B) H/ w2 p
Date: 2014-12-14
% }5 `4 c4 v2 E8 e# B9 |2 u/ zLanguage: Python2.7.5$ j$ t; q' `! W9 ?. V/ w
Editor: Sublime Text2
7 J9 m' ]4 I' n"""
8 |$ v9 J# h7 [: W6 k1 o( N3 j, P, |7 p8 G1 @( M
import urllib2, re, string$ q* A, d9 H, B% |. |
import threading, Queue, time$ X" J7 ?. F! R
import sys
+ Z: |2 d/ V# k% ?3 {8 U" Qimport os) O$ ?/ E# g( j
from bs4 import BeautifulSoup( j5 d5 \. j5 h; r# _9 e
#from pprint import pprint; N. l9 G/ ~! q- ^

, Z( E8 l2 |+ l( K5 U4 e' Y* T# `reload(sys); J3 F8 h0 y; Y( q* [' d; j) j. f
sys.setdefaultencoding('utf8')* C4 F7 W" X& r0 f/ |0 ]1 x% N
_DATA = []( N( l, N+ x4 F7 x6 u3 s
FILE_LOCK = threading.Lock()
! j+ Q- k. P# g& x8 o/ `SHARE_Q = Queue.Queue()  #构造一个不限制大小的的队列( I5 S( \+ @( [( M3 H2 T  s
_WORKER_THREAD_NUM = 3  #设置线程的个数3 V/ Y) C  _0 ~6 N
* W/ w) O  A1 d! f& D0 l
_Num = 0 #总条数
7 G1 c: A& x) U) {& Y2 wclass MyThread(threading.Thread) :
/ K5 f6 B( Q  j' N4 f# m7 B
* M* A" I; |- X' ]& Q    def __init__(self, func,num) :1 L, J8 E2 U( P$ P
        super(MyThread, self).__init__()  #调用父类的构造函数' D% R: m- A& p
        self.func = func  #传入线程函数逻辑! L5 C  `- p8 k" F1 A' K7 y) ~
        self.thread_num = num  
0 M0 y5 @7 M0 I8 x    def run(self) :
5 G8 `7 n; j8 U- y9 G        self.func()/ f  h: R8 }3 g0 H- @
        #print u'线程ID:',self.thread_num* w( @4 t8 O1 q7 ^# {  C. |

0 N( H- x' A# D' c( Jdef worker() :7 L9 f% `5 ^& Q0 j$ M$ m1 E
    global SHARE_Q
! m! q" u6 A+ s" N+ \/ s( d. ]    while not SHARE_Q.empty():; G- b& }) `$ F  k0 x* f
        url = SHARE_Q.get() #获得任务
. f& {# b; K$ G* V9 i  W        my_page = get_page(url)
( F! j' }6 b- y+ k7 u: i        find_data(my_page)  #获得当前页面的数据
) Q6 ^& }6 O7 n' x# o" t        #write_into_file(temp_data)
; L& j3 Z& w# F+ Y  U4 _        time.sleep(1)
0 `3 }# T  N: N; h1 _        SHARE_Q.task_done()0 j+ h0 ?% z1 @0 O% u# o! Z

  s( c* x( M/ S  V+ Q. p# @def get_page(url) :
" i* R! \9 O; Y6 E5 T7 j' s, n    """
* u7 e7 m1 q# c5 w- V2 b    根据所给的url爬取网页HTML
2 w8 C0 ]. F  S6 K. s" l    Args: & D4 B3 m1 `9 |0 s3 ~8 Q
        url: 表示当前要爬取页面的url5 r( \$ \( `( a5 x- ~9 C
    Returns:
- o/ a( Z1 z0 @2 C! D: V        返回抓取到整个页面的HTML(unicode编码); v: g# x! V" E) {
    Raises:7 W0 P) E1 R7 D* }9 @( Z
        URLError:url引发的异常/ ?0 h+ {) b$ z( n6 U3 ?. \* |
    """
, v/ y0 `" j+ @5 q! V* J    try :, w. L1 U5 @6 r. H2 A* n# X
            html = urllib2.urlopen(url).read()
1 m  }: q/ |; c. H            my_page = html.decode("gbk",'ignore'). f9 h" ?% V# C. q0 ]7 `8 N
            #my_page = unicode(html,'utf-8','ignore').encode('utf-8','ignore')
9 l: F  d2 c9 `" r$ T        #my_page = urllib2.urlopen(url).read().decode("utf8")7 G+ i  j' ^6 N% I5 Q6 }0 D) t* K
    except urllib2.URLError, e :+ Z. B  c$ m9 `' }7 s
        if hasattr(e, "code"):
6 \0 Y# u9 G; O            print "The server couldn't fulfill the request."7 ?% n( c. a5 D) E$ c
            print "Error code: %s" % e.code$ o, I* l0 T0 K: j' g
        elif hasattr(e, "reason"):5 U( f, y- W; T! f6 C/ j# ]$ |0 V+ M
            print "We failed to reach a server. Please check your url and read the Reason"
" h5 a* z# N  |            print "Reason: %s" % e.reason
# @& S" U& k9 u+ T: Z+ }7 w. e    return my_page
3 w, c3 |  ?' u0 A( F5 r# L
  K& y* R" T% ?, l) V" B4 ]1 @. n1 e  b" Ndef find_data(my_page) :
3 v* I1 r, x1 N5 \% E    """
  w1 ?: p1 g; x1 c. C' @0 V( n    通过返回的整个网页HTML, 正则匹配名称
& m' n9 \7 b2 O: k- h$ W3 M  e5 u* c, b& @; f- f5 ?
    Args:. Y' U  G2 u7 T$ [+ U
        my_page: 传入页面的HTML文本用于正则匹配
5 `5 ~) r- e) ~( D1 H    """" D3 v' l- C' S6 c* Z- }* ]
    global _Num
( q& A* F( E: ^& ]* X+ a7 p    temp_data = []$ N: j4 k6 {& M! T
    items = BeautifulSoup(my_page).find_all("div", style="width:96%;margin:10px;border-bottom:1px #CCC dashed;padding-bottom:10px;"). l$ r$ h+ h  A3 J
    for index, item in enumerate(items) :
  M4 `7 J# f: n. |4 r: Q. w) q            #print item
" V: c7 {4 G9 n            #print item.h1
+ ]& ]; ?5 C7 ~( f; ^6 j$ d        #print h.group()
* S! o( T% x) j: i3 j            #temp_data.append(item)) t* J# x( O7 l* p
            #print item.find(re.compile("^a"))
" U- z4 h$ {8 `            href = item.find(re.compile("^a"))/ P1 M5 G/ Q, C0 K0 N
            #soup = BeautifulSoup(item)
/ F& Z/ y7 M1 a8 t" F1 K            #公司名称
* H4 L& I4 V- ]; Z4 h9 [9 E            if item.a:6 c/ T! Q* d* v$ p' R
                    data = item.a.string.encode("gbk","ignore"): U2 G5 c3 n1 H) s
                    print data
  q; s' X0 I( q% F9 v                    temp_data.append(data)2 }+ Q/ O% q% S. n7 k

- R0 z3 T1 m: l, C+ M1 m/ Y( \$ I2 J            goods = item.find_all("div", style="font-size:12px;")
# K' t( d# h: w- [( }( \; m1 G            ! W. o& s" M+ H0 _7 _0 I0 B
            #经营产品与联系方式
; e3 S7 D3 ~$ b& E0 X4 R2 y            for i in goods:
- b" M$ r" J+ @! k- D                    data = i.get_text().encode("gbk","ignore")
- m6 ^5 O* m; K+ o. X% [                    temp_data.append(data): h3 R) M0 |9 S
                    print data
/ d0 r# X! l* D) U& l6 `            #b = item.find_all("b")
# L8 z% \" a# b0 T            #print b4 B& \" }0 S5 E3 W$ o
            #链接地址
& I' |, i+ s& l0 G; ?5 W            pat = re.compile(r'href="([^"]*)"')
# j! o+ Y5 l4 q8 {, u            h = pat.search(str(item))* R) d( M7 @0 _5 X
            if h:: ^5 t8 W9 Z8 h! i8 l# X9 L
                    #print h.group(0)1 I% j( u0 w* s/ K7 |
                    href = h.group(1); k4 ?. L2 }: j! x6 i
                    print href. s' b5 `; W# ]) E: u
                    temp_data.append(h.group(1))
+ H* Q3 D! s7 S& J$ T
5 ]1 G' D6 b/ @5 ~8 z) H' A  a            _Num += 1
6 C4 N( Y8 z5 l4 H$ s) K# F            #b = item.find_all(text=re.compile("Dormouse"))
* o# v7 G2 m4 n- e4 d            #pprint(goods)& m! v# b# `8 Y* ^
            #print href
' W' y; D- \7 K            #pat = re.compile(r'title="([^"]*)"')' N8 Y, Z4 l* z( D  f' y* Y$ J
            #h = pat.search(str(href))
# w8 u5 K4 \( k5 z! _! z            #if h:' Q4 m% ]  m0 i
                    #print h.group(1)
  B4 G  h/ K/ h8 ^; I6 ^1 W                    #temp_data.append(h.group(1))
0 ^4 V5 F" ~- q9 Q) `    _DATA.append(temp_data)! c: V2 d% S1 h0 \& Z

$ `/ y) D% l1 \6 E. v! C#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"}##浏览器请求头(大部分网站没有这个请求头会报错、请务必加上哦)( X1 H, f. n. e  `4 E: k* g7 G5 Z
#all_url = 'http://www.mzitu.com/all'  ##开始的URL地址
. ^% m1 N3 h5 R5 N5 M* \# o- b#start_html = requests.get(all_url,  headers=headers)  ##使用requests中的get方法来获取all_url(就是:http://www.mzitu.com/all这个地址)的内容 headers为上面设置的请求头、请务必参考requests官方文档解释
8 {  {8 g0 M  e6 s7 W#print(start_html.text) ##打印出start_html (请注意,concent是二进制的数据,一般用于下载图片、视频、音频、等多媒体内容是才使用concent, 对于打印网页内容请使用text)  P3 ^9 _2 w1 P5 O: k1 s
5 o) ]7 c8 L9 |& {
def main() :  C1 L  a, ?: ]  N6 l# P8 z7 U/ N
    global SHARE_Q
% R- a( q! E' e7 w. J+ n! v    threads = []: g4 t4 q1 Y$ d8 y# {
    start = time.clock(): C9 M# L0 f4 g+ `% r# ?
    douban_url = "http://company.yktworld.com/comapny_search.asp?page={page}"( M) y4 @% l( [+ |4 Y- Z  j% t
    #向队列中放入任务, 真正使用时, 应该设置为可持续的放入任务
0 C5 ]6 O. p% |# Q' D- x" {! F* R    for index in xrange(20) :   
( b  T" a/ h4 j2 o4 ]: ?        SHARE_Q.put(douban_url.format(page = index * 1))6 q+ h7 h; L( T
    for i in xrange(_WORKER_THREAD_NUM) :
0 }9 b# \- `$ [. ^- C        thread = MyThread(worker,i)
% q2 {! W0 [3 {+ {1 l% z- ]& p        thread.start()  #线程开始处理任务% D" e6 d) N8 K, M
0 U1 k9 z0 @7 r3 Y8 ~8 v9 a8 ]' k
        threads.append(thread)4 z. ]; D% ?! @
    for thread in threads :
( r- D9 P% ~" V2 S( ?/ H3 O( h# ?        thread.join()
% {1 Z/ Q- Q! c# Y9 M% {5 V    SHARE_Q.join()# W) r3 R/ G6 s3 e2 E8 t! i
    i = 0
6 O6 L8 d& L; s/ g    with open("down.txt", "w+") as my_file :( L+ ^# o8 M8 x+ d% W* s2 u
        for page in _DATA :
! K( S' [% {: ]3 E) G2 B0 V3 z                i += 1
/ J- G# ~# A% y0 ]  R" H8 |" ^                for name in page:6 I* m9 j9 T% Y, s3 q% l
                        my_file.write(name + "\n")
7 O5 g" r5 k+ j6 L) r9 ?
  A+ M- V  u: r0 d: J, K; i" R    print "Spider Successful!!!"
0 I6 i" N5 ?8 P7 k5 ]" N    end = time.clock()
% E* H* \( o8 T7 s    print u'抓取完成!'
. @. Z% a# m( I    print u'总页数:',i
6 c$ _( V& o. c) p    print u'总条数:',_Num
* i- e* i! b, ]2 q6 x, ^+ ~. }    print u'一共用时:',end-start,u'秒'% M8 t7 x# B# j# b0 {! u, l

& q* r( d1 I0 Z1 o. T0 oif __name__ == '__main__':
# u) Y  z8 c% I+ R  J    main()
2 t; M9 n& ?6 o2 a7 E- m) T! O" y3 d! ^6 N# k

! R+ ?8 ?7 Y8 f5 ^
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-9-2 21:27 , Processed in 0.339992 second(s), 50 queries .

回顶部