文檔(python2.7):
os庫的使用
python re正則的使用
requests庫
BeautifulSoup
scrapy
pickle序列化模塊
pickle官方文檔
datetimejavascript
檢查robots.txt 和sitemap肯定網站規格
儘量不要去爬取那些rotbots禁止的文件夾,不然有可能被服務器封ip
能夠利用網站地圖對網站進行爬取
數百個網頁的站點可使用串行下載,若是是數百萬個網頁須要用到分佈式
估算網站大小可使用google爬蟲的結果 http://google.com/advanced_search site 在域名後面加上url路徑能夠對結果進行進一步過濾
識別網站所用技術builtwith模塊css
import builtwith builtwith.parse('http://www.baidu.com')
whois協議查詢域名的註冊者,https://pypi.python.org/pypi/python-whois #python-whois
Google的域名經常會阻斷網絡爬蟲...................
1.4編寫第一個網絡爬蟲
1.爬取
爬地圖 遍歷網頁數據庫id 追蹤網頁連接
換書了html
這本書代碼使用python3寫的,對我很不友好..........
爬取數據的時候能夠嘗試使用移動設備的請求頭試試,可能網頁變得更有規則和邏輯
查看js文件裏面的信息
能夠嘗試更改爬取的數據源
網絡爬蟲能夠經過class屬性的值分出標籤來java
findAll(tag, attributes, recursive, text, limit, keywords)
find(tag, attributes, recursive, text, keywords) attributes是dict類型,多個信息用{}包裹起來example:find({"h1","h2"})
recursive遞歸參數boolean findall(text="the price") python竟然能夠這麼用,直接指定使用哪一個參數
limit find等價於findall limit=1的時候
keyword 指定屬性的標籤 alltext=bsobj.findall(id="text")
tags太長時候可使用keyword增長一個與的過濾器來簡化工做
.child 子標籤 descendant 後代
子標籤是父標籤的下一級,後臺標籤是父標籤的全部下級
next_siblings和previos_siblings函數,找到兄弟標籤的最後一個標籤 next_sibling 和previous_sibling 函數,返回單個標籤
查找父標籤parent和parents標籤python
regex正則坑爹表達式
attrs返回的是一個 字典類型
Lambda表達式 把一個標籤做爲參數,而且返回結果是布爾類型
soup.findAll(lambda tag: len(tag.attrs)==2)mysql
能夠嘗試lxml 和html.parserjquery
維基百科六度分隔理論
使用正則匹配
去重能夠節省資源,使用python的set類型,pages=set()
python的默認地櫃是1000次,
是時候使用scrapy採集工具了linux
json庫的使用,json被轉換成字典,json數組變成了列表
scrapy庫的使用
scrapy庫運行的時候調式信息太多,能夠手動在setting。py中進行設置,調整調試的等級
api調用
列表迭代比集合快,集合查找速度更快一些 python集合就是值爲none的字典,用的是hash表的結構,因此查詢速度的是O(1)
第四章有點問題googleapi沒有註冊成功,等註冊好了,在實驗一次吧ios
存儲文件的兩種方式,一種是獲取url,或者是直接下載源文件
用了別人的連接叫盜鏈hotlinking
mysql基本指令
insert into table
create table 表名,後面是初始化的列
drop
delete
python
pymysql操做數據庫小demo:web
import pymysql import socket connection = pymysql.connect(host='localhost', user='root', password='Kele1997', db='scraping', charset='utf8mb4', ) print connection ''' sql="insert into page (id,title) values (%s,%s)" connection.cursor().execute(sql,(5,"zzsafsfsf")) connection.commit() ''' cur=connection.cursor() select2333=cur.execute('show databases;') print cur.fetchall() print cur.fetchone() cur.close() connection.close()
從網上直接把文件讀成一個字符串,而後轉換成一個 StringIO 對象,使它具備文件的
屬性。
dataFile=StringIO(data)
csv類型的文件是能夠進行迭代的
csv.DictReader: 跳過csv的文件的標題
提示這個詞可能有拼寫錯誤。 文檔的標題是由樣式定義標籤 <w:pStyle w:val="Title"/> 處理的。雖然不能很是簡單地定 位標題(或其餘帶樣式的文本),可是用 BeautifulSoup 的導航功能仍是能夠幫助咱們解決 問題的: textStrings = wordObj.findAll("w:t") for textElem in textStrings: closeTag = "" try: style = textElem.parent.previousSibling.find("w:pstyle") if style is not None and style["w:val"] == "Title": print("<h1>") closeTag = "</h1>" except AttributeError: #不打印標籤 pass print(textElem.text) print(closeTag) 這段代碼很容易進行擴展,打印不一樣文本樣式的標籤,或者把它們標記成其餘形式
n-gram 天然語言分析的時候搜索n-gram
不過 Python 的字典是無序的,不能像數組同樣直接對 n-gram 序列頻率進行排序。字典內 部元素的位置不是固定的,排序以後再次使用時仍是會變化,除非你把排序過的字典裏的 值複製到其餘類型中進行排序。在 Python 的 collections 庫裏面有一個 OrderedDict 能夠 解決這個問題:
python sort 函數
openrefine 第三方工具清洗數據u
openrefine的使用跳過了
shazam音樂雷達能夠聽歌識曲
哈里森總統最長的就任演說,和最短的任職時間
使用經常使用的語料庫來清洗數據
使用馬卡洛夫模型從中摘取文本
暫時跳過,後續補上..........看不太懂
字段名稱和值,字段的值有的是通過js處理以後再傳入的
若是不肯定,能夠經過一些工具跟蹤網頁發出get和post請求的內容
inspector chrome的審查元素
提取文件和圖像:把參數的值變成一個文件對象就ok了
使用requests跟蹤cookie,先向登陸界面發送post請求,得到cookie,而後呢,使用這個cookie發送到須要登陸的這個網站的其餘頁面
固然還有request的另外一個函數session函數
'''
import requests
session=requests.Session()
params={'username':'username',"password":"password"}
s=session.post("http:url",params)
print s.cookies.get_dict()
s=session.get("http:url")
print s.text
'''
requets是一個很給力的庫,可能只遜色與selenium。。。。。。。。。。
auth模塊處理http認證 HTTPBasicAuth對象最爲auth參數傳入請求
經常使用的js庫
jquery庫 jquery.min.js jquery庫 動態建立網頁,js代碼執行以後纔會產生網頁
google analytics 避免被網絡分析系統知道採集數據,須要確保把分析工具的cookie關掉
google 地圖
var marker=new google.mps.Marker({ position:new google.maps.LatLing(-25,2323), map: map title: "some marker text" });
ajax 和動態html
提交表單以後,網站的頁面不須要從新刷新,使用了ajax技術,節省資源,避免沒必要要的刷新
selenium能夠打開一個瀏覽器,自動化的進行一系列操做,若是想要後臺進行一系列操做,可使phantomjs,
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium import webdriver driver=webdriver.PhantomJS(executable_path="C:/PentestBox/base/python/phantomjs.exe") driver.get("http://pythonscraping.com/pages/javascript/ajaxDemo.html") try: element=WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,"loadedButton"))) finally: print driver.find_element_by_id("content").text driver.close()
selenium的隱式等待,還有顯示等待
隱式等待experted_conditions定義,常用別名EC,
指望條件有不少 彈出提示框,一個元素被選中,頁面的標題被改變了,一個元素消失了,或者出現了
presence_of_element_located((By.ID,"loadedButton"))
find_element
定位器By對象
ID html id CLASS_NAME CSS_SELECTOR css的id,tag,etc
LINK_TEXT (By.LINK_TEXT,"Next")
PARTIAL_LINK_TEXT 經過部分連接文字來查找
NAME html name的屬性來查找
TAG_NAME html標籤的名稱查找
XPATH xpath表達式 beautifulsoup不支持,/div選擇div節點,文檔的根節點
//div選擇文檔的全部的div節點
服務器端的重定向可使用urllib完成,客戶端的重定向是用selenium
一個比較只能的方法來檢測客戶端重定向是否完成,從頁面加載開始就監視dom的一個元素,重複調用這個元素知道selenium拋出stableelementreferenceexception異常,說明網頁已經跳轉
tesseract text.tif textoutput|cat textoutput.txt
1.修改請求頭,http有十幾個請求頭,可是隻有七個最經常使用,
host connection accept user-agent referrer accept-encoding accept-language
用來測試請求頭的網站,然而人家如今付費了.....
https://www.whatismybrowser.com/developers/what-http-headers-is-my-browser-sending
大型網站提供了語言翻譯,只須要把accept-language :修改一下,能夠修改請求頭成爲移動設備就能夠更簡單的抓取了
處理cookie:
在一個網站持續地保持登陸狀態,須要保存一個cookie,editthiscookie chrome插件
想要出來google anaLytics的cookie,須要用到selenium和phantomjs包
from selenum import webdriver driver=webdriver.PhantomJS(executable_path="") drive.get("http://pythonscraping.com") drive.implicitly_wait(1) 隱式等待 print driver.get_cookie()
還有delete_cookie() add_cookie() delet_all_cookie()方法處理
時間太快的請求可能會被封鎖,因此使用多線程,增長時間間隔time.sleep(3)
控制採集速度23333333
Litmus 測試工具區分網絡爬蟲和使用瀏覽器的人類
表單的隱藏字段,用來阻止爬蟲自動提交表單
一種是表單頁面上的一個字段能夠用服務器生成的隨機變量來表示,方法採集隨機變量,提交
二種是蜜罐 表單中包含一個普通名稱的隱含字段,username,password,是個蜜罐圈套
避免蜜罐:css對用戶不可見的元素,和隱藏表單元素不要填寫
12.4 問題檢查表
這一章介紹的大量知識,其實和這本書同樣,都是在介紹如何創建一個更像人而不是更像
機器人的網絡爬蟲。若是你一直被網站封殺卻找不到緣由,那麼這裏有個檢查列表,能夠
幫你診斷一下問題出在哪裏。
• 首先,若是你從網絡服務器收到的頁面是空白的,缺乏信息,或其遇到他不符合你預期
的狀況(或者不是你在瀏覽器上看到的內容),有多是由於網站建立頁面的 JavaScript
執行有問題。能夠看看第 10 章內容。
• 若是你準備向網站提交表單或發出 POST 請求,記得檢查一下頁面的內容,看看你想提
交的每一個字段是否是都已經填好,並且格式也正確。用 Chrome 瀏覽器的網絡面板(快
捷鍵 F12 打開開發者控制檯,而後點擊「Network」便可看到)查看發送到網站的 POST
命令,確認你的每一個參數都是正確的。
• 若是你已經登陸網站卻不能保持登陸狀態,或者網站上出現了其餘的「登陸狀態」異常,
請檢查你的 cookie。確認在加載每一個頁面時 cookie 都被正確調用,並且你的 cookie 在
每次發起請求時都發送到了網站上。
• 若是你在客戶端遇到了 HTTP 錯誤,尤爲是 403 禁止訪問錯誤,這可能說明網站已經把
你的 IP 看成機器人了,再也不接受你的任何請求。你要麼等待你的 IP 地址從網站黑名單
裏移除,要麼就換個 IP 地址(能夠去星巴克上網,或者看看第 14 章的內容)。若是你
肯定本身並無被封殺,那麼再檢查下面的內容。
♦ 確認你的爬蟲在網站上的速度不是特別快。快速採集是一種惡習,會對網管的服務
器形成沉重的負擔,還會讓你陷入違法境地,也是 IP 被網站列入黑名單的首要緣由。
避開採集陷阱 | 163
給你的爬蟲增長延遲,讓它們在夜深人靜的時候運行。切記:匆匆忙忙寫程序或收
集數據都是拙劣項目管理的表現;應該提早作好計劃,避免臨陣慌亂。
♦ 還有一件必須作的事情:修改你的請求頭!有些網站會封殺任何聲稱本身是爬蟲的
訪問者。若是你不肯定請求頭的值怎樣纔算合適,就用你本身瀏覽器的請求頭吧。
♦ 確認你沒有點擊或訪問任何人類用戶一般不能點擊或接入的信息(更多信息請查閱
12.3.2 節)。
♦ 若是你用了一大堆複雜的手段才接入網站,考慮聯繫一下網管吧,告訴他們你的目的。
試試發郵件到 webmaster@< 域名 > 或 admin@< 域名 >,請求網管容許你使用爬蟲採
集數據。管理員也是人嘛
待續-----
delay標識,用來作時間間隔,防止封ip
import threading import time
設置一個最大線程數 threading.Thread() threading.remove(thread) thread is still alive
setDaemon()設置守護進程,必須在start()方法調用以前設置,不然會被無限掛起,子線程啓動以後,父線程也會啓動
join方法用於阻塞父線程,只有子線程運行完了,才運行父線程
能夠把python的內建隊列改爲給予mongodb的新隊列,更新一個多進程
import multiprocessing def process_link_crawler(args,** kwargs): num_cpus=multiprocesing.cpu_count() print "start ".format(num_cpus) process=[] for i in range(num_cpus): p=multiprocessing.Process(target=threaded_crawler) args=[args],kwargs=kwargs p.start() process.append(p) for p in processes: p.join()
linux 的文件系統是ext3/4 非法文件名是 \0 文件名最大255字節
osx的文件系統是hfs plus :\0 255個utf-16編碼單元
windows NTFS / ?: * "><| 255
urlparse 解析url,urlsplit componets
字符串的開頭start with 結尾end with
單純的文件緩存系統可使用zlib.compress來壓縮一下節省空間
存儲時間戳用來判斷數據是否過時須要刪除
timedelta 對象設置默認過時時間爲30天 pickle.dumps(),存入一個對象,用一個括號把一個時間戳和文件對象一塊兒存進去就能夠了,變成了序列化數據,帶有一個屬性是時間
timedelta類型本質上來講就是一個時間差的類型,兩個時間的類型可進行加減運算
nosql數據庫,這本書使用mongodb做爲緩存數據庫
mongod -dbpath ./路徑
啓動數據庫from pymongod import MongoClient client=MongoClient("localhost","27017") # pymongo鏈接數據庫
[threading]