爬蟲學習筆記

2018-11-13css

1.爬蟲:模擬客戶端(瀏覽器)發送網絡請求,獲取響應,按照規則提取數據的程序。html

模擬客戶端(瀏覽器)發送網絡請求:照着瀏覽器發送如出一轍的請求,獲取和瀏覽器如出一轍的數據python

2.爬蟲的數據去哪了?git

---呈現出來:展示在網頁上,或者展現在app上程序員

---進行分析:從數據中 一些規律github

3.---url = 請求的協議(http/https) + 網站的域名 + 資源的路徑 + 參數web

------瀏覽器請求url地址:ajax

---當前url對應的響應 + js + css + 圖片   ---àelements中的內容redis

------爬蟲請求url地址:數據庫

         ---當前url對應的響應

------elements的內容和爬蟲獲取到的url地址的響應不一樣,爬蟲中須要以當前url地址對應的響應爲準提取數據

-----當前url地址對應的響應在哪?①從network中找到當前url地址,點擊response②右擊「顯示網頁源碼」

4.HTTP和HTTPS

--HTTP:超文本傳輸協議

         -以明文的形式傳輸

         -效率更高,但不安全

--HTTPS:HTTP + SSL(安全套接子字層)

         -傳輸以前數據先加密,以後解密獲取內容

         -效率較低,可是安全

--HTTP協議之請求

         -1.請求行

         -2.請求頭

-User_Agent:用戶代理:對方服務器可以經過user_agent知道當前請求對方資源的是什麼瀏覽器

                   - Cookie:用來存儲用戶信息的,每次請求會被攜帶上發送給對方的瀏覽器

                            -要獲取登陸後才能訪問的頁面

                            -對方的服務器會經過Cookie來判斷咱們是一個爬蟲

         -3.請求體(get沒有,post有)

                   攜帶數據

--HTTP協議之響應

         -1.響應頭

         - Set-Cookie:對方服務器經過該字段設置cookie到本地

         -2.響應體

         -url地址對應的響應

5.get請求和post請求的區別

①get請求無請求體,post有

②get請求把數據放到URL地址中

③post請求change用於登陸註冊

④post請求攜帶的數據量比get請求大,多,經常使用於傳輸大文本

6.requests模塊的學習

1)使用前:pip  install  requests

2)發送get,post請求

         response = requests.get(url)  #發送get請求,請求url地址對應的響應

         response = requests.post(url,data={請求體的字典})  #發送post請求

         response.request.url   #發送請求的url地址(字符串)

         response.url          #response響應的url地址(字符串)

         response.request.headers  # 請求頭(字典)

         response.headers        #響應頭(字典)

3)response的方法

         -①response.text

         該方式每每會出現亂碼,出現亂碼使用response.encoding=」utf-8」

         -②response.content.decode()

         把響應的二進制字節流轉化爲str類型

4)獲取網頁源碼的方法(經過下面三種方式必定能夠獲取到)

         ①response.content.decode()

         ②response.content.decode(「gbk」)

         ③response.text

5)發送header的請求:爲了模擬瀏覽器,獲取和瀏覽器如出一轍的內容

headers = {「」:」」,」」:」」}  #」」裏面能夠在Response Headers裏找

例如:

get請求:

import requests

url = 'http://www.baidu.com'

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"}

response = requests.get(url, headers=headers)

# print(response)

# 獲取網頁的html字符串

# response.encoding = 'utf-8'

# print(response.text)

print(response.content.decode())

post請求:

import requests

url = 'https://fanyi.baidu.com/basetrans'

query_string = {'query': '人生苦短,我用python', 'from': 'zh', 'to': 'en'}

headers = {'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'}

response = requests.post(url, data=query_string, headers=headers)

print(response)

print(response.content.decode())

6)超時參數

requests.get(url,headers=headers,timeout=3) #3秒內必須返回響應,不然會報錯

7.retrying模塊的學習

pip install retrying

import requests

from retrying import retry

'''專門請求url地址的方法'''

