1024的爬蟲(1)
但是時間都浪費下去了還是要記錄一下收穫的:
1.簡單爬蟲的工作原理
2.在自學完彙編之後對二進位的恐懼消失(二進位讀取然後檢查文件頭,__flag的設計)
3.掌握了一些正則表達式
<1>爬蟲的工作原理
假裝成一個瀏覽器去訪問網站->HTML文件get->用正則表達式找到想要的->(訪問or下載)
(1)首先是怎麼偽裝成一個瀏覽器去訪問
我們先用chrome的F12看一下訪問的時候的network行為
明顯可以猜出來,host是從User-Agent看出你是用什麼電腦什麼瀏覽器訪問的,所以我們直接把User-Agent複製下來就好
我們寫個函數偽造一下
def testUrlOpen(target_url):n user_agent = Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36n target_headers = {User-Agent: user_agent}n req = urllib2.Request(target_url, headers=target_headers)n try:n response = urllib2.urlopen(req)n return responsen except urllib2.URLError, e:n if hasattr(e, code):n print The server refuse the request.n print Error code: , e.coden elif hasattr(e, reason):n print Fail to reach the servern print Reason, e.reasonn return ERRORn
(2)怎麼get到HTML文件
看上面的代碼,我們把一個url打開後urlopen返回了一個response
Content-Type告訴我們這是一個text/html,所以這個url的response就是我們要的html了然後就可以用read()得到到這個網站的HTML
text_data = testUrlOpen().read()n
(3)怎麼用正則表達式找到你想要的
先觀察你想要的東西在HTML里是怎麼樣的
chrome提供了右鍵檢查元素的功能(Ctrl+Alt+I)
在我們例子里
我們看到在論壇里的每一個超鏈接(車)都如上圖的樣式多觀察幾個我們可以發現規律:全為htm_data/15/1611/xxxxxxx.html格式,我猜15是論罈子版的編號,1611是年份和月份,後面的七位數字是某個編號,在本文中不妨稱為Cl_code。
我多打開了幾個試了一下,應該就是這樣的,發布越遲,後面的七位數字會越大
所以不妨得到最新的Cl_code然後減去1000然後一個一個窮舉來得到最近的所有html
然後我們用正則表達式找到html中的這句話
def getTodayNew():n main_site = http://www.t66y.com/thread0806.php?fid=15n main_site_html = PCurlopen(main_site).read()n # Here the regex pattern can only find all the "15/1611/" if you want change, change itn sub_site = re.findall(htm_data/15/1611/d{7}.html, main_site_html)n print sub_siten code = sub_site[0][-12:-5]n return int(code)n
然後我們就可以得到那個最新的Cl_code了
這個過程其實就是做爬蟲很有意思的一部分,和代碼沒有什麼關係,發現和尋找規律的活,主要靠觀察力。當然,稍微用到了一點正則
(4)訪問&下載
上一步我們可以得到很多的信息,比如這個html里所有的超鏈接,所有的標題啊,文字內容啊,圖片啊(明顯我們比較關注圖片23333)
如果是子網站的訪問的
比如我們現在用regex找到了所有的圖片超鏈接並且放到了一個list里
然後我們照例用我們的testUrlOpen()去把這些超鏈接打開然後我們還是用read()把他們存下來,需要注意的一點是,當存到本地文件的時候我們不能用mode=w而是要用mode=wb(b means binary)
這是一個windows的設計問題
On Windows, b appended to the mode opens the file in binary mode, so there are also modes like rb, wb, and r+b. Python on Windows makes a distinction between text and binary files; the end-of-line characters in text files are automatically altered slightly when data is read or written. This behind-the-scenes modification to file data is fine for ASCII text files, but it』ll corrupt binary data like that in JPEG or EXE files.
推薦閱讀: