小輝-top採集.txt

weixin_33866037發表於2018-09-13

# -*- coding:utf-8 -*-

import requests,threading,random,string

from lxmlimport etree

from queueimport Queue

from timeimport sleep

from threadingimport Thread

# 儲存檔案的函式

def savefile(savepath,content):

    fp= open(savepath,'a+',encoding='utf8',newline="",errors='ignore')

fp.write(content+"\n")

fp.close()

#生成隨機3-6位字首

def GetPassword():

  #  digits生成所有數字  ascii_letters生成所有字母

  slcNum=[random.choice(string.digits+string.ascii_lowercase)for iin range(random.randint(3,6))]

random.shuffle(slcNum)# 將序列的所有元素隨機排序

  getPwd=''.join([ifor iin slcNum])

return getPwd

lock= threading.RLock()# 多個執行緒訪問共享資料

def getHTMLText(urlqueue):

    global lock

while urlqueue.qsize()> 0:

        if lock.acquire():          # 給可能出現資料訪問衝突的程式碼塊上鎖

            urls_line= urlqueue.get()# 獲取要爬取的url地址

            for iin range(1,101):

                print(" <%s> 域名第 <%s> 次採集 " % (urls_line, i))

url_line= GetPassword()

url= "http://" + url_line+ '.' + urls_line+ "/"

              # print(url)

                while True:

                    try:

                        headers= {

'User-Agent': 'Mozilla/5.0 (compatible; Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html)'

                        }

r= requests.get(url=url,headers=headers,verify=True,timeout=5)# 證書驗證設為FALSE

                        r.raise_for_status()#不是200,丟擲異常requests.HTTPError

                        r.encoding= r.apparent_encoding

print("採集網頁的狀態碼:%s" %r.status_code)

print("採集網頁的URL:%s" %r.url)

html_title= "".join(etree.HTML(r.text).xpath('//title/text()'))

print("採集網頁的標題:%s" %html_title)

title_path= './save_title.txt'

                        savefile(title_path, html_title)

print("爬取完成:對%s目標地址採集完成" % url)

print("*"*70)

if r.status_code== 200:

                            break

                    except Exception as ex:

                        print(Exception,":", ex)

sleep(1)

if __name__== '__main__':

    url_queue= Queue()

seen_queue= set()

filepath= "./小輝-top採集.txt"

    txtfile= [line.strip()for linein open(filepath,encoding="GB2312").readlines()]

for linein txtfile:

        if line:

            line= line.strip()

url_queue.put(line)

seen_queue.add(line)# set集合新增內容

    #print(url_queue.qsize())

    threads= []# 宣告一個變數,儲存多個執行緒

    #threads_num = 50      # 宣告一個變數,控制啟動多少個執行緒

    threads_num= int(input("請輸入執行緒數:"))

for ctin range(0,threads_num):    # 建立執行緒物件,並啟動執行緒

        current_thread= threading.Thread(target=getHTMLText,args=(url_queue,))# 建立執行緒物件

        current_thread.setDaemon(True)# 設定守護程式

        threads.append(current_thread)# 將執行緒儲存在列表中

        current_thread.start()

for tin threads:        # 讓所有的執行緒join,就是讓主執行緒等待所有子執行緒執行結束再推出

        t.join()

print("程式執行結束....")

相關文章