headers = {'User-Agent'

           : 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'}

@retry(stop_max_attempt_number=3)  # 讓被裝飾的函數反覆執行三次,三次所有報錯纔會報錯,中間有一次正常,程序繼續日後走

def _parse_url(url):

    print('*'*20)

    response = requests.get(url, headers=headers, timeout=5)

    return response.content.decode()

def parse_url(url):

    try:

        html_str = _parse_url(url)

    except:

        html_str = None

    return html_str

if __name__ == '__main__':

    url = 'http://www.baidu.com'

    # print(parse_url(url))

    url1 = 'www.baidu.com'

    print(parse_url(url1))

8.處理cookie相關的請求

-直接攜帶cookie請求url地址

         1.cookie放在headers中:headers={「User-Agent」:」…..」,」Cookie」:」cookie字符串」}

         2.cookie字典傳給cookies參數:requests.get(url,cookies=cookie_dict)

-先發送post請求,獲取cookie,帶上cookie請求登陸後的頁面

  -1.session = requests.session()   #session具備的方法和requests同樣

  -2.session.post(url,data,headers)  #服務器設置在本地的cookie會保存在session中

  -3.session.get(url)   #會帶上以前保存在session中的cookie,可以請求成功

例子:import requests

# 實例化session

session = requests.session()

# 使用session發送post請求,獲取對方保存在本地的cookie

post_url = 'http://www.renren.com/PLogin.do'

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"}

post_data = {'email': '15076636657', 'password': 'hjr90355'}

session.post(post_url, headers=headers, data=post_data)

# 再使用session請求登陸後的頁面

url = 'http://www.renren.com/968777388'

response = session.get(url, headers=headers)

with open('renren1.html', 'w', encoding='utf-8') as f:

    f.write(response.content.decode())

2018-11-17

1.數據提取方法

json

數據交換格式,看起來像python類型(列表,字典)的字符串

json.loads(json字符串)    把json字符串轉化爲python類型

json.dumps(字典)         把python類型轉換成json字符串

         json.dumps(ret1, ensure_ascii=False, indent=2)

                   ensure_ascii=False  讓中文顯示成中文

                   indent=2          讓下一行在上一行基礎上空2格

2.xpath   一門從html中提取數據的語言(谷歌瀏覽器有xpath helper插件:幫助咱們從elements中定位數據)

1)選擇節點(標籤)

/html/head/meta    可以選中html下的head下全部的meta標籤

2)//                 可以從任意節點開始選擇

         //li  :當前頁面下全部的li標籤

         /html/head//link  :head下的全部的link標籤

3)@符號的做用:定位元(選擇具體某個元)

         //div[@class='feed-infinite-wrapper']/ul/li  選擇class='feed-infinite-wrapper'下的div下的ul下的li

         a/@href  選擇a的href的值

4)…. /a/text()   獲取文本

 …./a//text() 獲取a下的全部文本 //div[@class='indent']/div/table//div[@class='pl2']/a//text()

 

 

3.lxml    使代碼可使用xpath

from lxml import etree

import requests

url = 'https://movie.douban.com/chart'

headers = {'User-Agent'

           : 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'

           }

response = requests.get(url, headers=headers)

html_str = response.content.decode()

# print(html_str)

# 使用etree處理數據

html = etree.HTML(html_str)

# print(html)   # <Element html at 0x4b86f88>

# 1.獲取全部的電影的url地址

url_list = html.xpath("//div[@class='indent']//table//div[@class='pl2']/a/@href")

# print(url_list)

# 2.獲取全部圖片的地址

img_list = html.xpath("//div[@class='indent']//table//a[@class='nbg']/img/@src")

# print(img_list)

# 3.須要把每部電影組成一個字典,字典中是電影的各類數據,好比標題,url,地址圖片,評論數,評分

# 思路:1.分組 2.每一組提取數據

ret1 = html.xpath("//div[@class='indent']/div/table")

# print(ret1)   # ret1是Element對象

