標籤:

1024的爬蟲(1)

python寫起來還是不很舒服...往往開始寫一個東西的時候很有熱情然後寫個一兩百行就不想再看了...

但是時間都浪費下去了還是要記錄一下收穫的:

1.簡單爬蟲的工作原理

2.在自學完彙編之後對二進位的恐懼消失(二進位讀取然後檢查文件頭,__flag的設計)

3.掌握了一些正則表達式

<1>爬蟲的工作原理

假裝成一個瀏覽器去訪問網站->HTML文件get->用正則表達式找到想要的->(訪問or下載)

(1)首先是怎麼偽裝成一個瀏覽器去訪問

我們先用chrome的F12看一下訪問的時候的network行為

可以看到這個http的header是這樣的

明顯可以猜出來,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.

推薦閱讀:

TAG:Python | 爬虫 |