多執行緒爬取小公尺應用商店

2021-10-06 11:47:35 字數 4225 閱讀 9672

目標

2、目標 :所有應用分類

應用名稱

應用鏈結

實現步驟

1、頁面區域性重新整理

2、右鍵檢視網頁源**,搜尋關鍵字未搜到

# 此**為動態載入**,需要抓取網路資料報分析

1、抓取返回json資料的url位址(headers中的request url)

302、檢視並分析查詢引數(headers中的query string parameters)

page:

1 categoryid:

2 pagesize:

30# 只有page在變,0 1 2 3 ... ... ,這樣我們就可以通過控制page的值拼接多個返回json資料的url位址

# 注意多執行緒寫入的執行緒鎖問題

from threading import lock

lock = lock(

)# 加鎖

lock.acquire(

)python語句

# 釋放鎖

lock.release(

)

1、在 __init__(self) 中建立檔案物件,多執行緒操作此物件進行檔案寫入

self.f =

open

('xiaomi.csv'

,'a'

,newline='')

self.writer = csv.writer(self.f)

self.lock = lock(

)2、每個執行緒抓取1頁資料後將資料進行檔案寫入,寫入檔案時需要加鎖

defparse_html

(self):[

]for *** in ***:

[name,link,typ]

) self.lock.acquire(

) self.lock.release(

)3、所有資料抓取完成關閉檔案

defmain

(self)

: self.f.close(

)

import requests

from threading import thread

from queue import queue

import time

from useragents import ua_list

from lxml import etree

import csv

from threading import lock

import random

class

xiaomispider

(object):

def__init__

(self)

: self.url =

# 存放所有url位址的佇列

self.q = queue(

) self.i =

0# 存放所有型別id的空列表

self.id_list =

# 開啟檔案

self.f =

open

('xiaomi.csv'

,'a'

) self.writer = csv.writer(self.f)

# 建立鎖

self.lock = lock(

)def

get_cateid

(self)

:# 請求

url =

headers =

html = requests.get(url=url,headers=headers)

.text

# 解析

parse_html = etree.html(html)

xpath_bds =

'//ul[@class="category-list"]/li'

li_list = parse_html.xpath(xpath_bds)

for li in li_list:

typ_name = li.xpath(

'./a/text()')[

0]typ_id = li.xpath(

'./a/@href')[

0].split(

'/')[-

1]# 計算每個型別的頁數

pages = self.get_pages(typ_id)

(typ_id,pages)

)# 入佇列

self.url_in(

)# 獲取counts的值並計算頁數

defget_pages

(self,typ_id)

:# 每頁返回的json資料中,都有count這個key

url = self.url.

format(0

,typ_id)

html = requests.get(

url=url,

headers=

).json(

) count = html[

'count'

] pages =

int(count)

//30+1

return pages

# url入佇列

defurl_in

(self)

:for

idin self.id_list:

# id為元組,('2',pages)

for page in

range(1

,id[1

]+1)

: url = self.url.

format

(page,id[

0])# 把url位址入佇列

self.q.put(url)

# 執行緒事件函式: get() - 請求 - 解析 - 處理資料

defget_data

(self)

:while

true:if

not self.q.empty():

url = self.q.get(

) headers =

html = requests.get(url=url,headers=headers)

.json(

) self.parse_html(html)

else

:break

# 解析函式

defparse_html

(self,html)

:# 存放1頁的資料 - 寫入到csv檔案

'data']:

# 應用名稱 + 鏈結 + 分類

'displayname'

] link =

'packagename'

]'level1categoryname'

][name,typ_name,link]

)print

(name,typ_name)

self.i +=

1 self.lock.acquire(

) self.lock.release(

)# 主函式

defmain

(self)

:# url入佇列

self.get_cateid(

) t_list =

# 建立多個執行緒

for i in

range(1

):t = thread(target=self.get_data)

t.start(

)# **執行緒

for t in t_list:

t.join(

)# 關閉檔案

self.f.close(

)print

('數量:'

,self.i)

if __name__ ==

'__main__'

: start = time.time(

) spider = xiaomispider(

) spider.main(

) end = time.time(

)print(%

(end-start)

)

爬取小公尺應用商城

coding utf8 importrequests importre importmath j 1 檢視每一頁都多少個 用於決定我們要翻多少頁 獲取網頁的源 html.text,re.s 開啟網頁原始碼發現每個 名稱前面有,所有統計這個標示的個數就可以知道每一頁有多少個 啦的長度就代表了每一頁 的...

使用多執行緒爬取資料

應用名稱 應用鏈結 import requests import time from multiprocessing import queue from threading import thread import json import urllib.parse class xiaomispide...

回顧多執行緒爬取資料

明確目的 將多執行緒爬蟲涉及到的技術點回顧一下 首先,是基本流程,多執行緒爬蟲架構圖如下 用來存url,和 網頁的響應內容,給執行緒提供資料執行緒資料 class queue object enqueue item 往佇列中新增乙個item元素 dequeue 從佇列頭部刪除乙個元素 is empt...