for table in ret1:

    item = {}

    # item['title'] = table.xpath(".//div[@class='pl2']/a//text()")

    item['title'] = table.xpath(".//div[@class='pl2']/a/text()")[0].replace('/', '').strip()

    item['href'] = table.xpath(".//div[@class='pl2']/a/@href")[0]

    item['img'] = table.xpath(".//a[@class='nbg']/img/@src")[0]

    item['comment_num'] = table.xpath(".//span[@class='pl']/text()")[0]

    item['rating_num'] = table.xpath(".//span[@class='rating_nums']/text()")[0]

    print(item)

4.基礎知識點的學習

列表推導式:幫助咱們快速生成包含一堆數據的列表

[i+10 for I in range(10)]  à  [10,11,12….19]

[「10月{}日」.format(i) for I in range(1,10)]  à  [「10月1日」,」 10月2日」…」 10月9日」]

         format:字符串格式化的一種方式

         「第{}名」.format(1) 、「第{}名」.format([1,2,3]) 、「第{}名」.format({1,2,3})

字典推導式:幫助咱們快速生成包含一堆數據的列表字典

{i+10 : i for I in range(10)}   à  {10:0,11:1….19:9}

{「a{}」.format(i) : 10 for I in range(3)}  à  {「a0」:10,」a1」:10,」a2」:10}

三元運算符

a = 10 if 4>3 else 20  # a=10

5.最後總結

1)url

知道url地址的規律和總頁碼數:構造url地址的列表

2)發送請求,獲取響應:request

3)提取數據

返回json字符串:json模塊

返回html字符串:lxml模塊配合xpath提取數據

4)保存

 

小項目:

from lxml import etree

import requests

import json

class QiubaiSpider:

    def __init__(self):

        self.url_temp = 'https://www.qiushibaike.com/8hr/page/{}/'

        self.headers = {"User-Agent":

               "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"

           }

    def get_url_list(self):  # 1.根據url地址的規律,構造url_list

        url_list = [self.url_temp.format(i) for i in range(1,14)]

        return url_list

    def parse_url(self, url):

        print("now parseing : ", url)

        response = requests.get(url, headers=self.headers)

        return response.content.decode()

    def get_content_list(self, html_str):

        html = etree.HTML(html_str)

        # 1.分組

        div_list = html.xpath("//div[@id='content-left']/div")

        # print(div_list)

        content_list = []

        for div in div_list:

            item = {}

            item['author_name'] = div.xpath(".//h2/text()")[0].strip() if len(div.xpath(".//h2/text()")) > 0 else None

            item['content'] = div.xpath(".//div[@class='content']/span/text()")

            item['content'] = [i.strip() for i in item['content']]

            item['stats_vote'] = div.xpath(".//span[@class='stats-vote']/i/text()")

            item['stats_vote'] = item['stats_vote'][0] if len(item['stats_vote']) > 0 else None

            item['stats_comments'] = div.xpath(".//span[@class='stats-comments']//i/text()")

            item['stats_comments'] = item['stats_comments'][0] if len(item['stats_comments']) > 0 else None

            item['img'] = div.xpath(".//div[@class='thumb']//img/@src")

            item['img'] = "https:" + item['img'][0] if len(item['img']) > 0 else None

            content_list.append(item)

        return content_list

    def save_content_list(self, content_list):

        with open("qiubai.txt", 'a', encoding='utf-8') as f:

            f.write(json.dumps(content_list, ensure_ascii=False, indent=2))

            f.write('/n')

        print('保存成功')

    def run(self):  # 實現主要邏輯

        # 1.根據url地址的規律,構造url_list

        url_list = self.get_url_list()

        # 2.發送請求,獲取響應

        for url in url_list:

            html_str = self.parse_url(url)

            # 3.提取數據

            content_list = self.get_content_list(html_str)

            # 4保存

            self.save_content_list(content_list)

if __name__ == '__main__':

    qiubai = QiubaiSpider()

    qiubai.run()

2018-11-16

1. 爬蟲基本操做

   爬蟲   - 定向   - 非定向

