之前我從來沒有爬過網頁,一直對scrapy很好奇,這周一粽子讓我去爬一下
的工單管理-》已提交結果工單-》舉報內容摘要/來電時間,一共有100多條,看起來需要一條一條點開才行。
我之前對網頁有了一點小小的積累,大致明白了cookie,post,get,html這方面的知識,因此覺得應該是能夠勝任的,因此就愉快得答應了下來。
不過我一開始走了不少彎路,最後抓出網頁資訊的時候,也是瞎貓碰到死耗子,並不能說以後就能成功了,而且或許這個換台電腦,關閉一下瀏覽器未必能夠成功。
我的學習路線大致是這樣的:
然後我就發現原始碼裡面並沒有完整的資訊嘛,只是乙個html的骨架
而element裡面的資訊到時全面的,因此我一開始想著是不是應該把網頁整體拉下了,然後去解析html,把資料提取出來,而後的實踐我發現至少我這次用半天時間沒有做出來。
幾個教程:
我先學這個)
扒的**:
xpath語法
request的高階用法
其中最重要的是yield語法,在scrapy裡面,它會產生新的執行緒,或者儲存item,或者給出下乙個請求
要爬的**裡面並沒有url。。。後來我看到乙個詞,叫
動態網頁
,可能說的就是這個
我只能去檢視chrom裡面的network,看看是否有get和post請求了,後來我看到了2個請求:
它們中乙個是主頁的請求,乙個是詳情頁的請求
主頁請求list.do的request中帶有引數page,limit,start;response中則返回指定數量的已提交工單的編號
詳情頁請求detail.do中請求引數則正好需要上面的已提交工單的編號!
因此,只要先請求list.do,把所有已提交工單的編號都拿到,然後用這個編號請求detail.do就能獲得詳情頁的所有資訊了。
我在postman上試了一下,又填了乙個坑:該**是需要登入的,因此要用cookie訪問這些介面,但postman沒找到填cookie的地方,後來我又上網搜了一下,發現只要開啟postman的***就行了,它會自動把chrome瀏覽器的cookie填進來
於是,**就很容易寫了,這其中對關鍵字段的定位,我用了找規律的本辦法,想來這樣也沒關係,順帶處理了異常和多執行緒訪問
# -*- coding: utf-8 -*-
import threading
import requests
import json
cookies =
url_frontpage = ""
url_detail = ""
limit = "500" # 每頁展示的工單條數
count = 0 # 輸出的是第幾個工單
def get_url_list():
"""呼叫list.do介面,獲取所有已提交結果工單的id,構成乙個列表返回
:return:
"""querystring = # 一頁展示的工單數
headers =
response = requests.request("get", url_frontpage, headers=headers, params=querystring, cookies=cookies) # 訪問列表介面,獲取工單ids
ret1 = json.loads(response.text)
entityrecordids = [ele["tjjggongdanrwgdidfk"]for ele in ret1["data"]]
return entityrecordids
def get_jubaoneirongzhaiyao(entityrecordid):
"""傳入工單id,呼叫detail.do介面,獲得工單詳情
:param entityrecordid:
:return:
"""global count
querystring =
payload = ""
headers =
response = requests.request("post", url_detail, data=payload, headers=headers, params=querystring, cookies=cookies)
text = response.text
ret = json.loads(text)
# 建議下面一段**加個鎖,這樣可以防止亂序
count += 1
print(u"第"+str(count)+u"條")
try:
print(ret["recordname"]+u" 舉報內容摘要 "+ret['sectionlist'][1]["items"][2]["items"][0]["value"]) # 獲取任務編號和舉報內容摘要
except:
print ret.get("recordname", u"未知錯誤 "+ "id: "+entityrecordid)+u" 舉報內容摘要"+u" 空 "
#def multi_thread_url():
"""多執行緒獲取數百個詳情頁的資訊
:return:
"""entityrecordids = get_url_list()
print(u"總共有" + str(len(entityrecordids)) + u"條")
for entityrecordid in entityrecordids:
t =threading.thread(target=get_jubaoneirongzhaiyao, args=(entityrecordid,))
t.start()
multi_thread_url()
最後的輸出如下圖所示:
首先沒有進一步了解scrapy,跳過了其中的難點,對於動態網頁,應該有其他方式來抓取
其次可以做乙個自動登入的動作,把cookie取到,就不用手動改cookie了
最後,要能夠在windows下執行
我的第一次面試經歷
已經發在csdn過了,發來讓大家參考下 介紹下基本情況 91年生的,沒有it工作經驗,高中未畢業,c c 自學的 22號去廈門面試,8點左右出發,到廈門後對廈門不熟,自己乙個人傻傻走了1個多小時,腳疼死了。到公司的時候11點左右,公司是做手機開發的,其實他說是下午三點的,不過我原本估計要找很久,本來...
第一次筆試經歷
今天去參加了人生中第一次應聘的筆試,感受很深,也引起了我不少的反思。本人大三黨一枚,電腦科學與技術專業,說實話大學的前一年半真的是在玩遊戲中虛度了,大二的下學期才迷途知返。戒掉了遊戲,然後摸索了兩個月,最後又回到了遊戲這個方向,只不過從當年的玩遊戲,變成了寫遊戲,自己寫過幾個windows平台下小的...
第一次應聘經歷
應聘了了乙個c 伺服器開發崗,對於應屆生來說還是較難,然後,作為乙個不知名院校,還是被歧視了,心裡很難受。終歸還是自己硬實力不夠,很多基礎的概念雖然是理解的,其實最終的本質還是沒有真正去理解。老師講的也是表面上的,讓你入個門,知道有這個東西罷了,真正要理解實質,自己下來要花很多很多時間才行。眼看著秋...