爬蟲學習筆記

用python寫網絡爬蟲筆記

文檔(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

python網絡數據採集

第一章

這本書代碼使用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

2.3正則表達式

regex正則坑爹表達式
attrs返回的是一個 字典類型
Lambda表達式 把一個標籤做爲參數,而且返回結果是布爾類型
soup.findAll(lambda tag: len(tag.attrs)==2)mysql

2.7

能夠嘗試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@< 域名 >,請求網管容許你使用爬蟲採
集數據。管理員也是人嘛

13章,用爬蟲測試網站

第十四章圖像與文字的處理

待續-----

用python寫網絡爬蟲筆記

4.3多線程爬蟲

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做爲緩存數據庫

  • nosql
    redis鍵值對存儲,面向文檔的存儲mongodb,圖形數據庫neo4j ,列數據存儲hbase
  • mongod的啓動
    mongod -dbpath ./路徑 啓動數據庫
from pymongod import MongoClient
client=MongoClient("localhost","27017")
# pymongo鏈接數據庫

threading 多線程的控制和處理

[threading]

scrapy回調函數沒有執行

scrapy 項目在pycharm中運行

scrapy 項目的調試

相關文章
相關標籤/搜索