1. requests

  response = requests.get('http://www.autohome.com.cn/news/')

  response.text

  總結:

response = requests.get('URL')

response.text

response.content

response.encoding

response.apparent_encoding

  response.status_code

  response.cookies.get_dict()

requests.get('http://www.autohome.com.cn/news/',cookie={'xx':'xxx'})

2. beautisoup模塊

pip3 install beautifulsoup4

from bs4 import BeautiSoup

soup = BeautiSoup(response.text,features='html.parser')

target = soup.find(id='auto-channel-lazyload-article')

 print(target)

總結:

soup = beautifulsoup('<html>...</html>',features='html.parser')

v1 = soup.find('div')    一個

v1 = soup.find(id='i1')

v1 = soup.find('div',id='i1')

v2 = soup.find_all('div')  多個

v2 = soup.find_all(id='i1')

v2 = soup.find_all('div',id='i1')

obj = v1

obj = v2[0]   能夠循環

obj.text

obj.attrs

需求二:經過程序自動登陸github

post_dict = {

            "phone": '111111111',

            'password': 'xxx',

            'oneMonth': 1

          }

response = requests.post(

        url="http://dig.chouti.com/login",

        data = post_dict

)

 print(response.text)

 cookie_dict = response.cookies.get_dict()

    c. 模塊詳細使用(http://www.cnblogs.com/wupeiqi/articles/6283017.html博客有)

        requests

        - 方法關係

            requests.get(.....)

            requests.post(.....)

            requests.put(.....)

            requests.delete(.....)

            requests.request('POST'...)

        - 參數

            request.request

            - method:  提交方式

            - url:     提交地址

            - params:  在URL中傳遞的參數,GET

                requests.request(

                    method='GET',

                    url= 'http://www.oldboyedu.com',

                    params = {'k1':'v1','k2':'v2'}

                )

                # http://www.oldboyedu.com?k1=v1&k2=v2

            - data:    在請求體裏傳遞的數據

                requests.request(

                    method='POST',

                    url= 'http://www.oldboyedu.com',

                    params = {'k1':'v1','k2':'v2'},

                    data = {'use':'alex','pwd': '123','x':[11,2,3]}

                )

                請求頭:

                    content-type: application/url-form-encod.....

                   

                請求體:

                    use=alex&pwd=123

            - json   在請求體裏傳遞的數據

                requests.request(

                    method='POST',

                    url= 'http://www.oldboyedu.com',

                    params = {'k1':'v1','k2':'v2'},

                    json = {'use':'alex','pwd': '123'}

                )

                請求頭:

                    content-type: application/json

                   

                請求體:

                    "{'use':'alex','pwd': '123'}"

                PS: 字典中嵌套字典時使用json

            - headers   請求頭

                requests.request(

                    method='POST',

                    url= 'http://www.oldboyedu.com',

                    params = {'k1':'v1','k2':'v2'},

                    json = {'use':'alex','pwd': '123'},

                    headers={

                        'Referer': 'http://dig.chouti.com/',

                        'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64)

AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"

                    }

                )

             - cookies  Cookies

             - files    上傳文件

             - auth      基本認知(headers中加入加密的用戶名和密碼)

             - timeout  請求和響應的超市時間

             - allow_redirects  是否容許重定向

             - proxies  代理

             - verify   是否忽略證書

             - cert      證書文件

             - stream   村長下大片

             - session: 用於保存客戶端歷史訪問信息

 

 

2018-11-18

1、什麼是爬蟲?爬蟲:就是抓取網頁數據的程序。

2、爬蟲怎麼抓取網頁數據:

網頁三大特徵:

-1. 網頁都有本身惟一的URL(統一資源定位符)來進行定位

-2. 網頁都使用HTML (超文本標記語言)來描述頁面信息。

-3. 網頁都使用HTTP/HTTPS(超文本傳輸協議)協議來傳輸HTML數據。

爬蟲的設計思路:

-1. 首先肯定須要爬取的網頁URL地址。

-2. 經過HTTP/HTTP協議來獲取對應的HTML頁面。

-3. 提取HTML頁面裏有用的數據:

    a. 若是是須要的數據,就保存起來。

b. 若是是頁面裏的其餘URL,那就繼續執行第二步。

3、課程介紹

-2. 如何抓取HTML頁面:

HTTP請求的處理,urllib、urllib二、requests處理後的請求能夠模擬瀏覽器發送請求,獲取服務器響應的文件

-3. 解析服務器響應的內容

re、xpath、BeautifulSoup4(bs4)、jsonpath、pyquery等使用某種描述性同樣來給咱們須要提取的數據定義一個匹配規則,符合這個規則的數據就會被匹配。

-4. 如何採集動態HTML、驗證碼的處理

    通用的動態頁面採集:Selenium + PhantomJS(無界面):模擬真實瀏覽器加載js、ajax等非靜態頁面數據

    Tesseract:機器學習庫,機器圖像識別系統,能夠處理簡單的驗證碼,複雜的驗證碼能夠經過手動輸入/專門的打碼平臺

-5 Scrapy框架:(Scrapy,Pyspider)

    高定製性高性能(異步網絡框架twisted),因此數據下載速度很是快,

    提供了數據存儲、數據下載、提取規則等組件。

-6 分佈式策略 scrapy-reids:

    scrapy-redis,在Scrapy的基礎上添加了一套以 Redis 數據庫爲核心的組件。

        讓Scrapy框架支持分佈式的功能,主要在Redis裏作 請求指紋去重、請求分配、數據臨時存儲。

-7 爬蟲 - 反爬蟲 - 反反爬蟲 之間的鬥爭:

    其實爬蟲作到最後,最頭疼的不是複雜的頁面,也是晦澀的數據,而是網站另外一邊的反爬蟲人員。

    User-Agent、代理、驗證碼、動態數據加載、加密數據。

    數據價值,是否值的去費勁作反爬蟲。

    1. 機器成本 + 人力成本 > 數據價值,就不反了,通常作到封IP就結束了。

    2. 面子的戰爭....

    爬蟲和反爬蟲之間的鬥爭,最後必定是爬蟲獲勝!

爲何?只要是真實用戶能夠瀏覽的網頁數據,爬蟲就必定能爬下來!

4、根據使用場景:分爲 通用爬蟲  聚焦爬蟲

1.通用爬蟲:搜索引擎用的爬蟲系統。

-1目標:就是儘量把互聯網上全部的網頁下載下來,放到本地服務器裏造成備份,

        再對這些網頁作相關處理(提取關鍵字、去掉廣告),最後提供一個用戶檢索接口。

-2抓取流程:

    a) 首選選取一部分已有的URL,把這些URL放到待爬取隊列。

    b) 從隊列裏取出這些URL,而後解析DNS獲得主機IP,而後去這個IP對應的服務器裏下載HTML頁面,保存到搜索引擎的本地服務器。

        以後把這個爬過的URL放入已爬取隊列。

    c) 分析這些網頁內容,找出網頁裏其餘的URL鏈接,繼續執行第二步,直到爬取條件結束。

-3 搜索引擎如何獲取一個新網站的URL:

    1. 主動向搜索引擎提交網址:http://zhanzhang.baidu.com/linksubmit/url

    2. 在其餘網站裏設置網站的外鏈。

    3. 搜索引擎會和DNS服務商進行合做,能夠快速收錄新的網站。

    DNS:就是把域名解析成IP的一種技術。

-4 通用爬蟲並非萬物皆可爬,它也須要遵照規則:

Robots協議:協議會指明通用爬蟲能夠爬取網頁的權限。

Robots.txt 只是一個建議。並非全部爬蟲都遵照,通常只有大型的搜索引擎爬蟲纔會遵照。

    我們我的寫的爬蟲,就無論了。

 

 

-5 通用爬蟲工做流程:爬取網頁 - 存儲數據 - 內容處理 - 提供檢索/排名服務

-6 搜索引擎排名:

    1. PageRank值:根據網站的流量(點擊量/瀏覽量/人氣)統計,流量越高,網站也越值錢,排名越靠前。

    2. 競價排名:誰給錢多,誰排名就高。

-7 通用爬蟲的缺點:

    1. 只能提供和文本相關的內容(HTML、Word、PDF)等等,可是不能提供多媒體文件(音樂、圖片、視頻)和二進制文件(程序、腳本)等等。

    2. 提供的結果千篇一概,不能針對不一樣背景領域的人提供不一樣的搜索結果。

    3. 不能理解人類語義上的檢索。

爲了解決這個問題,聚焦爬蟲出現了:

聚焦爬蟲:爬蟲程序員寫的針對某種內容的爬蟲。

面向主題爬蟲,面向需求爬蟲:會針對某種特定的內容去爬取信息,並且會保證信息和需求儘量相關。

2018-11-19

1. 瀏覽器發送HTTP請求的過程:

1)當用戶在瀏覽器的地址欄中輸入一個URL並按回車鍵以後,瀏覽器會向HTTP服務器發送HTTP請求。HTTP請求主要分爲「Get」和「Post」兩種方法。

2)當咱們在瀏覽器輸入URL http://www.baidu.com 的時候,瀏覽器發送一個Request請求去獲取 http://www.baidu.com 的html文件,服務器把Response文件對象發送回給瀏覽器。

3)瀏覽器分析Response中的 HTML,發現其中引用了不少其餘文件,好比Images文件,CSS文件,JS文件。 瀏覽器會自動再次發送Request去獲取圖片,CSS文件,或者JS文件。

4)當全部的文件都下載成功後,網頁會根據HTML語法結構,完整的顯示出來了。

2. HTTP請求主要分爲Get和Post兩種方法

GET是從服務器上獲取數據,POST是向服務器傳送數據

GET請求參數顯示,都顯示在瀏覽器網址上,HTTP服務器根據該請求所包含URL中的參數來產生響應內容,即「Get」請求的參數是URL的一部分。 例如: http://www.baidu.com/s?wd=Chinese

POST請求參數在請求體當中,消息長度沒有限制並且以隱式的方式進行發送,一般用來向HTTP服務器提交量比較大的數據(好比請求中包含許多參數或者文件上傳操做等),請求的參數包含在「Content-Type」消息頭裏,指明該消息體的媒體類型和編碼,

注意:避免使用Get方式提交表單,由於有可能會致使安全問題。 好比說在登錄表單中用Get方式,用戶輸入的用戶名和密碼將在地址欄中暴露無遺。

3. 常見狀態碼:

100~199:表示服務器成功接收部分請求,要求客戶端繼續提交其他請求才能完成整個處理過程。

200~299:表示服務器成功接收請求並已完成整個處理過程。經常使用200(OK 請求成功)。

300~399:爲完成請求,客戶需進一步細化請求。例如:請求的資源已經移動一個新地址、經常使用302(所請求的頁面已經臨時轉移至新的url)、307和304(使用緩存資源)。

400~499:客戶端的請求有錯誤,經常使用404(服務器沒法找到被請求的頁面)、403(服務器拒絕訪問,權限不夠)。

500~599:服務器端出現錯誤,經常使用500(請求未完成。服務器遇到不可預知的狀況)。

4. Cookie 和 Session:

服務器和客戶端的交互僅限於請求/響應過程,結束以後便斷開,在下一次請求時,服務器會認爲新的客戶端。

爲了維護他們之間的連接,讓服務器知道這是前一個用戶發送的請求,必須在一個地方保存客戶端的信息。

Cookie:經過在 客戶端 記錄的信息肯定用戶的身份

Session:經過在 服務器端 記錄的信息肯定用戶的身份

2018-12-2

  1. Scrapy架構圖

 

Scrapy Engine(引擎): 負責Spider、ItemPipeline、Downloader、Scheduler中間的通信,信號、數據傳遞等。

Scheduler(調度器): 它負責接受引擎發送過來的Request請求,並按照必定的方式進行整理排列,入隊,當引擎須要時,交還給引擎。

Downloader(下載器):負責下載Scrapy Engine(引擎)發送的全部Requests請求,並將其獲取到的Responses交還給Scrapy Engine(引擎),由引擎交給Spider來處理,

Spider(爬蟲):它負責處理全部Responses,從中分析提取數據,獲取Item字段須要的數據,並將須要跟進的URL提交給引擎,再次進入Scheduler(調度器),

Item Pipeline(管道):它負責處理Spider中獲取到的Item,並進行進行後期處理(詳細分析、過濾、存儲等)的地方.

Downloader Middlewares(下載中間件):你能夠看成是一個能夠自定義擴展下載功能的組件。

Spider Middlewares(Spider中間件):你能夠理解爲是一個能夠自定擴展和操做引擎和Spider中間通訊的功能組件(好比進入Spider的Responses;和從Spider出去的Requests)

2. 製做 Scrapy 爬蟲 一共須要4步:

新建項目 (scrapy startproject xxx):新建一個新的爬蟲項目

明確目標 (編寫items.py):明確你想要抓取的目標

製做爬蟲 (spiders/xxspider.py):製做爬蟲開始爬取網頁

存儲內容 (pipelines.py):設計管道存儲爬取內容

3.項目中的各文件的做用(以:項目名mySpider爲例)

scrapy.cfg :項目的配置文件

 

mySpider/ :項目的Python模塊,將會從這裏引用代碼

mySpider/__init__.py:這個必須有,雖然文件裏沒有內容

mySpider/items.py :項目的目標文件(存儲數據的)

mySpider/pipelines.py :項目的管道文件

mySpider/settings.py :項目的設置文件

mySpider/spiders/ :存儲爬蟲代碼目錄

 

 

Python自帶的模塊:/usr/lib/python2.7/urllib2.py

Python的第三方模塊: /usr/local/lib/python2.7/site-packages

urllib2 默認的 User-Agent:Python-urllib/2.7

User-Agent: 是爬蟲和反爬蟲鬥爭的第一步,養成好習慣,發送請求帶User-Agent

response 是服務器響應的類文件,除了支持文件操做的方法外,還支持如下經常使用的方法:

# 返回 HTTP的響應碼,成功返回200,4服務器頁面出錯,5服務器問題

print response.getcode()

# 返回 返回實際數據的實際URL,防止重定向問題

print response.geturl()

# 返回 服務器響應的HTTP報頭

print response.info()

User-Agent 歷史:

Mosaic 世界上第一個瀏覽器:美國國家計算機應用中心

Netscape 網景:Netscape(支持框架),慢慢開始流行....(第一款支持框架的瀏覽器)

Microsoft 微軟:Internet Explorer(也支持框架)

第一次瀏覽器大戰:網景公司失敗..消失

Mozilla 基金組織:Firefox 火狐 - (Gecko內核)(第一款瀏覽器內核)

User-Agent 決定用戶的瀏覽器,爲了獲取更好的HTML頁面效果。

IE開了個好頭,你們都開就給本身披着了個 Mozilla 的外皮

Microsoft公司:IE(Trident)

Opera公司:Opera(Presto)

Mozilla基金會:Firefox(Gecko)

Linux組織:KHTML (like Gecko)

Apple公司:Webkit(like KHTML)

Google公司:Chrome(like webkit)

其餘瀏覽器都是IE/Chrome內核

urllib 的 urlencode() 接收的參數是一個字典:

wd = {"wd" : "傳智播客"}

urllib.urlencode(wd)

結果:wd=%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2

 

 

Get 和 Post請求的區別:

Get : 請求的url會附帶查詢參數,

POST:請求的url不帶參數

對於Get請求:查詢參數在QueryString裏保存

對於Post請求:查詢參數在Form表單裏保存

作爬蟲最須要關注的不是頁面信息,而是頁面信息的數據來源。

AJAX 方式加載的頁面,數據來源必定是JSON

拿到JSON,就是拿到了網頁的數據

相關文章
相關標籤/搜索