久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

爬虫教程( 1 ) --- 初级、基础、实践

發布時間:2023/12/9 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 爬虫教程( 1 ) --- 初级、基础、实践 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

爬蟲教程:https://piaosanlang.gitbooks.io/spiders/content/

如何入門 Python 爬蟲https://zhuanlan.zhihu.com/p/21479334

靜覓 崔慶才的個人博客 Python 爬蟲系列:http://cuiqingcai.com/category/technique/python

http://www.cnblogs.com/miqi1992/category/1105419.html

Python 爬蟲從入門到放棄系列博客:https://www.cnblogs.com/zhaof/tag/爬蟲/default.html?page=2

Python 爬取功能匯總:https://www.jb51.net/Special/985.htm

Python 3.8.5 文檔

官方文檔:https://docs.python.org/zh-cn/3/

1. 爬蟲入門 初級篇

IDE 選擇: PyCharm (推薦) 、SublimeText3、Visual Studio

Python 版本:Python3。( 最簡單的是直接安裝 Anaconda,使用 Anaconda 管理虛擬環境?)

  • Windows 平臺:https://docs.python.org/zh-cn/3/using/windows.html
  • Linux Ubuntu 平臺:https://docs.python.org/zh-cn/3/using/unix.html

1.1 為什么要學習爬蟲

學習需求:抓取的某個網站或者某個應用的內容,提取有用的價值

實現手段:模擬用戶在瀏覽器或者應用(app)上的操作,實現自動化的程序爬蟲應用場景(利用爬蟲能做什么?)

大家最熟悉的應用場景:搶票神器(360搶票器)、投票神器(微信朋友圈投票)

企業應用場景

  • 拉勾網招聘職位數據分析報告
  • 2016年中國外賣O2O行業發展報告
  • 2016年中國在線出境游市場研究報告

1、各種熱門公司招聘中的職位數及月薪分布

2、對某個 App 的下載量跟蹤

3、 飲食地圖

4、 票房預測

1.2 爬蟲是什么 ?

專業術語: 網絡爬蟲(又被稱為網頁蜘蛛,網絡機器人)是一種按照一定的規則,自動的抓取萬維網信息的程序或者腳本。

爬蟲起源(產生背景):隨著網絡的迅速發展,萬維網成為大量信息的載體,如何有效地提取并利用這些信息成為一個巨大的挑戰;搜索引擎有Yahoo,Google,百度等,作為一個輔助人們檢索信息的工具成為用戶訪問萬維網的入口和指南。網絡爬蟲是搜索引擎系統中十分重要的組成部分,它負責從互聯網中搜集網頁,采集信息,這些網頁信息用于建立索引從而為搜索 引擎提供支持,它決定著整個引擎系統的內容是否豐富,信息是否即時,因此其性能的優劣直接影響著搜索引擎的效果。

網絡爬蟲程序的優劣,很大程度上反映了一個搜索引擎的好差。不信,你可以隨便拿一個網站去查詢一下各家搜索對它的網頁收錄情況,爬蟲強大程度跟搜索引擎好壞基本成正比。

搜索引擎工作原理

  • 第一步:抓取網頁(爬蟲)。搜索引擎是通過一種特定規律的軟件跟蹤網頁的鏈接,從一個鏈接爬到另外一個鏈接,像蜘蛛在蜘蛛網上爬行一樣,所以被稱為“蜘蛛”也被稱為“機器人”。搜索引擎蜘蛛的爬行是被輸入了一定的規則的,它需要遵從一些命令或文件的內容。 ? ? ? Robots協議(也稱為爬蟲協議、機器人協議等)的全稱是“網絡爬蟲排除標準”(Robots Exclusion Protocol),網站通過Robots協議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取。
    robots.txt?示例:??https://www.taobao.com/robots.txt? ? ? ??http://www.qq.com/robots.txt
    示例:CSDN robot.txt ( https://blog.csdn.net/robots.txt ) 文件中 Sitemap: # -*- coding: UTF-8 -*-import re import requestsdef download(url, retry_count=3):html = Nonefor retry in range(retry_count):print(f'Downloading : {url}')custom_headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ''(KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36'}try:r = requests.get(url, headers=custom_headers, verify=False)if r.status_code == 200:print('status_code : {0}'.format(r.status_code))html = r.text # html = r.contentelse:print('status_code : {0}'.format(r.status_code))breakexcept BaseException as ex:print(f'Download error : {ex}')return htmlif __name__ == "__main__":temp_url = r'https://blog.csdn.net/s/sitemap/pcsitemapindex.xml'sitemap = download(temp_url)links = re.findall(r'<loc>(.*?)</loc>', sitemap)for link in links:print(link)pass
  • 第二步:數據存儲。搜索引擎是通過蜘蛛跟蹤鏈接爬行到網頁,并將爬行的數據存入原始頁面數據庫。其中的頁面數據與用戶瀏覽器得到的 HTML 是完全一樣的。搜索引擎蜘蛛在抓取頁面時,也做一定的重復內容檢測,一旦遇到權重很低的網站上有大量抄襲、采集或者復制的內容,很可能就不再爬行。
  • 第三步:預處理。搜索引擎將蜘蛛抓取回來的頁面,進行各種步驟的預處理。? ?⒈提取文字,?⒉中文分詞, ⒊去停止詞, ⒋消除噪音(搜索引擎需要識別并消除這些噪聲,比如版權聲明文字、導航條、廣告等……), 5 正向索引,? 6 倒排索引, 7 鏈接關系計算, 8 特殊文件處理等。?除了HTML文件外,搜索引擎通常還能抓取和索引以文字為基礎的多種文件類型,如 PDF、Word、WPS、XLS、PPT、TXT 文件等。我們在搜索結果中也經常會看到這些文件類型。但搜索引擎還不能處理圖片、視頻、Flash 這類非文字內容,也不能執行腳本和程序。
  • 第四步:排名,提供檢索服務

但是,這些通用性搜索引擎也存在著一定的局限性,如:

  • (1) 不同領域、不同背景的用戶往往具有不同的檢索目的和需求,通用搜索引擎所返回的結果包含大量用戶不關心的網頁。
  • (2) 通用搜索引目標是盡可能的網絡覆蓋率,有限的搜索引擎服務器資源與無限的網絡數據資源之間的矛盾將進一步加深。
  • (3) 萬維網數據形式的豐富和網絡技術的不斷發展,圖片、數據庫、音頻、視頻多媒體等不同數據大量出現,通用搜索引擎往往對這些信息含量密集且具有一定結構的數據無能為力,不能很好地發現和獲取。
  • (4) 通用搜索引擎大多提供基于關鍵字的檢索,難以支持根據語義信息提出的查詢。

為了解決上述問題,定向抓取相關網頁資源的聚焦爬蟲應運而生。 聚焦爬蟲是一個自動下載網頁的程序,它根據既定的抓取目標,有選擇的訪問萬維網上的網頁與相關的鏈接,獲取所需要的信息。

與通用爬蟲(general purpose web crawler)不同,聚焦爬蟲并不追求大的覆蓋,而將目標定為抓取與某一特定主題內容相關的網頁,為面向主題的用戶查詢準備數據資源。

聚焦爬蟲工作原理以及關鍵技術概述:

網絡爬蟲是一個自動提取網頁的程序,它為搜索引擎從萬維網上下載網頁,是搜索引擎的重要組成。傳統爬蟲從一個或若干初始網頁的URL開始,獲得初始網頁上的URL,在抓取網頁的過程中,不斷從當前頁面上抽取新的URL放入隊列,直到滿足系統的一定停止條件。聚焦爬蟲的工作流程較為復雜,需要根據一定的網頁分析算法過濾與主題無關的鏈接,保留有用的鏈接并將其放入等待抓取的URL隊列。然后,它將根據一定的搜索策略從隊列中選擇下一步要抓取的網頁URL,并重復上述過程,直到達到系統的某一條件時停止。另外,所有被爬蟲抓取的網頁將會被系統存貯,進行一定的分析、過濾,并建立索引,以便之后的查詢和檢索;對于聚焦爬蟲來說,這一過程所得到的分析結果還可能對以后的抓取過程給出反饋和指導。

相對于通用網絡爬蟲,聚焦爬蟲還需要解決三個主要問題:

  • (1) 對抓取目標的描述或定義;
  • (2) 對網頁或數據的分析與過濾;
  • (3) 對URL的搜索策略。

抓取目標的描述和定義是決定網頁分析算法與URL搜索策略如何制訂的基礎。而網頁分析算法和候選URL排序算法是決定搜索引擎所提供的服務形式和爬蟲網頁抓取行為的關鍵所在。這兩個部分的算法又是緊密相關的。

網絡爬蟲的發展趨勢

隨著 AJAX/Web2.0 的流行,如何抓取 AJAX 等動態頁面成了搜索引擎急需解決的問題,如果搜索引擎依舊采用“爬”的機制,是無法抓取到 AJAX 頁面的有效數據的。 對于 AJAX 這樣的技術,所需要的爬蟲引擎必須是基于驅動的。而如果想要實現事件驅動,首先需要解決以下問題:

  • 第一:JavaScript 的交互分析和解釋;
  • 第二:DOM 事件的處理和解釋分發;
  • 第三:動態 DOM 內容語義的抽取。

爬蟲發展的幾個階段(博士論文copy)

  • 第一個階段:可以說是 早期爬蟲,斯坦福的幾位同學完成的抓取,當時的互聯網基本都是完全開放的,人類流量是主流;
  • 第二個階段:是?分布式爬蟲,但是爬蟲面對新的問題是數據量越來越大,傳統爬蟲已經解決不了把數據都抓全的問題,需要更多的爬蟲,于是調度問題就出現了;
  • 第三階段:是?Deep Web?爬蟲。此時面對新的問題是數據之間的link越來越少,比如淘寶,點評這類數據,彼此link很少,那么抓全這些數據就很難;還有一些數據是需要提交查詢詞才能獲取,比如機票查詢,那么需要尋找一些手段“發現”更多,更完整的不是明面上的數據。
  • 第四階段:智能爬蟲,這主要是爬蟲又開始面對新的問題:社交網絡數據的抓取。

社交網絡對爬蟲帶來的新的挑戰包括

  • 有一條賬號護城河。我們通常稱UGC(User Generated Content)指用戶原創內容。為 web2.0,即數據從單向傳達,到雙向互動,人民群眾可以與網站產生交互,因此產生了賬號,每個人都通過賬號來標識身份,提交數據,這樣一來社交網絡就可以通過封賬號來提高數據抓取的難度,通過賬號來發現非人類流量。之前沒有賬號只能通過cookie和ip。cookie又是易變,易揮發的,很難長期標識一個用戶。
  • 網絡走向封閉。新浪微博在 2012 年以前都是基本不封的,隨便寫一個程序怎么抓都不封,但是很快,越來越多的站點都開始防止競爭對手,防止爬蟲來抓取,數據逐漸走向封閉,越來越多的人難以獲得數據。甚至都出現了專業的爬蟲公司,這在2010年以前是不可想象的。。
  • 反爬手段,封殺手法千差萬別。寫一個通用的框架抓取成百上千萬的網站已經成為歷史,或者說已經是一個技術相對成熟的工作,也就是已經有相對成熟的框架來”盜“成百上千的墓,但是極個別的墓則需要特殊手段了,目前市場上比較難以抓取的數據包括,微信公共賬號,微博,facebook,ins,淘寶等等。具體原因各異,但基本無法用一個統一框架來完成,太特殊了。如果有一個通用的框架能解決我說的這幾個網站的抓取,這一定是一個非常震撼的產品,如果有,一定要告訴我,那我公開出來,然后就改行了。

當面對以上三個挑戰的時候,就需要智能爬蟲。智能爬蟲是讓爬蟲的行為盡可能模仿人類行為,讓反爬策略失效,只有”混在老百姓隊伍里面,才是安全的“,因此這就需要琢磨瀏覽器了,很多人把爬蟲寫在了瀏覽器插件里面,把爬蟲寫在了手機里面,寫在了路由器里面(春節搶票王)。再有一個傳統的爬蟲都是只有讀操作的,沒有寫操作,這個很容易被判是爬蟲,智能的爬蟲需要有一些自動化交互的行為,這都是一些抵御反爬策略的方法。

1.3 爬蟲基本原理

爬蟲是模擬用戶在瀏覽器或者某個應用上的操作,把操作的過程、實現自動化的程序,當我們在瀏覽器中輸入一個 url 后回車,后臺會發生什么?比如說你輸入http://www.sina.com.cn/,簡單來說這段過程發生了以下四個步驟:

  • 1. 查找域名對應的IP地址。
  • 2. 向IP對應的服務器發送請求。
  • 3. 服務器響應請求,發回網頁內容。
  • 4. 瀏覽器解析網頁內容。

網絡爬蟲本質:本質就是瀏覽器http請求。瀏覽器和網絡爬蟲是兩種不同的網絡客戶端,都以相同的方式來獲取網頁。

網絡爬蟲要做的,簡單來說,就是實現瀏覽器的功能。通過指定url,直接返回給用戶所需要的數據, 而不需要一步步人工去操縱瀏覽器獲取。

瀏覽器是如何發送和接收這個數據呢?

  • HTTP 簡介:HTTP協議(HyperText Transfer Protocol,超文本傳輸協議)目的是為了提供一種發布和接收HTML(HyperText Markup Language)頁面的方法。
  • HTTP 協議所在的協議層(了解):HTTP 是基于TCP協議之上的。在 TCP/IP 協議參考模型的各層對應的協議如下圖,其中HTTP是應用層的協議。 默認HTTP的端口號為80,HTTPS的端口號為443。

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 網絡模型圖

HTTP 工作過程

一次 HTTP 操作稱為一個事務,其工作整個過程如下:

  • 1 ) 、地址解析。如用客戶端瀏覽器請求這個頁面:http://localhost.com:8080/index.htm從中分解出協議名、主機名、端口、對象路徑等部分,對于我們的這個地址,解析得到的結果如下: 協議名:http 主機名:localhost.com 端口:8080 對象路徑:/index.htm在這一步,需要域名系統DNS解析域名localhost.com,得主機的IP地址。
  • 2)、封裝 HTTP 請求數據包。把以上部分結合本機自己的信息,封裝成一個HTTP請求數據包
  • 3)封裝成 TCP 包,建立TCP連接(TCP的三次握手)。在HTTP工作開始之前,客戶機(Web瀏覽器)首先要通過網絡與服務器建立連接,該連接是通過TCP來完成的,該協議與IP協議共同構建Internet,即著名的TCP/IP協議族,因此Internet又被稱作是TCP/IP網絡。HTTP是比TCP更高層次的應用層協議,根據規則,只有低層協議建立之后才能,才能進行更層協議的連接,因此,首先要建立TCP連接,一般TCP連接的端口號是80。這里是8080端口
  • 4)客戶機發送請求命令。建立連接后,客戶機發送一個請求給服務器,請求方式的格式為:統一資源標識符(URL)、協議版本號,后邊是MIME信息包括請求修飾符、客戶機信息和可內容。
  • 5)服務器響應。服務器接到請求后給予相應的響應信息,其格式為一個狀態行,包括信息的協議版本號、一個成功或錯誤的代碼,后邊是 MIME 信息包括服務器信息、實體信息和可能的內容。實體消息:服務器向瀏覽器發送頭信息后,它會發送一個空白行來表示頭信息的發送到此為結束,接著,它就以Content-Type應答頭信息所描述的格式發送用戶所請求的實際數據
  • 6)服務器關閉 TCP 連接。一般情況下,一旦 Web 服務器向瀏覽器發送了請求數據,它就要關閉 TCP 連接,然后如果瀏覽器或者服務器在其頭信息加入了這行代碼 Connection:keep-alive 。TCP連接在發送后將仍然保持打開狀態,于是,瀏覽器可以繼續通過相同的連接發送請求。保持連接節省了為每個請求建立新連接所需的時間,還節約了網絡帶寬。

HTTP 協議棧數據流

HTTPS。HTTPS(全稱:Hypertext Transfer Protocol over Secure Socket Layer),是以安全為目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL。其所用的端口號是443。

SSL:安全套接層,是netscape公司設計的主要用于web的安全傳輸協議。這種協議在WEB上獲得了廣泛的應用。通過證書認證來確??蛻舳撕途W站服務器之間的通信數據是加密安全的。

有兩種基本的加解密算法類型:

  • 1)對稱加密(symmetrcic encryption):密鑰只有一個,加密解密為同一個密碼,且加解密速度快,典型的對稱加密算法有DES、AES,RC5,3DES等;對稱加密主要問題是共享秘鑰,除你的計算機(客戶端)知道另外一臺計算機(服務器)的私鑰秘鑰,否則無法對通信流進行加密解密。解決這個問題的方案非對稱秘鑰。
  • 2)非對稱加密:使用兩個秘鑰:公共秘鑰和私有秘鑰。私有秘鑰由一方密碼保存(一般是服務器保存),另一方任何人都可以獲得公共秘鑰。這種密鑰成對出現(且根據公鑰無法推知私鑰,根據私鑰也無法推知公鑰),加密解密使用不同密鑰(公鑰加密需要私鑰解密,私鑰加密需要公鑰解密),相對對稱加密速度較慢,典型的非對稱加密算法有RSA、DSA等。

https 通信的優點:

客戶端產生的密鑰只有客戶端和服務器端能得到;
加密的數據只有客戶端和服務器端才能得到明文;
客戶端到服務端的通信是安全的。

1.4 爬蟲工作流程

網絡爬蟲的基本工作流程如下:

  • 1. 首先選取一部分精心挑選的種子 URL;
  • 2. 將這些 URL 放入待抓取 URL 隊列;
  • 3. 從待抓取 URL 隊列中取出待抓取在 URL,解析 DNS,并且得到主機的 ip,將 URL 對應的網頁下載下來并存儲到已下載網頁庫中。此外,將這些 URL 放進已抓取 URL 隊列。
  • 4. 分析已抓取 URL 隊列中的 URL,分析其中的其他 URL,并且將 URL 放入待抓取 URL 隊列,從而進入下一個循環。

?;ňW 爬取 示例:爬取 大學?;??http://www.521609.com/daxuexiaohua/ )

這個爬蟲只是爬取一個 URL,并沒有提取更多 URL 進行爬取

# -*- coding:utf-8 -*- import os import chardet import requests from bs4 import BeautifulSoupdef spider():url = "http://www.521609.com/daxuexiaohua/"proxies = {"http": "http://172.17.18.80:8080","https": "https://172.17.18.80:8080"}r = requests.get(url,# proxies=proxies)html = r.content.decode("gbk")soup = BeautifulSoup(html, "lxml")divs = soup.find_all("div", class_="index_img list_center")print(f'len(divs) : {len(divs)}')for div in divs:tag_ul = div.find('ul')tag_all_li = tag_ul.find_all('li')print(f'len(tag_all_li): {len(tag_all_li)}')for tag_li in tag_all_li:tag_img = tag_li.find('img')print(f'mm_name: {tag_img["alt"]}')print(f'\t\t mm_pic: http://www.521609.com{tag_img["src"]}')home_page = tag_li.find('a')print(f'\t\t home_page: http://www.521609.com{home_page["href"]}')# print(soup)if __name__ == "__main__":spider()# input('press any key to continue......')# pass

1.5 HTTP 代理神器 Fidder

Fiddler 不但能截獲各種瀏覽器發出的HTTP請求, 也可以截獲各種智能手機發出的 HTTP/HTTPS請求。 Fiddler 能捕獲 IOS 設備發出的請求,比如 IPhone, IPad, MacBook. 等等蘋果的設備。 同理,也可以截獲 Andriod,Windows Phone 的等設備發出的HTTP/HTTPS。工作原理:Fiddler 是以代理 web 服務器的形式工作的,它使用代理地址:127.0.0.1,端口:8888

Fiddler 抓取 HTTPS 設置:啟動 Fiddler,打開菜單欄中的 Tools > Fiddler Options,打開 “Fiddler Options” 對話框。

選中 Capture HTTPS CONNECTs,再選中下方 Ignore server certificate errors,

然后再點擊 Actions 安裝證書( 要抓取 HTTPS 的流量,必須安裝證書 ),安裝為 "根證書"。。。

配置 Fiddler 允許遠程連接( 可以抓取手機流量?):

?Connections 頁簽,選中 Allow remote computers to connect。重啟 Fidler(這一步很重要,必須做)。

Fiddler 如何捕獲 Chrome的會話:switchyomega 安裝插件?

百度( 百度的時候把去掉?):i點sha點dow點socks? 或者? lan點tern

打開網址 chrome 網上應用商店,然后搜索 "switchyomega"。

Fiddler 如何捕獲 Firefox 的會話
能支持 HTTP 代理的任意程序的數據包都能被 Fiddler 嗅探到,Fiddler 的運行機制其實就是本機上監聽 8888 端口的 HTTP代理。 Fiddler2啟動的時候默認IE的代理設為了127.0.0.1:8888,而其他瀏覽器是需要手動設置的,所以將Firefox的代理改為127.0.0.1:8888就可以監聽數據了。 Firefox 上通過如下步驟設置代理 點擊: Tools -> Options, 在Options 對話框上點擊Advanced tab - > network tab -> setting.

Fiddler 的基本界面

特別注意: 遇到這個 Click 請點擊 Click?

Fiddler 強大的 Script 系統
Fiddler 包含了一個強大的基于事件腳本的子系統,并且能使用 .net 語言進行擴展。?
官方的幫助文檔:?http://www.fiddler2.com/Fiddler/dev/ScriptSamples.asp

Fiddler 的?Fiddler Script 標簽,如下圖:

在里面我們就可以編寫腳本了, 看個實例讓所有 cnblogs 的會話都顯示紅色。 把這段腳本放在 OnBeforeRequest(oSession: Session) 方法下,并且點擊 "Save script"

if (oSession.HostnameIs("www.cnblogs.com")) {oSession["ui-color"] = "red"; }

這樣所有的cnblogs的會話都會顯示紅色。

1.6 HTTP 協議介紹

HTTP (HyperText Transfer Protocol) 提供了一種發布和接收HTML(HyperText Markup Language)頁面的方法。

Http 兩部分組成:請求、響應。

客戶端請求消息:客戶端發送一個HTTP請求到服務器的請求消息包括以下格式:請求行(request line)、請求頭部(header)、空行和請求數據四個部分組成,下圖給出了請求報文的一般格式。

服務器響應消息:HTTP 響應也由四個部分組成,分別是:狀態行、消息報頭、空行響應正文。

cookies 和 session

服務器客戶端 的交互僅限于請求/響應過程,結束之后便斷開, 在下一次請求服務器會認為新的客戶端。為了維護他們之間的鏈接,讓服務器知道這是前一個用戶發送的請求,必須在一個地方保存客戶端的信息:

  • Cookie 通過在客戶端記錄信息確定用戶身份。
  • Session 通過在服務器端記錄信息確定用戶身份。

HTTP 請求

請求方法

根據 HTTP 標準,HTTP 請求可以使用多種請求方法。
HTTP 1.0 定義了三種請求方法: GET,POST 和 HEAD方法。
HTTP 1.1 新增了五種請求方法:OPTIONS,PUT,DELETE,TRACE 和 CONNECT 方法。

序號

方法

描述

1

GET

請求指定的頁面信息,并返回實體主體。

2

HEAD

類似于 get 請求,只不過返回的響應中沒有具體的內容,用于獲取報頭

3

POST

向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。

POST 請求可能會導致新的資源的建立和/或已有資源的修改。

4

PUT

從客戶端向服務器傳送的數據取代指定的文檔的內容。

5

DELETE

請求服務器刪除指定的頁面。

6

CONNECT

HTTP/1.1 協議中預留給能夠將連接改為管道方式的代理服務器。

7

OPTIONS

允許客戶端查看服務器的性能。

8

TRACE

回顯服務器收到的請求,主要用于測試或診斷。

GET和POST方法區別歸納如下幾點:

  • 1. GET 是從服務器上獲取數據,POST 是向服務器傳送數據。
  • 2. GET 請求的時候,參數都顯示在瀏覽器網址上。POST 請求的時候,參數在請求體當中,消息長度沒有限制而且以隱式的方式進行發送
  • 3. 盡量避免使用 Get 方式提交表單,因為有可能會導致安全問題。 比如說在登陸表單中用 Get 方式,用戶輸入的用戶名和密碼將在地址欄中暴露無遺。 但是在分頁程序中用 Get 方式就比用 Post 好。

URL概述

統一資源定位符(URL,英語 Uniform / Universal Resource Locator的縮寫)是用于完整地描述 Internet 上網頁和其他資源的地址的一種標識方法。

URL 格式:基本格式如下 schema://host[:port#]/path/…/[?query-string][#anchor]

  • 1. schema 協議 (例如:http, https, ftp)
  • 2. host 服務器的IP地址或者域名
  • 3. port# 服務器的端口(如果是走協議默認端口,缺省端口80)
  • 4. path 訪問資源的路徑
  • 5. query-string 參數,發送給http服務器的數據
  • 6. anchor- 錨(跳轉到網頁的指定錨點位置)

例子:

  • http://www.sina.com.cn/
  • http://192.168.0.116:8080/index.jsp
  • http://item.jd.com/11052214.html#product-detail
  • http://www.website.com/test/test.aspx?name=sv&x=true#stuff
  • URL 和 URI 的區別

    • URL:統一資源定位符(uniform resource location);平時上網時在 IE 瀏覽器中輸入的那個地址就是 URL。比如:網易 http://www.163.com 就是一個URL 。URL 是 Internet上用來描述信息資源的字符串,主要用在各種 WWW 客戶程序和服務器程序上。采用 URL 可以用一種統一的格式來描述各種信息資源,包括文件、服務器的地址和目錄等。
    • URI:統一資源標識符(uniform resource identifier)。Web 上可用的每種資源 - HTML 文檔、圖像、視頻片段、程序, 由一個通過通用資源標志符 (Universal Resource Identifier, 簡稱 "URI") 進行定位。URI 是個純粹的語法結構,用于指定標識 web資源的字符串的各個不同部分,URL 是 URI 的一個特例,它包含定位 web 資源的足夠信息。
    • URL 是 URI 的一個子集

    一個 URL 的請求過程:

    • 當你在瀏覽器輸入URL?https://www.baidu.com/ 的時候,瀏覽器發送一個Request 去獲取?https://www.baidu.com/ 的 html。
    • 服務器把 Response 發送回給瀏覽器.
    • 瀏覽器分析 Response 中的 HTML,發現其中引用了很多其他文件,比如:圖片,CSS文件,JS文件。
    • 瀏覽器會自動再次發送 Request 去獲取圖片,CSS文件,或者JS文件。
    • 當所有的文件都下載成功后, 網頁就被顯示出來了。

    常用的請求報頭

    • Host:Host初始URL中的主機和端口,用于指定被請求資源的Internet主機和端口號,它通常從HTTP URL中提取出來的
    • Connection:表示客戶端與服務連接類型;
      1. client 發起一個包含 Connection:keep-alive 的請求
      2. server 收到請求后,如果 server 支持 keepalive 回復一個包含Connection:keep-alive的
      ? ?響應不關閉連接,否則回復一個包含Connection:close的響應關閉連接。
      3. 如果 client 收到包含 Connection:keep-alive 的響應,向同一個連接發送下一個請求,
      ? ?直到一方主動關閉連接。 Keep-alive在很多情況下能夠重用連接,減少資源消耗,縮短響應時間HTTP
    • Accept:表示瀏覽器支持的 MIME 類型
      MIME 的英文全稱是 Multipurpose Internet Mail Extensions(多用途互聯網郵件擴展)
      eg:
      Accept:image/gif,表明客戶端希望接受GIF圖象格式的資源;
      Accept:text/html,表明客戶端希望接受html文本。
      Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
      意思:瀏覽器支持的 MIME 類型分別是 text/html、application/xhtml+xml、application/xml 和 */*,
      ? ? ? 優先順序是它們從左到右的排列順序。
      Text:用于標準化地表示的文本信息,文本消息可以是多種字符集和或者多種格式的;
      Application:用于傳輸應用程序數據或者二進制數據;設定某種擴展名的文件用一種應用程序來
      ? ? ? ? ? ? ?打開的方式類型,當該擴展名文件被訪問的時候,瀏覽器會自動使用指定應用程序來打開
      q 是權重系數,范圍 0 =< q <= 1,q 值越大,請求越傾向于獲得其“;”之前的類型表示的內容,
      若沒有指定 q 值越大,請求越傾向于獲得其“,則默認為1,
      若被賦值為0,則用于提醒服務器哪些是瀏覽器不接受的內容類型。

    Mime類型

    擴展名

    text/html

    .htm?.html *.shtml

    text/plain

    text/html是以html的形式輸出,比如<input type="text"/>就會在頁面上顯示一個文本框,而以plain形式就會在頁面上原樣顯示這段代碼

    application/xhtml+xml

    .xhtml?.xml

    text/css

    *.css

    application/msexcel

    .xls?.xla

    application/msword

    .doc?.dot

    application/octet-stream

    *.exe

    application/pdf

    *.pdf

    .....

    .....

    • Content-Type:POST 提交,application/x-www-form-urlencoded 提交的數據按照 key1=val1&key2=val2 的方式進行編碼,key 和 val 都進行了 URL 轉碼。
    • User-Agent: 瀏覽器類型
    • Referer: 請求來自哪個頁面,用戶是從該 Referer URL頁面訪問當前請求的頁面。
    • Accept-Encoding:瀏覽器支持的壓縮編碼類型,比如gzip,支持gzip的瀏覽器返回經gzip編碼的HTML頁面。許多情形下這可以減少5到10倍的下載時間
      eg:
      Accept-Encoding:gzip;q=1.0, identity; q=0.5, *;q=0 // 按順序支持 gzip , identity
      如果有多個Encoding同時匹配, 按照q值順序排列
      如果請求消息中沒有設置這個域,服務器假定客戶端對各種內容編碼都可以接受。
    • Accept-Language:瀏覽器所希望的語言種類,當服務器能夠提供一種以上的語言版本時要用到。
      eg:
      Accept-Language:zh-cn
      如果請求消息中沒有設置這個報頭域,服務器假定客戶端對各種語言都可以接受。
    • Accept-Charset:瀏覽器可接受的字符集,用于指定客戶端接受的字符集
      eg:
      Accept-Charset:iso-8859-1,gb2312
      ISO8859-1,通常叫做Latin-1。Latin-1包括了書寫所有西方歐洲語言不可缺少的附加字符;
      gb2312是標準中文字符集;
      UTF-8 是 UNICODE 的一種變長字符編碼,可以解決多種語言文本顯示問題,從而實現應用國際化和本地化。
      如果在請求消息中沒有設置這個域,缺省是任何字符集都可以接受。

    HTTP 響應

    服務器上每一個HTTP 應答對象 response 都包含一個數字 "狀態碼"。HTTP 狀態碼表示 HTTP 協議所返回的響應的狀態。

    比如:客戶端向服務器發送請求,如果成功地獲得請求的資源,則返回的狀態碼為200,表示響應成功。如果請求的資源不存在, 則通常返回404錯誤。

    HTTP?響應狀態碼通常分為5種類型,分別以1~5五個數字開頭,由3位整數組成,第一個數字定義了響應的類別

    分類

    分類描述

    1**

    信息,服務器收到請求,需要請求者繼續執行操作

    2**

    成功,操作被成功接收并處理

    3**

    重定向,需要進一步的操作以完成請求

    4**

    客戶端錯誤,請求包含語法錯誤或無法完成請求

    5**

    服務器錯誤,服務器在處理請求的過程中發生了錯誤

    最常用的響應狀態碼

    200 (OK): 請求成功,找到了該資源,并且一切正常。處理方式:獲得響應的內容,進行處理?
    201 請求完成,結果是創建了新資源。新創建資源的URI可在響應的實體中得到 ? ?處理方式:爬蟲中不會遇到?
    202 請求被接受,但處理尚未完成 ? ?處理方式:阻塞等待?
    204 服務器端已經實現了請求,但是沒有返回新的信 息。如果客戶是用戶代理,則無須為此更新自身的文檔視圖。 ? ?處理方式:丟棄
    300 該狀態碼不被HTTP/1.0的應用程序直接使用, 只是作為3XX類型回應的默認解釋。存在多個可用的被請求資源。 ? ?處理方式:若程序中能夠處理,則進行進一步處理,如果程序中不能處理,則丟棄
    301 (Moved Permanently): 請求的文檔在其他地方,新的URL在Location頭中給出,瀏覽器應該自動地訪問新的URL。處理方式:重定向到分配的URL
    302 (Found): 類似于301,但新的URL應該被視為臨時性的替代,而不是永久性的。處理方式:重定向到臨時的URL?
    304 (NOT MODIFIED): 該資源在上次請求之后沒有任何修改。這通常用于瀏覽器的緩存機制。處理方式:丟棄?
    400 (Bad Request): 請求出現語法錯誤。非法請求 ? ? 處理方式:丟棄?
    401 未授權 ? ? 處理方式:丟棄?
    403 (FORBIDDEN): 客戶端未能獲得授權。這通常是在401之后輸入了不正確的用戶名或密碼。禁止訪問 ? ?處理方式:丟棄?
    404 (NOT FOUND): 在指定的位置不存在所申請的資源。沒有找到 。 ? ?處理方式:丟棄?
    5XX 回應代碼以“5”開頭的狀態碼表示服務器端發現自己出現錯誤,不能繼續執行請求 ? ?處理方式:丟棄
    500 (Internal Server Error): 服務器遇到了意料不到的情況,不能完成客戶的請求
    503 (Service Unavailable): 服務器由于維護或者負載過重未能應答。
    例如,Servlet可能在數據庫連接池已滿的情況下返回503。服務器返回503時可以提供一個Retry-After頭

    常用的響應報頭(了解)
    Location:表示客戶應當到哪里去提取文檔,用于重定向接受者到一個新的位置
    Server:服務器名字,包含了服務器用來處理請求的軟件信息
    eg: Server響應報頭域的一個例子:
    Server:Apache-Coyote/1.1
    Set-Cookie:設置和頁面關聯的Cookie。
    例如:前一個 cookie 被存入瀏覽器并且瀏覽器試圖請求 http://www.ibm.com/foo/index.html 時
    Set-Cookie:customer=huangxp; path=/foo; domain=.ibm.com;?
    expires= Wednesday, 19-OCT-05 23:12:40 GMT;
    Set-Cookie的每個屬性解釋如下:
    Customer=huangxp 一個"名稱=值"對,把名稱customer設置為值"huangxp",這個屬性在Cookie中必須有。
    path=/foo 服務器路徑。
    domain=.ibm.com 指定cookie 的域名。
    expires= Wednesday, 19-OCT-05 23:12:40 GMT 指定cookie 失效的時間

    POST 請求方式

    urllib 使用示例:

    # encoding:UTF-8 import urllib.requestdef get_data():url = "http://www.baidu.com"data = urllib.request.urlopen(url).read()z_data = data.decode('UTF-8')print(z_data)get_data()

    get 和 post 方法:

    import urllib.request import urllib.parse import urllib.error # url異常處理def get_method():# GET 方法keyword = "python"keyword = urllib.parse.quote(keyword) # 搜索中文的方法url = "http://www.baidu.com/s?wd=" + keywordreq = urllib.request.Request(url)data = urllib.request.urlopen(req).read()print(data.decode('utf-8', 'ignore')) # 轉為utf-8,如果出現異常,責忽略fh = open("./1.html", "wb")fh.write(data)fh.close()def post_method():# POST 方法keyword = "python"keyword = urllib.parse.quote(keyword)url = "http://www.baidu.com/s"my_data = urllib.parse.urlencode({"wd": "python"}).encode('utf-8')req = urllib.request.Request(url, my_data)data = urllib.request.urlopen(req).read().decode("utf-8")print(data)if __name__ == '__main__':get_method()post_method()'''在清求url請求時會發現存在異常情況,常用的請求異常類是 HTTPError/URLError 兩種,HTTPError異常時URLError異常的子類,是帶異常狀態碼和異常原因的,而URLError異常類是不帶狀態碼的,所以在使用中不用直接用URLError代替HTTPError異常,如果要代替,一定要判斷是否有狀態碼屬性URLError:1/連接不上遠程服務器;2/url不存在;3/本地沒有網絡;4/假如觸發 http error所以通常用特殊處理來使用URLError來替代HTTPError異常'''try:urllib.request.urlopen("http://www.blog.csdn.net")except urllib.error.URLError as e:if hasattr(e, "code"):print("code:")print(e.code)if hasattr(e, "reason"):print("reason:")print(e.reason)finally:print("URLError ")pass

    抓取拉鉤招聘信息:https://www.lagou.com/jobs/list_爬蟲

    # -*- coding: utf-8 -*-import string from urllib import request, parse# proxy_handler = request.ProxyHandler({"http": 'http://192.168.17.1:8888'}) # opener = request.build_opener(proxy_handler) # request.install_opener(opener)page_num = 1 output = open('lagou.json', 'w')for page in range(1, page_num + 1):form_data = {'first': 'true','pn': '1','kd': '爬蟲'}# 注意:對于需要傳入的 data 數據,需要進行 urlencode 編碼。form_data = parse.urlencode(form_data).encode('utf-8')print(f'運行到第 ({page}) 頁面')send_headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ''(KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36','Accept': 'application/json, text/javascript, */*; q=0.01','X-Requested-With': 'XMLHttpRequest'}# url = 'http://www.lagou.com/jobs/positionAjax.json?px=new&needAddtionalResult=false'url = 'https://www.lagou.com/jobs/positionAjax.json?city=北京&needAddtionalResult=false'# Python3 出現 'ascii' codec can't encode characters問題# https://www.cnblogs.com/wuxiangli/p/9957601.htmlurl = parse.quote(url, safe=string.printable)req = request.Request(url=url, headers=send_headers, data=form_data, method='POST')# req.add_header('X-Requested-With', 'XMLHttpRequest')# req.headers = send_headersresponse = request.urlopen(req)res_html = response.read().decode('utf-8')print(res_html)# output.write(res_html + '\n') output.close() print('-' * 4 + 'end' + '-' * 4)

    提出一個問題,如果要采集的是 拉鉤招聘網站 北京>>朝陽區>>望京 以這個網站為例,該如何理解這個url ?

    http://www.lagou.com/jobs/list_?px=default&city=%E5%8C%97%E4%BA%AC&district=%E6%9C%9D%E9%98%B3%E5%8C%BA&bizArea=%E6%9C%9B%E4%BA%AC#filterBox

    URL 編碼 / 解碼:http://tool.chinaz.com/tools/urlencode.aspx

    # -*- coding: utf-8 -*-from urllib import request, parsequery = {'city': '北京','district': '朝陽區','bizArea': '望京' } print(parse.urlencode(query)) page = 3 values = {'first': 'false','pn': str(page),'kd': '后端開發', } form_data = parse.urlencode(values) print(form_data)

    小結

    • Content-Length: 是指報頭Header以外的內容長度,指 表單數據長度
    • X-Requested-With: XMLHttpRequest :表示Ajax異步請求
    • Content-Type: application/x-www-form-urlencoded :表示:提交的表單數據 會按照name/value 值對 形式進行編碼。例如:name1=value1&name2=value2... 。name 和 value 都進行了 URL 編碼(utf-8、gb2312)

    2. 爬蟲入門 基礎篇

    數據格式

    描述

    設計目標

    XML

    Extensible Markup Language (可擴展標記語言)

    被設計為傳輸和存儲數據,其焦點是數據的內容

    HTML

    HyperText Markup Language(超文本標記語言)

    顯示數據以及如何更好顯示數據

    HTML DOM

    HTML Document Object Model(文檔對象模型)

    通過 JavaScript,您可以重構整個HTML文檔。您可以添加、移除、改變或重排頁面上的項目。要改變頁面的某個東西,JavaScript就需要對HTML文檔中所有元素進行訪問的入口。

    XML

    XML DOM 定義訪問和操作 XML 文檔的標準方法。 DOM 將 XML 文檔作為一個樹形結構,而樹葉被定義為節點。

    XML 示例

    <?xml version="1.0" encoding="utf-8"?> <bookstore> <book category="cooking"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="children"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="web"> <title lang="en">XQuery Kick Start</title> <author>James McGovern</author> <author>Per Bothner</author> <author>Kurt Cagle</author> <author>James Linn</author> <author>Vaidyanathan Nagarajan</author> <year>2003</year> <price>49.99</price> </book> <book category="web" cover="paperback"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> </bookstore>

    HTML DOM 示例

    HTML DOM 定義了訪問和操作 HTML 文檔的標準方法。 DOM 以樹結構表達 HTML 文檔。

    2.1 頁面解析之數據提取

    抓取網站或者某個應用的數據一般分為兩部分,非結構化的文本,或結構化的文本。

    • 結構化的數據:JSON、XML
    • 非結構化的數據:HTML文本(包含JavaScript代碼)

    HTML文本(包含JavaScript代碼)是最常見的數據格式,理應屬于結構化的文本組織,但因為一般我們需要的關鍵信息并非直接可以得到,需要進行對HTML的解析查找,甚至一些字符串操作才能得到,所以還是歸類于非結構化的數據處理中。

    把網頁比作一個人,那么 HTML 便是他的骨架JS 便是他的肌肉CSS 便是它的衣服常見解析方式如下:

    • XPath
    • CSS選擇器
    • 正則表達式

    一段文本,例如一篇文章,或者一句話,我們的初衷是提取有效信息,所以如果是滯后處理,可以直接存儲,如果是需要實時提取有用信息,常見的處理方式如下:

    • 分詞,根據抓取的網站類型,使用不同詞庫,進行基本的分詞,然后變成詞頻統計
    • NLP 自然語言處理,進行語義分析,用結果表示,例如正負面等。

    2.2 非結構化數據之 XPath

    XPath 語言:XPath(XML Path Language)是 XML 路徑語言,它是一種用來定位 XML 文檔中某部分位置的語言。將 HTML 轉換成 XML 文檔之后,用 XPath 查找 HTML 節點或元素。比如:用 "/" 來作為上下層級間的分隔,第一個 "/" 表示文檔的根節點(注意,不是指文檔最外層的 tag 節點,而是指文檔本身),對于一個 HTML 文件來說,最外層的節點應該是 "/html" 。

    XPath開發工具:開源的 XPath 表達式編輯工具:XMLQuire(XML格式文件可用)、chrome 插件 XPath Helper

    firefox插件 XPath Checker

    XPath語法 (?XPath語法參考文檔:http://www.w3school.com.cn/xpath/index.asp )

    XPath 是一門在 XML 文檔中查找信息的語言。
    XPath 可用來在 XML 文檔中對元素和屬性進行遍歷。

    <?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <book> <title lang="eng">Harry Potter</title> <price>29.99</price> </book> <book> <title lang="eng">Learning XML</title> <price>39.95</price> </book> </bookstore>

    選取節點 XPath 使用路徑表達式在 XML 文檔中選取節點。節點是通過沿著路徑或者 step 來選取的。
    下面列出了最有用的路徑表達式:

    表達式

    描述

    /

    從根節點選取。

    nodename

    選取此節點的所有子節點。

    //

    從當前節點 選擇?所有匹配文檔中的節點

    .

    選取當前節點。

    ..

    選取當前節點的父節點。

    @

    選取屬性。

    在下面的表格中,我們已列出了一些路徑表達式以及表達式的結果:

    路徑表達式

    結果

    /bookstore

    選取根元素 bookstore。注釋:假如路徑起始于正斜杠( / ),則此路徑始終代表到某元素的絕對路徑!

    bookstore

    選取 bookstore 元素的所有子節點。默認從根節點選取

    bookstore/book

    選取屬于 bookstore 的子元素的所有 book 元素。

    //book

    選取所有 book 子元素,而不管它們在文檔中的位置。

    //book/./title

    選取所有 book 子元素,從當前節點查找title節點

    //price/..

    選取所有 book 子元素,從當前節點查找父節點

    bookstore//book

    選擇屬于 bookstore 元素的后代的所有 book 元素,而不管它們位于 bookstore 之下的什么位置。

    //@lang

    選取名為 lang 的所有屬性。

    謂語條件(Predicates)
    謂語用來查找某個特定的信息或者包含某個指定的值的節點。
    所謂"謂語條件",就是對路徑表達式的附加條件
    謂語是被嵌在方括號中,都寫在方括號"[]"中,表示對節點進行進一步的篩選。
    在下面的表格中,我們列出了帶有謂語的一些路徑表達式,以及表達式的結果:

    路徑表達式

    結果

    /bookstore/book[1]

    選取屬于 bookstore 子元素的第一個 book 元素。

    /bookstore/book[last()]

    選取屬于 bookstore 子元素的最后一個 book 元素。

    /bookstore/book[last()-1]

    選取屬于 bookstore 子元素的倒數第二個 book 元素。

    /bookstore/book[position()<3]

    選取最前面的兩個屬于 bookstore 元素的子元素的 book 元素。

    //title[@lang]

    選取所有擁有名為 lang 的屬性的 title 元素。

    //title[@lang=’eng’]

    選取所有 title 元素,且這些元素擁有值為 eng 的 lang 屬性。

    //book[price]

    選取所有 book 元素,且被選中的book元素必須帶有price子元素

    /bookstore/book[price>35.00]

    選取 bookstore 元素的所有 book 元素,且其中的 price 元素的值須大于 35.00。

    /bookstore/book[price>35.00]/title

    選取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值須大于 35.00

    選取未知節點:XPath 通配符可用來選取未知的 XML 元素。

    通配符

    描述

    *

    匹配任何元素節點。

    @*

    匹配任何屬性節點。

    在下面的表格中,我們列出了一些路徑表達式,以及這些表達式的結果:

    路徑表達式

    結果

    /bookstore/*

    選取 bookstore 元素的所有子元素。

    //*

    選取文檔中的所有元素。

    //title[@*]

    選取所有帶有屬性的 title 元素。

    選取若干路徑: 通過在路徑表達式中使用“|”運算符,您可以選取若干個路徑。
    在下面的表格中,我們列出了一些路徑表達式,以及這些表達式的結果:

    路徑表達式

    結果

    //book/title | //book/price

    選取 book 元素的所有 title 和 price 元素。

    //title | //price

    選取文檔中的所有 title 和 price 元素。

    /bookstore/book/title | //price

    選取屬于 bookstore 元素的 book 元素的所有 title 元素,以及文檔中所有的 price 元素。

    XPath 高級用法

    模糊查詢 contains

    目前許多 web 框架,都是動態生成界面的元素id,因此在每次操作相同界面時,ID都是變化的,這樣為自動化測試造成了一定的影響。

    <div class="eleWrapper" title="請輸入用戶名"> <input type="text" class="textfield" name="ID9sLJQnkQyLGLhYShhlJ6gPzHLgvhpKpLzp2Tyh4hyb1b4pnvzxFR!-166749344!1357374592067" id="nt1357374592068" /> </div>

    解決方法 使用 xpath 的匹配功能,//input[contains(@id,'nt')]

    測試使用的XML <Root> <Person ID="1001" > <Name lang="zh-cn" >張城斌</Name> <Email xmlns="www.quicklearn.cn" > cbcye@live.com </Email> <Blog>http://cbcye.cnblogs.com</Blog> </Person> <Person ID="1002" > <Name lang="en" >Gary Zhang</Name> <Email xmlns="www.quicklearn.cn" > GaryZhang@cbcye.com</Email> <Blog>http://www.quicklearn.cn</Blog> </Person> </Root>

    1.查詢所有Blog節點值中帶有 cn 字符串的Person節點。Xpath表達式:/Root//Person[contains(Blog,'cn')]
    2.查詢所有Blog節點值中帶有 cn 字符串并且屬性ID值中有01的Person節點。Xpath表達式:/Root//Person[contains(Blog,'cn') and contains(@ID,'01')]

    xpath 學習筆記

    1.依靠自己的屬性,文本定位//td[text()='Data Import']//div[contains(@class,'cux-rightArrowIcon-on')]//a[text()='馬上注冊']//input[@type='radio' and @value='1'] 多條件//span[@name='bruce'][text()='bruce1'][1] 多條件//span[@id='bruce1' or text()='bruce2'] 找出多個//span[text()='bruce1' and text()='bruce2'] 找出多個 2.依靠父節點定位//div[@class='x-grid-col-name x-grid-cell-inner']/div//div[@id='dynamicGridTestInstanceformclearuxformdiv']/div//div[@id='test']/input 3.依靠子節點定位//div[div[@id='navigation']]//div[div[@name='listType']]//div[p[@name='testname']] 4.混合型//div[div[@name='listType']]//img//td[a//font[contains(text(),'seleleium2從零開始 視屏')]]//input[@type='checkbox'] 5.進階部分//input[@id='123']/following-sibling::input 找下一個兄弟節點//input[@id='123']/preceding-sibling::span 上一個兄弟節點//input[starts-with(@id,'123')] 以什么開頭//span[not(contains(text(),'xpath'))] 不包含xpath字段的span 6.索引//div/input[2]//div[@id='position']/span[3]//div[@id='position']/span[position()=3]//div[@id='position']/span[position()>3]//div[@id='position']/span[position()<3]//div[@id='position']/span[last()]//div[@id='position']/span[last()-1] 7.substring 截取判斷<div data-for="result" id="swfEveryCookieWrap"></div>//*[substring(@id,4,5)='Every']/@id 截取該屬性 定位3,取長度5的字符 //*[substring(@id,4)='EveryCookieWrap'] 截取該屬性從定位3 到最后的字符 //*[substring-before(@id,'C')='swfEvery']/@id 屬性 'C'之前的字符匹配//*[substring-after(@id,'C')='ookieWrap']/@id 屬性'C之后的字符匹配 8.通配符*//span[@*='bruce']//*[@name='bruce'] 9.軸//div[span[text()='+++current node']]/parent::div 找父節點//div[span[text()='+++current node']]/ancestor::div 找祖先節點 10.孫子節點//div[span[text()='current note']]/descendant::div/span[text()='123']//div[span[text()='current note']]//div/span[text()='123'] 兩個表達的意思一樣 11.following pre https://www.baidu.com/s?wd=xpath&pn=10&oq=xpath&ie=utf-8&rsv_idx=1&rsv_pq=df0399f30003691c&rsv_t=7dccXo734hMJVeb6AVGfA3434tA9U%2FXQST0DrOW%2BM8GijQ8m5rVN2R4J3gU//span[@class="fk fk_cur"]/../following::a 往下的所有a//span[@class="fk fk_cur"]/../preceding::a[1] 往上的所有axpath提取多個標簽下的text在寫爬蟲的時候,經常會使用xpath進行數據的提取,對于如下的代碼: <div id="test1">大家好!</div> 使用xpath提取是非常方便的。假設網頁的源代碼在selector中: data = selector.xpath('//div[@id="test1"]/text()').extract()[0] 就可以把“大家好!”提取到data變量中去。 然而如果遇到下面這段代碼呢? <div id="test2">美女,<font color=red>你的微信是多少?</font><div> 如果使用: data = selector.xpath('//div[@id="test2"]/text()').extract()[0] 只能提取到“美女,”; 如果使用: data = selector.xpath('//div[@id="test2"]/font/text()').extract()[0] 又只能提取到“你的微信是多少?” 可是我本意是想把“美女,你的微信是多少?”這一整個句子提取出來。 <div id="test3">我左青龍,<span id="tiger">右白虎,<ul>上朱雀,<li>下玄武。</li></ul>老牛在當中,</span>龍頭在胸口。<div> 而且內部的標簽還不固定,如果我有一百段這樣類似的html代碼,又如何使用xpath表達式,以最快最方便的方式提取出來? 使用xpath的string(.) 以第三段代碼為例: data = selector.xpath('//div[@id="test3"]') info = data.xpath('string(.)').extract()[0] 這樣,就可以把“我左青龍,右白虎,上朱雀,下玄武。老牛在當中,龍頭在胸口”整個句子提取出來,賦值給info變量。

    2.3 非結構化數據之 lxml 庫

    lxml 是一種使用 Python 編寫的庫,可以迅速、靈活地處理 XML ,支持 XPath (XML Path Language),可以利用 XPath 語法快速的定位特定元素以及節點信息,提取出 HTML、XML 目標數據

    lxml python 官方文檔?http://lxml.de/index.html

    簡單使用

    首先利用 lxml 來解析 HTML 代碼,先來一個小例子來感受一下它的基本用法。使用 lxml 的 etree 庫,然后利用 etree.HTML 初始化,然后我們將其打印出來。

    from lxml import etree text = ''' <div><ul><li class="item-0"><a href="link1.html">first item</a></li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-inactive"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></ul> </div> ''' # Parses an HTML document from a string html = etree.HTML(text) # Serialize an element to an encoded string representation of its XML tree result = etree.tostring(html) print(result)

    所以輸出結果如下,不僅補全了 li 標簽,還添加了 body,html 標簽。

    <html><body><div><ul><li class="item-0"><a href="link1.html">first item</a></li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-inactive"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul> </div> </body></html>

    XPath 實例測試

    (1)獲取所有的 <li> 標簽

    from lxml import etree html_text = ''' <div><ul><li class="item-0"><a href="link1.html">first item</a></li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-inactive"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></ul> </div> ''' # Parses an HTML document from a string html = etree.HTML(text=html_text) # Serialize an element to an encoded string representation of its XML tree # result = etree.tostring(html) # print(result)print(type(html)) result = html.xpath('//li') print(result) print(len(result)) print(type(result)) print(type(result[0]))
    • 每個元素都是 Element 類型;是一個個的標簽元素,類似現在的實例
      ? ? ? ? <Element li at 0x1014e0e18> Element類型代表的就是
      ? ? ? ? <li class="item-0"><a href="link1.html">first item</a></li>

    [注意]:Element 類型是一種靈活的容器對象,用于在內存中存儲結構化數據。每個 element 對象都具有以下屬性:
      1. tag:string對象,標簽,用于標識該元素表示哪種數據(即元素類型)。
      2. attrib:dictionary對象,表示附有的屬性。
      3. text:string對象,表示element的內容。
      4. tail:string對象,表示element閉合之后的尾跡。

    (2)獲取 <li> 標簽的所有 class

    html.xpath('//li/@class')# 運行結果:['item-0', 'item-1', 'item-inactive', 'item-1', 'item-0']

    (3)獲取 <li> 標簽下屬性 href 為 link1.html 的 <a> 標簽

    html.xpath('//li/a[@href="link1.html"]')# 運行結果:[<Element a at 0x10ffaae18>]

    (4)獲取 <li> 標簽下的所有 <span> 標簽

    注意這么寫是不對的 html.xpath('//li/span') 因為 / 是用來獲取子元素的,而 <span> 并不是 <li> 的子元素,所以,要用雙斜杠html.xpath('//li//span') # 運行結果:[<Element span at 0x10d698e18>]

    (5)獲取 <li> 標簽下的所有 class,不包括 <li>

    html.xpath('//li/a//@class') # 運行結果:['blod']

    (6)獲取最后一個 <li> 的<a> 的 href

    html.xpath('//li[last()]/a/@href') # 運行結果:['link5.html']

    (7)獲取 class 為 bold 的標簽

    result = html.xpath('//*[@class="bold"]') print result[0].tag # 運行結果:span

    騰訊招聘:https://careers.tencent.com/search.html?pcid=40001

    2.4 非結構化數據之 CSS Selector(CSS 選擇器)

    CSS 即層疊樣式表Cascading Stylesheet。?Selector 來定位(locate)頁面上的元素(Elements)。?Selenium 官網的Document 里極力推薦使用 CSS locator,而不是 XPath 來定位元素,原因是 CSS locator 比 XPath locator 速度快。

    Beautiful Soup

    安裝:https://pypi.org/project/bs4/

    官方文檔鏈接:?https://www.crummy.com/software/BeautifulSoup/bs4/doc/

    Beautiful Soup 是從 HTML 或 XML 文件中提取數據,支持 Python 標準庫中的 HTML 解析器。還支持一些第三方的解析器,其中一個是 lxml。

    Beautiful Soup 自動將輸入文檔轉換為 Unicode 編碼,輸出文檔轉換為 utf-8 編碼。你不需要考慮編碼方式,除非文檔沒有指定一個編碼方式,這時,Beautiful Soup 就不能自動識別編碼方式了。然后,你僅僅需要說明一下原始編碼方式就可以了。另一個可供選擇的解析器是純 Python 實現的 html5lib , html5lib 的解析方式與瀏覽器相同,可以選擇下列方法來安裝 html5lib: pip install html5lib

    下表列出了主要的解析器:

    解析器

    使用方法

    優勢

    劣勢

    Python標準庫

    BeautifulSoup(markup, "html.parser")

    Python的內置標準庫;執行速度適中;文檔容錯能力強

    Python 2.7.3 or 3.2.2前 的版本中文檔容錯能力差

    lxml HTML 解析器

    BeautifulSoup(markup, "lxml")

    速度快;文檔容錯能力強 ;

    需要安裝C語言庫

    lxml XML 解析器

    BeautifulSoup(markup, ["lxml-xml"]) BeautifulSoup(markup, "xml")

    速度快;唯一支持XML的解析器

    需要安裝C語言庫

    html5lib

    BeautifulSoup(markup, "html5lib")

    最好的容錯性;以瀏覽器的方式解析文檔;生成HTML5格式的文檔

    速度慢;不依賴外部擴展

    推薦使用 lxml 作為解析器,因為效率更高。在 Python2.7.3 之前的版本和 Python3 中 3.2.2 之前的版本,必須安裝 lxml 或html5lib, 因為那些 Python 版本的標準庫中內置的 HTML 解析方法不夠穩定.

    示例:使用 BeautifulSoup 解析這段代碼,能夠得到一個 BeautifulSoup 的對象,并能按照標準的縮進格式的結構輸出:

    from bs4 import BeautifulSouphtml_doc = """ <html><head><title>The Dormouse's story</title></head> <body> <p class="title"><b>The Dormouse's story</b></p><p class="story">Once upon a time there were three little sisters; and their names were <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>, <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>; and they lived at the bottom of a well.</p><p class="story">...</p> """soup = BeautifulSoup(html_doc,'lxml')print(soup) # 打印 soup 對象的內容

    打印 soup 對象的內容

    格式化輸出soup 對象

    print(soup.prettify())

    CSS 選擇器

    在寫 CSS 時:標簽名不加任何修飾。類名前加點。id名前加 “#”。?

    利用類似的方法來篩選元素,用到的方法是 soup.select(),返回類型是 list

    通過標簽名查找

    from bs4 import BeautifulSouphtml_doc = """ <html><head><title>The Dormouse's story</title></head> <body> <p class="title"><b>The Dormouse's story</b></p><p class="story">Once upon a time there were three little sisters; and their names were <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>, <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>; and they lived at the bottom of a well.</p><p class="story">...</p> """soup = BeautifulSoup(html_doc, 'lxml')# print(soup) # 打印 soup 對象的內容 print(soup.select('title')) # [<title>The Dormouse's story</title>] print(soup.select('a')) print(soup.select('b')) # [<b>The Dormouse's story</b>]

    通過類名查找

    print(soup.select('.sister'))

    通過 id 名查找

    print(soup.select('#link1')) #[<a class="sister" href="http://example.com/elsie" id="link1"></a>]

    直接子標簽查找

    print(soup.select("head > title")) #[<title>The Dormouse's story</title>]

    組合查找:組合查找即標簽名與類名、id名進行的組合原理是一樣的,例如查找 p 標簽中,id 等于 link1的內容,

    屬性 標簽 不屬于 同一節點 ?二者需要用 ?空格分開

    print(soup.select('p #link1')) #[<a class="sister" href="http://example.com/elsie" id="link1"></a>]

    屬性查找

    查找時還可以加入屬性元素,屬性需要用中括號括起來

    注意:屬性和標簽屬于同一節點,所以中間不能加空格,否則會無法匹配到

    print(soup.select('a[class="sister"]'))print(soup.select('a[href="http://example.com/elsie"]')) #[<a class="sister" href="http://example.com/elsie" id="link1"></a>]

    同樣,屬性仍然可以與上述查找方式組合。不在同一節點的使用空格隔開,在同一節點的則不用加空格

    print soup.select('p a[href="http://example.com/elsie"]') #[<a class="sister" href="http://example.com/elsie" id="link1"></a>]

    以上的 select 方法返回的結果都是列表形式,可以遍歷形式輸出

    用 get_text() 方法來獲取它的內容。

    print soup.select('title')[0].get_text() for title in soup.select('title'):print(title.get_text())

    Tag:Tag 是什么?通俗點講就是 HTML 中的一個個標簽,例如:

    <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>print type(soup.select('a')[0])輸出:bs4.element.Tag

    對于 Tag,它有兩個重要的屬性,是 name 和 attrs,下面我們分別來感受一下

    1. name

    print(soup.name) print(soup.select('a')[0].name)輸出: [document] 'a'

    soup 對象本身比較特殊,它的 name 即為 [document],對于其他內部標簽,輸出的值便為標簽本身的名稱。

    2. attrs

    print(soup.select('a')[0].attrs)輸出: {'href': 'http://example.com/elsie', 'class': ['sister'], 'id': 'link1'} 在這里,我們把 soup.select('a')[0] 標簽的所有屬性打印輸出了出來,得到的類型是一個字典。 如果我們想要單獨獲取某個屬性,可以這樣,例如我們獲取它的 class 叫什么print soup.select('a')[0].attrs['class']輸出: ['sister']

    實戰案例:騰訊招聘網站:https://careers.tencent.com/search.html

    2.5 正則表達式

    掌握了 XPath、CSS選擇器,為什么還要學習正則?

    正則表達式,用標準正則解析,一般會把 HTML當 做普通文本,用指定格式匹配當相關文本,適合小片段文本,或者某一串字符(比如電話號碼、郵箱賬戶),或者HTML包含javascript的代碼,無法用CSS選擇器或者XPath

    在線正則表達式測試網站:https://tool.oschina.net/regex/

    Python 正則表達式 官方文檔:https://docs.python.org/zh-cn/3.8/library/re.html#regular-expression-objects

    正則表達式常見概念

    邊界匹配
    ^ -- 與字符串開始的地方匹配,不匹配任何字符;
    $ -- 與字符串結束的地方匹配,不匹配任何字符;

    str = "cat abdcatdetf ios"^cat : 驗證該行以c開頭緊接著是a,然后是tios$ : 驗證該行以t結尾倒數第二個字符為a倒數第三個字符為c^cat$: 以c開頭接著是a->t然后是行結束:只有cat三個字母的數據行^$ : 開頭之后馬上結束:空白行,不包括任何字符^ : 行的開頭,可以匹配任何行,因為每個行都有行開頭

    \b -- 匹配一個單詞邊界,也就是單詞和空格之間的位置,不匹配任何字符;

    "er\b"可以匹配"never"中的"er",但不能匹配"verb"中的"er"。

    \B -- \b取非,即匹配一個非單詞邊界;

    "er\B"能匹配"verb"中的"er",但不能匹配"never"中的"er"。

    數量詞的貪婪模式與非貪婪模式

    正則表達式通常用于在文本中查找匹配的字符串。Python里數量詞默認是貪婪的(在少數語言里也可能是默認非貪婪),總是嘗試匹配盡可能多的字符;非貪婪的則相反,總是嘗試匹配盡可能少的字符。例如:

    正則表達式"ab*"如果用于查找"abbbc",將找到"abbb"。而如果使用非貪婪的數量詞"ab*?",將找到"a"。

    反斜杠問題

    與大多數編程語言相同,正則表達式里使用"\"作為轉義字符,這就可能造成反斜杠困擾。
    假如你需要匹配文本中的字符"\",那么使用編程語言表示的正則表達式里將需要4個反斜杠"\\\\":前兩個和后兩個分別用于在編程語言里轉義成反斜杠,轉換成兩個反斜杠后再在正則表達式里轉義成一個反斜杠。
    Python里的原生字符串很好地解決了這個問題,這個例子中的正則表達式可以使用r"\\"表示。
    同樣,匹配一個數字的"\\d"可以寫成r"\d"。有了原生字符串,你再也不用擔心是不是漏寫了反斜杠,寫出來的表達式也更直觀。

    import re a=re.search(r"\\","ab123bb\c") print a.group() \ a=re.search(r"\d","ab123bb\c") print a.group() 1

    Python Re模塊

    Python 自帶了 re 模塊,它提供了對正則表達式的支持。

    match 函數:re.match 嘗試從字符串的起始位置匹配一個模式,如果不是起始位置匹配成功的話,match() 就返回 none。
    下面是此函數的語法:re.match(pattern, string, flags=0)

    參數

    描述

    pattern

    這是正則表達式來進行匹配。

    string

    這是字符串,這將被搜索匹配的模式,在字符串的開頭。

    flags

    標志位,用于控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。

    匹配成功則 re.match 方法返回一個匹配的對象,否則返回 None。

    我們可以使用group(num) 或 groups() 匹配對象函數來獲取匹配表達式。

    匹配對象的方法

    描述

    group(num=0)

    此方法返回整個匹配(或指定分組num)

    groups()

    此方法返回所有元組匹配的子組(空,如果沒有)

    示例代碼:

    #!/usr/bin/python import reline = "Cats are smarter than dogs"matchObj = re.match(r'(.*) are (.*?) .*', line, re.M | re.I)if matchObj:print("matchObj.group() : {0}".format(matchObj.group()))print("matchObj.group(1) : {0}".format(matchObj.group(1)))print(f"matchObj.group(2) : {matchObj.group(2)}") else:print("No match!!")''' 輸出: matchObj.group() : Cats are smarter than dogs matchObj.group(1) : Cats matchObj.group(2) : smarter '''

    正則表達式修飾符 - 選項標志

    正則表達式字面可以包含一個可選的修飾符來控制匹配的各個方面。修飾符被指定為一個可選的標志。可以使用異或提供多個修飾符(|),如先前所示,并且可以由這些中的一個來表示:

    修飾符

    描述

    re.I(re.IGNORECASE)

    使匹配對大小寫不敏感

    re.M(MULTILINE)

    多行匹配,影響 ^ 和 $

    re.S(DOTALL)

    使 . 匹配包括換行在內的所有字符

    re.X(VERBOSE)

    正則表達式可以是多行,忽略空白字符,并可以加入注釋

    findall() 函數
    re.findall(pattern, string, flags=0)

    返回字符串中所有模式的非重疊的匹配,作為字符串列表。該字符串掃描左到右,并匹配返回的順序發現

    默認:pattren = "\w+"target = "hello world\nWORLD HELLO"re.findall(pattren,target)['hello', 'world', 'WORLD', 'HELLO']re.I: re.findall("world", target,re.I)['world', 'WORLD']re.S: re.findall("world.WORLD", target,re.S)["world\nworld"]re.findall("hello.*WORLD", target,re.S)['hello world\nWORLD']re.M:re.findall("^WORLD",target,re.M)["WORLD"]re.X:reStr = '''\d{3} #區號-\d{8}''' #號碼re.findall(reStr,"010-12345678",re.X) ["010-12345678"]

    search 函數
    re.search 掃描整個字符串并返回第一個成功的匹配。
    下面是此函數語法:re.search(pattern, string, flags=0)

    參數

    描述

    pattern

    這是正則表達式來進行匹配。

    string

    這是字符串,這將被搜索到的字符串中的任何位置匹配的模式。

    flags

    標志位,用于控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。

    匹配成功則 re.search 方法返回一個匹配的對象,否則返回None。

    我們可以使用group(num) 或 groups() 匹配對象函數來獲取匹配表達式。

    #!/usr/bin/python import reline = "Cats are smarter than dogs"searchObj = re.search(r'(.*) are (.*?) .*', line, re.M | re.I)if searchObj:print("matchObj.group() : {0}".format(searchObj.group()))print("matchObj.group(1) : {0}".format(searchObj.group(1)))print(f"matchObj.group(2) : {searchObj.group(2)}") else:print("No match!!")''' 輸出: matchObj.group() : Cats are smarter than dogs matchObj.group(1) : Cats matchObj.group(2) : smarter '''

    re.match 與 re.search 的區別

    • re.match? 只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,函數返回None;
    • re.search 匹配整個字符串,直到找到一個匹配。

    示例代碼:

    #!/usr/bin/python import reline = "Cats are smarter than dogs";matchObj = re.match(r'dogs', line, re.M | re.I) if matchObj:print(f"match --> matchObj.group() : {matchObj.group()}") else:print("No match!!")searchObj = re.search(r'dogs', line, re.M | re.I) if searchObj:print(f"search --> searchObj.group() : {searchObj.group()}") else:print("Nothing found!!")''' No match!! search --> searchObj.group() : dogs '''

    搜索 和 替換

    Python 的 re 模塊提供了 re.sub 用于替換字符串中的匹配項。
    語法:re.sub(pattern, repl, string, max=0)
    返回的字符串是在字符串中用 RE 最左邊不重復的匹配來替換。如果模式沒有發現,字符將被沒有改變地返回。 可選參數 count 是模式匹配后替換的最大次數;count 必須是非負整數。缺省值是 0 表示替換所有的匹配。

    實例:

    #!/usr/bin/python import reurl = "http://hr.tencent.com/position.php?&start=10" page = re.search(r'start=(\d+)', url).group(1)next_url = re.sub(r'start=(\d+)', 'start=' + str(int(page) + 10), url) print(f"Next Url : {next_url}")# 當執行上面的代碼,產生以下結果: # Next Url : http://hr.tencent.com/position.php?&start=20

    正則表達式語法

    2.6 頁面解析之結構化數據

    結構化的數據是最好處理,一般都是類似 JSON 格式的字符串,直接解析 JSON 數據,提取 JSON 的關鍵字段即可。

    JSON (JavaScript Object Notation) 是一種輕量級的數據交換格式;適用于進行數據交互的場景,比如網站前臺與后臺之間的數據交互。Python 自帶了 JSON 模塊,直接 import json 就可以使用了。Json 模塊提供了四個功能:dumps、dump、loads、load,用于字符串 和 python數據類型間進行轉換

    Python 操作 json 的標準 api 庫參考:https://docs.python.org/zh-cn/3/library/json.html

    在線 JSON 格式化代碼:https://tool.oschina.net/codeformat/json

    1. json.loads()

    作用:json字符串 轉化 python 的類型,返回一個python的類型

    從 json 到 python 的類型轉化對照如下:

    示例 :

    import jsona = "[1,2,3,4]" b = '{"k1":1,"k2":2}' # 當字符串為字典時{}外面必須是''單引號{}里面必須是""雙引號 print(json.loads(a)) # [1, 2, 3, 4]print(json.loads(b)) # {'k2': 2, 'k1': 1}

    豆瓣讀書 示例:

    import re import json import requestsdef crawl():custom_headers = {'Host': 'book.douban.com','Connection': 'keep-alive','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ''(KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;''q=0.8,application/signed-exchange;v=b3;q=0.9','Referer': 'https://book.douban.com/',}db_url = 'https://book.douban.com/subject/26393282/'r = requests.get(url=db_url, headers=custom_headers, verify=False)if 200 == r.status_code:html_text = r.textresult_list = re.findall(r'<script type="application/ld\+json">([\s\S]*?)</script>', html_text)if len(result_list):json_string = result_list[0]# print(json_string)json_dict = json.loads(json_string)# print(json.dumps(json_dict, ensure_ascii=False, indent=4))print(f'name: {json_dict["name"]}')print(f'author: {json_dict["author"][0]["name"]} {json_dict["author"][1]["name"]}')print(f'url: {json_dict["url"]}')print(f'isbn: {json_dict["isbn"]}')if __name__ == '__main__':crawl()pass

    2. json.dumps()
    實現 python 類型轉化為 json 字符串,返回一個 str 對象
    從 python 原始類型向 json 類型的轉化對照如下:

    示例:

    import json a = [1,2,3,4] b ={"k1":1,"k2":2} c = (1,2,3,4)json.dumps(a) # '[1, 2, 3, 4]'json.dumps(b) # '{"k2": 2, "k1": 1}'json.dumps(c) # '[1, 2, 3, 4]'

    json.dumps 中的 ensure_ascii 參數引起的中文編碼問題

    如果 Python Dict 字典含有中文,json.dumps 序列化時對中文默認使用的 ascii 編碼

    import chardet import jsonb = {"name":"中國"}json.dumps(b) # '{"name": "\\u4e2d\\u56fd"}'print json.dumps(b) # {"name": "\u4e2d\u56fd"}chardet.detect(json.dumps(b)) # {'confidence': 1.0, 'encoding': 'ascii'}

    '中國' 中的 ascii 字符碼,而不是真正的中文。想輸出真正的中文需要指定 ensure_ascii=False

    json.dumps(b,ensure_ascii=False) # '{"name": "\xe6\x88\x91"}'print json.dumps(b,ensure_ascii=False) # {"name": "我"}chardet.detect(json.dumps(b,ensure_ascii=False)) # {'confidence': 0.7525, 'encoding': 'utf-8'}

    3. json.dump()

    把 Python 類型 以 字符串的形式 寫到文件中

    import json a = [1,2,3,4] json.dump(a,open("digital.json","w")) b = {"name":"我"} json.dump(b,open("name.json","w"),ensure_ascii=False) json.dump(b,open("name2.json","w"),ensure_ascii=True)

    4. json.load()

    讀取 文件中 json 形式的字符串元素 轉化成 python 類型

    # -*- coding: utf-8 -*- import json number = json.load(open("digital.json")) print number b = json.load(open("name.json")) print b b.keys() print b['name']

    實戰項目:獲取 lagou 城市表信息

    import json import chardet import requestsurl = 'http://www.lagou.com/lbs/getAllCitySearchLabels.json?' custom_headers = {'Host': 'www.lagou.com','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ''(KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36',}response = requests.get(url, verify=False, headers=custom_headers)print(response.status_code) res_Html = response.text json_obj = json.loads(res_Html) print(type(json_obj)) print(json_obj)city_list =[]all_cities = json_obj['content']['data']['allCitySearchLabels']print(all_cities.keys())for key in all_cities:print(type(all_cities[key]))for item in all_cities[key]:name = item['name']print(f'name: {name}')city_list.append(name)fp = open('city.json', 'w') content = json.dumps(city_list, ensure_ascii=False) print(content) fp.write(content) fp.close()

    JSONPath

    • JSON 信息抽取類庫,從JSON文檔中抽取指定信息的工具
    • JSONPath 與 Xpath 區別:JsonPath 對于 JSON 來說,相當于 XPATH 對于XML。

    下載地址:https://pypi.python.org/pypi/jsonpath/

    安裝方法:下載 jsonpath,解壓之后執行 'python setup.py install '

    參考文檔

    XPath

    JSONPath

    Result

    /store/book/author

    $.store.book[*].author

    the authors of all books in the store

    //author

    $..author

    all authors

    /store/*

    $.store.*

    all things in store, which are some books and a red bicycle.

    /store//price

    $.store..price

    the price of everything in the store.

    //book[3]

    $..book[2]

    the third book

    //book[last()]

    $..book[(@.length-1)]$..book[-1:]

    the last book in order.

    //book[position()<3]

    $..book[0,1]$..book[:2]

    the first two books

    //book[isbn]

    $..book[?(@.isbn)]

    filter all books with isbn number

    //book[price<10]

    $..book[?(@.price<10)]

    filter all books cheapier than 10

    //*

    $..*

    all Elements in XML document. All members of JSON structure.

    案例

    還是以?http://www.lagou.com/lbs/getAllCitySearchLabels.json?為例,獲取所有城市

    import json import jsonpath import chardet import requestsurl = 'http://www.lagou.com/lbs/getAllCitySearchLabels.json?' custom_headers = {'Host': 'www.lagou.com','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ''(KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36',}response = requests.get(url, verify=False, headers=custom_headers)print(response.status_code) res_Html = response.text json_obj = json.loads(res_Html)city_list = jsonpath.jsonpath(json_obj, '$..name')print(city_list) print(type(city_list)) fp = open('city.json', 'w') content = json.dumps(city_list, ensure_ascii=False) print(content) fp.write(content) fp.close()

    XML

    xmltodict 模塊讓使用 XML 感覺跟操作 JSON 一樣
    Python 操作 XML 的第三方庫參考:https://github.com/martinblech/xmltodict
    模塊安裝:pip install xmltodict

    import json import xmltodictbook_dict = xmltodict.parse("""<bookstore><book><title lang="eng">Harry Potter</title><price>29.99</price></book><book><title lang="eng">Learning XML</title><price>39.95</price></book></bookstore>""")print(book_dict.keys()) print(json.dumps(book_dict, indent=4))

    數據提取總結

    • HTML、XML:XPath、CSS選擇器、正則表達式、轉化成 Python 類型(xmltodict)
    • JSON:JSONPath,轉化成 Python 類型進行操作(json類)
    • 其他(js、文本、電話號碼、郵箱地址):正則表達式

    3. 爬蟲實踐篇

    右鍵 ---> 查看源代碼F12? 區別:

    • 右鍵查看源代碼:實質是一個 Get 請求
    • F12 是整個頁面 所有的請求 url 加載完成的頁面

    3.1 案例 1:(?采集 百度貼吧 信息 )

    http://tieba.baidu.com/f?ie=utf-8&kw=%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB&fr=search

    解決問題思路:

    • 1. 確認需求數據在哪。右鍵查看源代碼
    • 2. Fidder 模擬發送數據

    代碼示例:https://cuiqingcai.com/993.html

    3.2 ?案例 2:(?惠州市網上掛牌交易系統? )

    為例:http://www.hdgtjy.com/index/Index4/? ?采集所有的掛牌交易信息

    import json import requestsdef crawl():url = 'http://www.hdgtjy.com/Index/PublicResults'custom_headers = {'X-Requested-With': 'XMLHttpRequest','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ''(KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36','Content-Type': 'application/x-www-form-urlencoded',}form_data = {'page': 1,'size': 500}r = requests.post(url=url, data=form_data, headers=custom_headers)if 200 == r.status_code:json_string = r.textjson_dict = json.loads(json_string)print(json.dumps(json_dict, ensure_ascii=False, indent=4))else:print(f'status_code:{r.status_code}')if __name__ == '__main__':crawl()pass

    3.3 案例 3:(?Requests 基本用法 與 藥品監督管理局 )

    Requests

    優點:Requests 繼承了 urllib2 的所有特性。Requests 支持 HTTP 連接保持和連接池,支持使用 cookie 保持會話,支持文件上傳,支持自動確定響應內容的編碼,支持國際化的 URL 和 POST 數據自動編碼。
    缺陷:requests 不是 python 自帶的庫,需要另外安裝 easy_install or pip install。直接使用不能異步調用,速度慢(自動確定響應內容的編碼)。pip install requests

    文檔:http://cn.python-requests.org/zh_CN/latest/index.html? ??http://www.python-requests.org/en/master/#

    使用方法:

    requests.get(url, data={'key1': 'value1'},headers={'User-agent','Mozilla/5.0'}) requests.post(url, data={'key1': 'value1'},headers={'content-type': 'application/json'})

    藥品監督管理局 為例,采集 藥品 --->?國產藥品 下的所有的商品信息:http://app1.nmpa.gov.cn/data_nmpa/face3/base.jsp?tableId=25&tableName=TABLE25&title=國產藥品&bcId=152904713761213296322795806604

    # -*- coding: utf-8 -*- import urllib from lxml import etree import re import json import chardet import requestscurstart = 2values = {'tableId': '32','State': '1','bcId': '124356639813072873644420336632','State': '1','tableName': 'TABLE32','State': '1','viewtitleName': 'COLUMN302','State': '1','viewsubTitleName': 'COLUMN299,COLUMN303','State': '1','curstart': str(curstart),'State': '1','tableView': urllib.quote("國產藥品商品名"),'State': '1', }post_headers = {'Content-Type': 'application/x-www-form-urlencoded','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36' } url = "http://app1.sfda.gov.cn/datasearch/face3/search.jsp"response = requests.post(url, data=values, headers=post_headers)resHtml = response.text print response.status_code # print resHtmlUrls = re.findall(r'callbackC,\'(.*?)\',null', resHtml) for url in Urls:# 坑print url.encode('gb2312')

    查看運行結果,感受一下。?

    總結

    1. User-Agent 偽裝 Chrome,欺騙 web 服務器
    2. urlencode 字典類型 Dict、元祖 轉化成 url query 字符串

    1. 完成商品詳情頁采集
    2. 完成整個項目的采集

    詳情頁

    # -*- coding: utf-8 -*- from lxml import etree import re import json import requestsurl ='http://app1.sfda.gov.cn/datasearch/face3/content.jsp?tableId=32&tableName=TABLE32&tableView=%B9%FA%B2%FA%D2%A9%C6%B7%C9%CC%C6%B7%C3%FB&Id=211315' get_headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36','Connection': 'keep-alive', } item = {} response = requests.get(url,headers=get_headers) resHtml = response.text print response.encoding html = etree.HTML(resHtml) for site in html.xpath('//tr')[1:]:if len(site.xpath('./td'))!=2:continuename = site.xpath('./td')[0].textif not name:continue# value =site.xpath('./td')[1].textvalue = re.sub('<.*?>', '', etree.tostring(site.xpath('./td')[1],encoding='utf-8'))item[name.encode('utf-8')] = valuejson.dump(item,open('sfda.json','w'),ensure_ascii=False)

    完整項目

    # -*- coding: utf-8 -*- import urllib from lxml import etree import re import json import requestsdef ParseDetail(url):# url = 'http://app1.sfda.gov.cn/datasearch/face3/content.jsp?tableId=32&tableName=TABLE32&tableView=%B9%FA%B2%FA%D2%A9%C6%B7%C9%CC%C6%B7%C3%FB&Id=211315'get_headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36','Connection': 'keep-alive',}item = {}response = requests.get(url, headers=get_headers)resHtml = response.textprint response.encodinghtml = etree.HTML(resHtml)for site in html.xpath('//tr')[1:]:if len(site.xpath('./td')) != 2:continuename = site.xpath('./td')[0].textif not name:continue# value =site.xpath('./td')[1].textvalue = re.sub('<.*?>', '', etree.tostring(site.xpath('./td')[1], encoding='utf-8'))value = re.sub('', '', value)item[name.encode('utf-8').strip()] = value.strip()# json.dump(item, open('sfda.json', 'a'), ensure_ascii=False)fp = open('sfda.json', 'a')str = json.dumps(item, ensure_ascii=False)fp.write(str + '\n')fp.close()def main():curstart = 2values = {'tableId': '32','State': '1','bcId': '124356639813072873644420336632','State': '1','tableName': 'TABLE32','State': '1','viewtitleName': 'COLUMN302','State': '1','viewsubTitleName': 'COLUMN299,COLUMN303','State': '1','curstart': str(curstart),'State': '1','tableView': urllib.quote("國產藥品商品名"),'State': '1',}post_headers = {'Content-Type': 'application/x-www-form-urlencoded','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'}url = "http://app1.sfda.gov.cn/datasearch/face3/search.jsp"response = requests.post(url, data=values, headers=post_headers)resHtml = response.textprint response.status_code# print resHtmlUrls = re.findall(r'callbackC,\'(.*?)\',null', resHtml)for url in Urls:# 坑url = re.sub('tableView=.*?&', 'tableView=' + urllib.quote("國產藥品商品名") + "&", url)ParseDetail('http://app1.sfda.gov.cn/datasearch/face3/' + url.encode('gb2312'))if __name__ == '__main__':main()

    3.4 案例 4:(?拉鉤招聘網 )

    以拉鉤具體詳情頁為例,進行抓取。http://www.lagou.com/jobs/2101463.html

    from lxml import etree import requests import reresponse = requests.get('http://www.lagou.com/jobs/2101463.html') resHtml = response.texthtml = etree.HTML(resHtml)title = html.xpath('//h1[@title]')[0].attrib['title'] #salary= html.xpath('//span[@class="red"]')[0].textsalary = html.xpath('//dd[@class="job_request"]/p/span')[0].text worklocation = html.xpath('//dd[@class="job_request"]/p/span')[1].text experience = html.xpath('//dd[@class="job_request"]/p/span')[2].text education = html.xpath('//dd[@class="job_request"]/p/span')[3].text worktype = html.xpath('//dd[@class="job_request"]/p/span')[4].text Temptation = html.xpath('//dd[@class="job_request"]/p[2]')[0].textprint salary,worklocation,experience,education,worktype,Temptationdescription_tag = html.xpath('//dd[@class="job_bt"]')[0] description = etree.tostring( description_tag,encoding='utf-8') #print description deal_descp = re.sub('<.*?>','',description) print deal_descp.strip() publisher_name = html.xpath('//*[@class="publisher_name"]//@title')[0] pos = html.xpath('//*[@class="pos"]')[0].text chuli_lv = html.xpath('//*[@class="data"]')[0].text chuli_yongshi = html.xpath('//*[@class="data"]')[1].textprint chuli_lv,chuli_yongshi,pos,publisher_name

    3.5?案例 5:(?爬取糗事百科段子 )

    確定URL并抓取頁面代碼,首先我們確定好頁面的URL是 http://www.qiushibaike.com/8hr/page/4, 其中最后一個數字1代表頁數,我們可以傳入不同的值來獲得某一頁的段子內容。我們初步構建如下的代碼來打印頁面代碼內容試試看,先構造最基本的頁面抓取方式,看看會不會成功。在Composer raw 模擬發送數據

    GET http://www.qiushibaike.com/8hr/page/2/ HTTP/1.1 Host: www.qiushibaike.com User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Accept-Language: zh-CN,zh;q=0.8

    在刪除了 User-Agent、Accept-Language 報錯。應該是 headers 驗證的問題,加上一個 headers 驗證試試看

    # -*- coding:utf-8 -*- import urllib import requests import re import chardet from lxml import etreepage = 2 url = 'http://www.qiushibaike.com/8hr/page/' + str(page) + "/" headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36','Accept-Language': 'zh-CN,zh;q=0.8'} try:response = requests.get(url, headers=headers)resHtml = response.texthtml = etree.HTML(resHtml)result = html.xpath('//div[contains(@id,"qiushi_tag")]')for site in result:#print etree.tostring(site,encoding='utf-8')item = {}imgUrl = site.xpath('./div/a/img/@src')[0].encode('utf-8')username = site.xpath('./div/a/@title')[0].encode('utf-8')#username = site.xpath('.//h2')[0].textcontent = site.xpath('.//div[@class="content"]')[0].text.strip().encode('utf-8')vote = site.xpath('.//i')[0].text#print site.xpath('.//*[@class="number"]')[0].textcomments = site.xpath('.//i')[1].textprint imgUrl, username, content, vote, commentsexcept Exception, e:print e

    多線程爬蟲 實戰:糗事百科

    python 下多線程的思考

    Queue 是 python 中的標準庫,可以直接 import Queue 引用; 隊列是線程間最常用的交換數據的形式。對于共享資源,加鎖是個重要的環節。因為 python 原生的 list,dict 等,都是 not thread safe 的。而 Queue,是線程安全的,因此在滿足使用條件下,建議使用隊列。

    Python Queue 模塊有三種隊列及構造函數:

    1、Python Queue模塊的FIFO隊列先進先出。 class Queue.Queue(maxsize) 2、LIFO類似于堆,即先進后出。 class Queue.LifoQueue(maxsize) 3、還有一種是優先級隊列級別越低越先出來。 class Queue.PriorityQueue(maxsize)

    Queue(隊列對象)

    初始化: class Queue.Queue(maxsize) FIFO 先進先出

    包中的常用方法:

    Queue.qsize() 返回隊列的大小 Queue.empty() 如果隊列為空,返回True,反之False Queue.full() 如果隊列滿了,返回True,反之False Queue.full 與 maxsize 大小對應 Queue.get([block[, timeout]])獲取隊列,timeout等待時間

    調用隊列對象的 get()方法從隊頭刪除并返回一個項目??蛇x參數為block,默認為True。
    如果隊列為空且 block 為 True,get() 就使調用線程暫停,直至有項目可用。
    如果隊列為空且 block 為 False,隊列將引發 Empty 異常。

    import Queue # 創建一個“隊列”對象 myqueue = Queue.Queue(maxsize = 10)# 將一個值放入隊列中 myqueue.put(10)# 將一個值從隊列中取出 myqueue.get()

    示例代碼:

    # -*- coding:utf-8 -*- import requests from lxml import etree from Queue import Queue import threading import time import jsonclass thread_crawl(threading.Thread):'''抓取線程類'''def __init__(self, threadID, q):threading.Thread.__init__(self)self.threadID = threadIDself.q = qdef run(self):print "Starting " + self.threadIDself.qiushi_spider()print "Exiting ", self.threadIDdef qiushi_spider(self):# page = 1while True:if self.q.empty():breakelse:page = self.q.get()print 'qiushi_spider=', self.threadID, ',page=', str(page)url = 'http://www.qiushibaike.com/hot/page/' + str(page) + '/'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36','Accept-Language': 'zh-CN,zh;q=0.8'}# 多次嘗試失敗結束、防止死循環timeout = 4while timeout > 0:timeout -= 1try:content = requests.get(url, headers=headers)data_queue.put(content.text)breakexcept Exception, e:print 'qiushi_spider', eif timeout < 0:print 'timeout', urlclass Thread_Parser(threading.Thread):'''頁面解析類;'''def __init__(self, threadID, queue, lock, f):threading.Thread.__init__(self)self.threadID = threadIDself.queue = queueself.lock = lockself.f = fdef run(self):print 'starting ', self.threadIDglobal total, exitFlag_Parserwhile not exitFlag_Parser:try:'''調用隊列對象的get()方法從隊頭刪除并返回一個項目??蛇x參數為block,默認為True。如果隊列為空且block為True,get()就使調用線程暫停,直至有項目可用。如果隊列為空且block為False,隊列將引發Empty異常。'''item = self.queue.get(False)if not item:passself.parse_data(item)self.queue.task_done()print 'Thread_Parser=', self.threadID, ',total=', totalexcept:passprint 'Exiting ', self.threadIDdef parse_data(self, item):'''解析網頁函數:param item: 網頁內容:return:'''global totaltry:html = etree.HTML(item)result = html.xpath('//div[contains(@id,"qiushi_tag")]')for site in result:try:imgUrl = site.xpath('.//img/@src')[0]title = site.xpath('.//h2')[0].textcontent = site.xpath('.//div[@class="content"]')[0].text.strip()vote = Nonecomments = Nonetry:vote = site.xpath('.//i')[0].textcomments = site.xpath('.//i')[1].textexcept:passresult = {'imgUrl': imgUrl,'title': title,'content': content,'vote': vote,'comments': comments,}with self.lock:# print 'write %s' % json.dumps(result)self.f.write(json.dumps(result, ensure_ascii=False).encode('utf-8') + "\n")except Exception, e:print 'site in result', eexcept Exception, e:print 'parse_data', ewith self.lock:total += 1data_queue = Queue() exitFlag_Parser = False lock = threading.Lock() total = 0def main():output = open('qiushibaike.json', 'a')#初始化網頁頁碼page從1-10個頁面pageQueue = Queue(50)for page in range(1, 11):pageQueue.put(page)#初始化采集線程crawlthreads = []crawlList = ["crawl-1", "crawl-2", "crawl-3"]for threadID in crawlList:thread = thread_crawl(threadID, pageQueue)thread.start()crawlthreads.append(thread)#初始化解析線程parserListparserthreads = []parserList = ["parser-1", "parser-2", "parser-3"]#分別啟動parserListfor threadID in parserList:thread = Thread_Parser(threadID, data_queue, lock, output)thread.start()parserthreads.append(thread)# 等待隊列清空while not pageQueue.empty():pass# 等待所有線程完成for t in crawlthreads:t.join()while not data_queue.empty():pass# 通知線程是時候退出global exitFlag_ParserexitFlag_Parser = Truefor t in parserthreads:t.join()print "Exiting Main Thread"with lock:output.close()if __name__ == '__main__':main()

    3.5 模擬登陸 及 驗證碼

    使用表單登陸

    這種情況屬于 post 請求,即先向服務器發送表單數據,服務器再將返回的 cookie 存入本地。

    data = {'data1':'XXXXX', 'data2':'XXXXX'}

    Requests:data 為 dict,json

    import requestsresponse = requests.post(url=url, data=data)

    使用 cookie 登陸

    使用 cookie 登陸,服務器會認為你是一個已登陸的用戶,所以就會返回給你一個已登陸的內容。因此,需要驗證碼的情況可以使用帶驗證碼登陸的 cookie 解決。

    import requests requests_session = requests.session() response = requests_session.post(url=url_login, data=data)

    若存在驗證碼,此時采用 response = requests_session.post(url=url_login, data=data)是不行的,做法應該如下:

    response_captcha = requests_session.get(url=url_login, cookies=cookies) response1 = requests.get(url_login) # 未登陸 response2 = requests_session.get(url_login) # 已登陸,因為之前拿到了Response Cookie! response3 = requests_session.get(url_results) # 已登陸,因為之前拿到了Response Cookie!

    實戰項目:登錄豆瓣,并發表動態

    模擬登陸的重點,在于找到表單真實的提交地址,然后攜帶cookie,post數據即可,只要登陸成功,我們就可以訪問其他任意網頁,從而獲取網頁內容。

    一個請求,只要正確模擬了method,url,header,body 這四要素,任何內容都能抓下來,而所有的四個要素,只要打開瀏覽器-審查元素-Network就能看到!

    驗證碼這一塊,現在主要是先把驗證碼的圖片保存下來,手動輸入驗證碼,后期可以研究下 python 自動識別驗證碼。

    但是驗證碼保存成本地圖片,看的不不太清楚(有時間在改下),可以把驗證碼的 url 地址在瀏覽器中打開,就可以看清楚驗證碼了。

    主要實現 登錄豆瓣,并發表一句話

    # -*- coding:utf-8 -*-import re import requests from bs4 import BeautifulSoupclass DouBan(object):def __init__(self):self.__username = "豆瓣帳號" # 豆瓣帳號self.__password = "豆瓣密碼" # 豆瓣密碼self.__main_url = "https://www.douban.com"self.__login_url = "https://www.douban.com/accounts/login"self.__proxies = {"http": "http://172.17.18.80:8080","https": "https://172.17.18.80:8080"}self.__headers = {"Host": "www.douban.com","Origin": self.__main_url,"Referer": self.__main_url,"Upgrade-Insecure-Requests": "1","User-Agent": 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 ''(KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}self.__data = {"source": "index_nav","redir": "https://www.douban.com","form_email": self.__username,"form_password": self.__password,"login": u"登錄"}self.__session = requests.session()self.__session.headers = self.__headersself.__session.proxies = self.__proxiespassdef login(self):r = self.__session.post(self.__login_url, self.__data)if r.status_code == 200:html = r.textsoup = BeautifulSoup(html, "lxml")captcha_address = soup.find('img', id='captcha_image')['src']print(captcha_address) # 驗證碼存在if captcha_address:# 利用正則表達式獲取captcha的IDre_captcha_id = r'<input type="hidden" name="captcha-id" value="(.*?)"/'captcha_id = re.findall(re_captcha_id, html)[0]print(captcha_id) # 保存到本地with open('captcha.jpg', 'w') as f:f.write(requests.get(captcha_address, proxies=self.__proxies).text)captcha = input('please input the captcha:')self.__data['captcha-solution'] = captchaself.__data['captcha-id'] = captcha_idr = self.__session.post(self.__login_url, data=self.__data)if r.status_code == 200:print("login success") data = {"ck": "NBJ2","comment": "模擬登錄"}r = self.__session.post(self.__main_url, data=data)print(r.status_code) else:print("登錄不需要驗證碼") # 不需要驗證碼的邏輯 和 上面輸入驗證碼之后 的 邏輯 一樣# 此處代碼省略else:print("login fail", r.status_code) passif __name__ == "__main__":t = DouBan()t.login()pass

    運行截圖:

    登錄豆瓣帳號,可以看到說了一句話 “模擬登錄”

    Python 性能優化

    因為 GIL 的存在,Python很難充分利用多核 CPU 的優勢。

    但是,可以通過內置的模塊 multiprocessing 實現下面幾種并行模式:

    • 1、 多進程并行編程:對于CPU密集型的程序,可以使用multiprocessing的Process、Pool 等封裝好的類,通過多進程的方式實現并行計算。但是因為進程中的通信成本比較大,對于進程之間需要大量數據交互的程序效率未必有大的提高。
    • 2、 多線程并行編程:對于IO密集型的程序,multiprocessing.dummy 模塊使用 multiprocessing 的接口封裝 threading,使得多線程編程也變得非常輕松(比如可以使用Pool的map接口,簡潔高效)。
    • 3、分布式:multiprocessing 中的 Managers 類 提供了可以在不同進程之共享數據的方式,可以在此基礎上開發出分布式的程序。 不同的業務場景可以選擇其中的一種或幾種的組合實現程序性能的優化。

    總結

    以上是生活随笔為你收集整理的爬虫教程( 1 ) --- 初级、基础、实践的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    亚洲综合精品香蕉久久网 | 日本高清一区免费中文视频 | 色偷偷人人澡人人爽人人模 | 精品久久久无码中文字幕 | 国产无遮挡吃胸膜奶免费看 | 欧美国产日韩亚洲中文 | 成人动漫在线观看 | 精品乱子伦一区二区三区 | 最新国产乱人伦偷精品免费网站 | 亚洲精品国产精品乱码不卡 | 久久久精品国产sm最大网站 | 国产亚洲精品久久久久久久久动漫 | 亚洲中文字幕成人无码 | 1000部啪啪未满十八勿入下载 | 国产va免费精品观看 | 精品国产av色一区二区深夜久久 | 无码人妻出轨黑人中文字幕 | 成人av无码一区二区三区 | 大色综合色综合网站 | 国产精品第一区揄拍无码 | 免费中文字幕日韩欧美 | 在线 国产 欧美 亚洲 天堂 | 欧美性猛交内射兽交老熟妇 | 蜜桃视频插满18在线观看 | 亚洲一区av无码专区在线观看 | 国产片av国语在线观看 | 无码成人精品区在线观看 | 亚洲国产精品一区二区美利坚 | 亚洲精品国产精品乱码视色 | 香蕉久久久久久av成人 | 日产国产精品亚洲系列 | 四虎永久在线精品免费网址 | 欧洲熟妇色 欧美 | 狠狠色欧美亚洲狠狠色www | 国产猛烈高潮尖叫视频免费 | 一本色道久久综合亚洲精品不卡 | 丁香花在线影院观看在线播放 | www国产亚洲精品久久久日本 | 熟妇激情内射com | 国产又粗又硬又大爽黄老大爷视 | 大地资源网第二页免费观看 | 97久久精品无码一区二区 | 久久午夜夜伦鲁鲁片无码免费 | 久久亚洲国产成人精品性色 | 精品偷自拍另类在线观看 | 国内精品人妻无码久久久影院蜜桃 | 日本爽爽爽爽爽爽在线观看免 | 国产午夜手机精彩视频 | 女人和拘做爰正片视频 | 夜先锋av资源网站 | 午夜性刺激在线视频免费 | 国精产品一品二品国精品69xx | 久久久精品人妻久久影视 | 波多野结衣高清一区二区三区 | 亚洲自偷自偷在线制服 | 精品无码一区二区三区爱欲 | 国产内射爽爽大片视频社区在线 | 久久精品中文闷骚内射 | 精品亚洲韩国一区二区三区 | 亚洲娇小与黑人巨大交 | 欧美老妇交乱视频在线观看 | av无码久久久久不卡免费网站 | 国产在线无码精品电影网 | 一本大道久久东京热无码av | 蜜桃视频韩日免费播放 | 樱花草在线社区www | 亚洲熟妇色xxxxx欧美老妇 | 色窝窝无码一区二区三区色欲 | 亚洲国产精品一区二区第一页 | 性色av无码免费一区二区三区 | 伊人色综合久久天天小片 | 中文字幕乱码亚洲无线三区 | 一本色道久久综合狠狠躁 | 精品人妻人人做人人爽夜夜爽 | 国产在线无码精品电影网 | 又湿又紧又大又爽a视频国产 | 性欧美videos高清精品 | 少妇高潮一区二区三区99 | 99久久人妻精品免费二区 | 玩弄中年熟妇正在播放 | 国产精品人妻一区二区三区四 | 亚洲gv猛男gv无码男同 | 欧美一区二区三区视频在线观看 | 欧美日本精品一区二区三区 | 午夜福利试看120秒体验区 | 亚洲精品美女久久久久久久 | 天天燥日日燥 | 国产精品第一区揄拍无码 | 黑人巨大精品欧美一区二区 | 欧美性猛交xxxx富婆 | 欧美日本免费一区二区三区 | 久久久精品成人免费观看 | 久久久中文久久久无码 | 色妞www精品免费视频 | 久久久中文字幕日本无吗 | 亚洲精品一区三区三区在线观看 | 亚洲中文字幕无码一久久区 | 国产人妻精品午夜福利免费 | 久久97精品久久久久久久不卡 | 免费播放一区二区三区 | 国产又粗又硬又大爽黄老大爷视 | 色综合久久久无码网中文 | 精品亚洲成av人在线观看 | 国产精品手机免费 | 乱人伦人妻中文字幕无码久久网 | 东京无码熟妇人妻av在线网址 | 无码人妻黑人中文字幕 | 久久人人爽人人爽人人片av高清 | 欧美黑人乱大交 | 亚洲色偷偷男人的天堂 | 成人av无码一区二区三区 | www成人国产高清内射 | 九九久久精品国产免费看小说 | 精品久久久无码人妻字幂 | 国产明星裸体无码xxxx视频 | 久久精品中文字幕一区 | 人妻少妇精品无码专区二区 | 一本久久a久久精品亚洲 | 亚洲人亚洲人成电影网站色 | 国产av人人夜夜澡人人爽麻豆 | 亚洲热妇无码av在线播放 | 国产精品亚洲lv粉色 | 免费无码一区二区三区蜜桃大 | 亚洲国产精品毛片av不卡在线 | 少妇人妻偷人精品无码视频 | 亚洲综合在线一区二区三区 | 亚洲色偷偷偷综合网 | 清纯唯美经典一区二区 | 日本大香伊一区二区三区 | 成人影院yy111111在线观看 | 大色综合色综合网站 | 强奷人妻日本中文字幕 | 色一情一乱一伦 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产精品久免费的黄网站 | 亚洲综合另类小说色区 | 亚洲成av人综合在线观看 | 日韩人妻无码中文字幕视频 | aⅴ亚洲 日韩 色 图网站 播放 | 国产激情精品一区二区三区 | 亚洲色成人中文字幕网站 | 97久久精品无码一区二区 | 久久久av男人的天堂 | 99在线 | 亚洲 | 无码免费一区二区三区 | 国产精品毛多多水多 | 少妇一晚三次一区二区三区 | 日日鲁鲁鲁夜夜爽爽狠狠 | 国产熟女一区二区三区四区五区 | 国产无遮挡又黄又爽又色 | 日日天日日夜日日摸 | 香港三级日本三级妇三级 | 亚洲毛片av日韩av无码 | 亚洲成av人影院在线观看 | 免费人成在线视频无码 | 99久久精品午夜一区二区 | 欧美一区二区三区视频在线观看 | 婷婷五月综合激情中文字幕 | 99精品视频在线观看免费 | 无码午夜成人1000部免费视频 | 捆绑白丝粉色jk震动捧喷白浆 | 日本免费一区二区三区最新 | 日韩少妇白浆无码系列 | 欧洲欧美人成视频在线 | 亚洲成av人片在线观看无码不卡 | 无码人妻精品一区二区三区不卡 | 色偷偷人人澡人人爽人人模 | 熟妇女人妻丰满少妇中文字幕 | 男女性色大片免费网站 | 欧美乱妇无乱码大黄a片 | 男女猛烈xx00免费视频试看 | 精品国产一区二区三区四区 | 国产卡一卡二卡三 | 377p欧洲日本亚洲大胆 | 无遮挡啪啪摇乳动态图 | 亚洲中文字幕在线无码一区二区 | 人妻人人添人妻人人爱 | 熟妇激情内射com | 香蕉久久久久久av成人 | 免费观看激色视频网站 | 亚洲区欧美区综合区自拍区 | 人人妻人人澡人人爽欧美精品 | 日本精品高清一区二区 | 国产精品久久久午夜夜伦鲁鲁 | 日本丰满熟妇videos | 啦啦啦www在线观看免费视频 | 国产精品理论片在线观看 | 成人免费无码大片a毛片 | 熟女少妇在线视频播放 | 最近的中文字幕在线看视频 | 亚洲精品一区二区三区在线 | 夜精品a片一区二区三区无码白浆 | 亚洲精品综合五月久久小说 | 一区二区三区乱码在线 | 欧洲 | 久久久婷婷五月亚洲97号色 | 国产人成高清在线视频99最全资源 | √天堂资源地址中文在线 | 精品久久8x国产免费观看 | 国产精品igao视频网 | 97久久国产亚洲精品超碰热 | 色五月丁香五月综合五月 | 亚洲一区二区三区含羞草 | 永久黄网站色视频免费直播 | 精品日本一区二区三区在线观看 | 国内精品人妻无码久久久影院蜜桃 | 好男人www社区 | 亚洲aⅴ无码成人网站国产app | 国产综合色产在线精品 | 伊人久久婷婷五月综合97色 | 亚洲 高清 成人 动漫 | 国产欧美精品一区二区三区 | 日本爽爽爽爽爽爽在线观看免 | 宝宝好涨水快流出来免费视频 | 无码av免费一区二区三区试看 | 成人精品一区二区三区中文字幕 | 精品无码av一区二区三区 | 国产乱码精品一品二品 | 黑人粗大猛烈进出高潮视频 | 国产午夜亚洲精品不卡下载 | 国产亲子乱弄免费视频 | av无码不卡在线观看免费 | 最近的中文字幕在线看视频 | 狠狠色欧美亚洲狠狠色www | aⅴ亚洲 日韩 色 图网站 播放 | 欧美国产日韩久久mv | 国产精品久久久久影院嫩草 | 九月婷婷人人澡人人添人人爽 | 精品国产青草久久久久福利 | 狠狠亚洲超碰狼人久久 | 人人妻人人藻人人爽欧美一区 | 日韩精品一区二区av在线 | aa片在线观看视频在线播放 | 妺妺窝人体色www在线小说 | 在线观看免费人成视频 | 久久视频在线观看精品 | 国产精品久久久久久久9999 | 国产乱子伦视频在线播放 | 久久人人爽人人爽人人片ⅴ | 中文字幕日韩精品一区二区三区 | 4hu四虎永久在线观看 | 国产熟女一区二区三区四区五区 | 国产香蕉尹人综合在线观看 | 亚洲精品成a人在线观看 | 国产精品视频免费播放 | 精品久久久久久亚洲精品 | 国产黑色丝袜在线播放 | 色老头在线一区二区三区 | 人妻少妇被猛烈进入中文字幕 | 一本久久a久久精品vr综合 | 天天躁夜夜躁狠狠是什么心态 | 成人精品天堂一区二区三区 | 自拍偷自拍亚洲精品被多人伦好爽 | 国产一精品一av一免费 | 牲欲强的熟妇农村老妇女 | 色婷婷香蕉在线一区二区 | 久久97精品久久久久久久不卡 | 东京热男人av天堂 | 国产在线一区二区三区四区五区 | 日韩精品a片一区二区三区妖精 | 性生交大片免费看女人按摩摩 | 亚洲s码欧洲m码国产av | 澳门永久av免费网站 | 大屁股大乳丰满人妻 | 成人无码视频免费播放 | 日本精品人妻无码77777 天堂一区人妻无码 | 好爽又高潮了毛片免费下载 | 噜噜噜亚洲色成人网站 | 国产亚洲精品久久久久久久久动漫 | 亚洲天堂2017无码中文 | 国产高清不卡无码视频 | 55夜色66夜色国产精品视频 | 欧美性生交活xxxxxdddd | 婷婷综合久久中文字幕蜜桃三电影 | 精品久久久久久人妻无码中文字幕 | 久久久中文字幕日本无吗 | 性啪啪chinese东北女人 | 国产熟妇另类久久久久 | 久久精品人人做人人综合 | 午夜无码区在线观看 | 一本色道久久综合亚洲精品不卡 | 无码人妻精品一区二区三区下载 | 亚洲国产欧美国产综合一区 | 亚洲综合无码久久精品综合 | 久久精品中文字幕一区 | 波多野结衣一区二区三区av免费 | 国产激情无码一区二区 | 亚洲成在人网站无码天堂 | 无码一区二区三区在线 | 日韩无套无码精品 | 人妻少妇精品久久 | 丰满肥臀大屁股熟妇激情视频 | 色噜噜亚洲男人的天堂 | 领导边摸边吃奶边做爽在线观看 | 国内揄拍国内精品少妇国语 | 无码国内精品人妻少妇 | 18禁黄网站男男禁片免费观看 | 亚洲精品久久久久久久久久久 | 午夜免费福利小电影 | 高中生自慰www网站 | 久久综合九色综合97网 | 人人妻人人澡人人爽欧美一区 | 超碰97人人射妻 | 激情五月综合色婷婷一区二区 | 俺去俺来也www色官网 | 亚洲色成人中文字幕网站 | 对白脏话肉麻粗话av | 亚洲精品国产精品乱码视色 | 正在播放东北夫妻内射 | 久久精品中文闷骚内射 | 国产三级精品三级男人的天堂 | 亚洲人成网站免费播放 | 荫蒂被男人添的好舒服爽免费视频 | 一区二区传媒有限公司 | 亚洲国产欧美日韩精品一区二区三区 | 国产香蕉尹人视频在线 | 97色伦图片97综合影院 | 亚洲 a v无 码免 费 成 人 a v | 人人妻人人澡人人爽欧美精品 | 伊人久久大香线蕉午夜 | 正在播放东北夫妻内射 | 亚洲伊人久久精品影院 | 精品偷自拍另类在线观看 | 领导边摸边吃奶边做爽在线观看 | 久久人人爽人人爽人人片ⅴ | 亚洲中文字幕在线观看 | 纯爱无遮挡h肉动漫在线播放 | 国产手机在线αⅴ片无码观看 | 正在播放老肥熟妇露脸 | 欧美成人午夜精品久久久 | 在线а√天堂中文官网 | 麻豆成人精品国产免费 | 无码国产色欲xxxxx视频 | 无码纯肉视频在线观看 | 东京无码熟妇人妻av在线网址 | 国产电影无码午夜在线播放 | 无码av最新清无码专区吞精 | 亚洲男女内射在线播放 | 国产真人无遮挡作爱免费视频 | 亚洲人成网站色7799 | 秋霞成人午夜鲁丝一区二区三区 | 青青青手机频在线观看 | 捆绑白丝粉色jk震动捧喷白浆 | 扒开双腿疯狂进出爽爽爽视频 | 亲嘴扒胸摸屁股激烈网站 | 人人妻在人人 | 全黄性性激高免费视频 | 日韩人妻无码一区二区三区久久99 | 精品无码国产自产拍在线观看蜜 | 成人影院yy111111在线观看 | 国产麻豆精品一区二区三区v视界 | 在线播放免费人成毛片乱码 | 欧美人与物videos另类 | 国内精品人妻无码久久久影院蜜桃 | 暴力强奷在线播放无码 | 精品熟女少妇av免费观看 | 久久久久成人精品免费播放动漫 | 日日摸日日碰夜夜爽av | av在线亚洲欧洲日产一区二区 | 亚洲色www成人永久网址 | 人人妻人人澡人人爽欧美一区九九 | 亚洲男女内射在线播放 | 青青青手机频在线观看 | 国产电影无码午夜在线播放 | 成人综合网亚洲伊人 | 国产xxx69麻豆国语对白 | 亚洲色大成网站www | 欧美老妇与禽交 | 大乳丰满人妻中文字幕日本 | 日韩av激情在线观看 | 夜精品a片一区二区三区无码白浆 | 99久久久无码国产精品免费 | 亚洲中文字幕无码一久久区 | 女人被男人爽到呻吟的视频 | 2019nv天堂香蕉在线观看 | 亚洲啪av永久无码精品放毛片 | 无套内谢的新婚少妇国语播放 | 成人欧美一区二区三区黑人 | 秋霞成人午夜鲁丝一区二区三区 | 欧美兽交xxxx×视频 | 国产va免费精品观看 | 无码人妻精品一区二区三区不卡 | 暴力强奷在线播放无码 | 草草网站影院白丝内射 | 久久久久成人片免费观看蜜芽 | 亚洲第一网站男人都懂 | 无码一区二区三区在线观看 | 久久精品人人做人人综合试看 | 欧美国产日韩亚洲中文 | 伊人久久大香线蕉午夜 | 日韩无套无码精品 | 丰满少妇女裸体bbw | 97无码免费人妻超级碰碰夜夜 | 国产精品沙发午睡系列 | 蜜桃臀无码内射一区二区三区 | 奇米影视888欧美在线观看 | 国内精品人妻无码久久久影院 | 女人和拘做爰正片视频 | 国产精品亚洲五月天高清 | 伊人久久大香线蕉亚洲 | 99久久久国产精品无码免费 | 水蜜桃av无码 | 久久99精品久久久久婷婷 | 国产午夜视频在线观看 | 久久99国产综合精品 | 国精产品一区二区三区 | 久久精品中文字幕一区 | 日产精品高潮呻吟av久久 | av无码电影一区二区三区 | 九九久久精品国产免费看小说 | 亚洲综合在线一区二区三区 | 99国产精品白浆在线观看免费 | 狠狠cao日日穞夜夜穞av | 麻豆果冻传媒2021精品传媒一区下载 | 亚洲小说图区综合在线 | 久久伊人色av天堂九九小黄鸭 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 撕开奶罩揉吮奶头视频 | 欧美三级不卡在线观看 | 国产精品高潮呻吟av久久 | 全球成人中文在线 | 少妇被粗大的猛进出69影院 | 成人性做爰aaa片免费看不忠 | 欧美国产日韩亚洲中文 | 老头边吃奶边弄进去呻吟 | 亚洲爆乳大丰满无码专区 | 四虎4hu永久免费 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 亚洲日韩一区二区 | 少妇人妻大乳在线视频 | 水蜜桃色314在线观看 | 国产特级毛片aaaaaa高潮流水 | 日本丰满熟妇videos | 超碰97人人做人人爱少妇 | 欧美人与动性行为视频 | 欧洲欧美人成视频在线 | 亚洲va中文字幕无码久久不卡 | 久久久无码中文字幕久... | 久久久久免费精品国产 | 国产成人无码av片在线观看不卡 | 久久国语露脸国产精品电影 | 嫩b人妻精品一区二区三区 | 亚洲精品成人av在线 | 国产精品爱久久久久久久 | 在线a亚洲视频播放在线观看 | 精品厕所偷拍各类美女tp嘘嘘 | 日韩欧美群交p片內射中文 | 亚洲国产精品久久人人爱 | 老熟妇仑乱视频一区二区 | 露脸叫床粗话东北少妇 | 久久久久久国产精品无码下载 | 又黄又爽又色的视频 | 人妻少妇精品视频专区 | 国产成人无码av在线影院 | 中文字幕av伊人av无码av | 国产精品18久久久久久麻辣 | 精品国产青草久久久久福利 | 性色av无码免费一区二区三区 | 欧美性猛交内射兽交老熟妇 | 亚洲中文字幕成人无码 | 少妇人妻偷人精品无码视频 | 久久久久se色偷偷亚洲精品av | 国产av无码专区亚洲a∨毛片 | 亚洲精品午夜无码电影网 | 免费视频欧美无人区码 | 巨爆乳无码视频在线观看 | 蜜桃视频韩日免费播放 | 曰韩无码二三区中文字幕 | 久久精品国产一区二区三区肥胖 | 日本熟妇乱子伦xxxx | 久久婷婷五月综合色国产香蕉 | 亚洲一区二区三区播放 | 欧美人与物videos另类 | 97久久国产亚洲精品超碰热 | 欧美35页视频在线观看 | 久久国产自偷自偷免费一区调 | 日本护士毛茸茸高潮 | 国产精品久久国产精品99 | 亚洲一区二区观看播放 | 国产精品人妻一区二区三区四 | 亚洲国产精品一区二区美利坚 | 亚洲综合精品香蕉久久网 | 漂亮人妻洗澡被公强 日日躁 | 久久久久免费精品国产 | 欧美性生交xxxxx久久久 | 国产真实乱对白精彩久久 | 欧美丰满熟妇xxxx性ppx人交 | 国产精品亚洲专区无码不卡 | 亚洲区欧美区综合区自拍区 | 国产三级精品三级男人的天堂 | 国产乡下妇女做爰 | 小sao货水好多真紧h无码视频 | 色婷婷综合中文久久一本 | 久久亚洲中文字幕无码 | 一二三四在线观看免费视频 | 国产精品亚洲lv粉色 | 国产suv精品一区二区五 | 亚洲乱码中文字幕在线 | 国产精品久久久久久久影院 | 99久久久国产精品无码免费 | 日本乱人伦片中文三区 | 强奷人妻日本中文字幕 | 成人精品一区二区三区中文字幕 | 久久精品99久久香蕉国产色戒 | 黑人巨大精品欧美一区二区 | 熟女俱乐部五十路六十路av | 日欧一片内射va在线影院 | 国产亚洲精品精品国产亚洲综合 | aa片在线观看视频在线播放 | 中文字幕乱码人妻无码久久 | 国产精品永久免费视频 | 女人高潮内射99精品 | 午夜精品一区二区三区的区别 | 亚洲精品美女久久久久久久 | 天天躁日日躁狠狠躁免费麻豆 | 亚洲熟女一区二区三区 | 熟妇女人妻丰满少妇中文字幕 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 久久国语露脸国产精品电影 | 欧美自拍另类欧美综合图片区 | 亚洲天堂2017无码中文 | 亚洲午夜无码久久 | 国产精品无码成人午夜电影 | 最近的中文字幕在线看视频 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 桃花色综合影院 | 日韩少妇内射免费播放 | 无码纯肉视频在线观看 | 成人亚洲精品久久久久软件 | 国产99久久精品一区二区 | 学生妹亚洲一区二区 | 蜜桃视频插满18在线观看 | 人人妻人人澡人人爽欧美精品 | 亚洲精品久久久久久久久久久 | 日本精品久久久久中文字幕 | 婷婷综合久久中文字幕蜜桃三电影 | 色窝窝无码一区二区三区色欲 | 在线精品国产一区二区三区 | 人妻有码中文字幕在线 | 国产做国产爱免费视频 | 国产亚洲视频中文字幕97精品 | 熟妇女人妻丰满少妇中文字幕 | 亚洲第一网站男人都懂 | 亚洲精品美女久久久久久久 | 欧美35页视频在线观看 | 中文毛片无遮挡高清免费 | 乌克兰少妇性做爰 | 久久久av男人的天堂 | 亚洲综合精品香蕉久久网 | 蜜桃视频韩日免费播放 | 国产又爽又黄又刺激的视频 | 国产精品永久免费视频 | 国产莉萝无码av在线播放 | 成年美女黄网站色大免费全看 | 国产成人精品必看 | 久久国产自偷自偷免费一区调 | 两性色午夜免费视频 | 国内精品一区二区三区不卡 | 久久久久se色偷偷亚洲精品av | 国产av一区二区三区最新精品 | 欧美猛少妇色xxxxx | 午夜精品一区二区三区的区别 | 欧美激情一区二区三区成人 | 日本精品少妇一区二区三区 | 欧美色就是色 | 大胆欧美熟妇xx | 国产又粗又硬又大爽黄老大爷视 | 青青久在线视频免费观看 | 国产精品igao视频网 | 老熟妇仑乱视频一区二区 | 青青草原综合久久大伊人精品 | 国产热a欧美热a在线视频 | 久青草影院在线观看国产 | 人人澡人人妻人人爽人人蜜桃 | 丰满岳乱妇在线观看中字无码 | 人妻少妇被猛烈进入中文字幕 | 中文无码成人免费视频在线观看 | 成人精品视频一区二区 | 丰满人妻翻云覆雨呻吟视频 | 无码国内精品人妻少妇 | 色婷婷综合中文久久一本 | 亚洲成a人片在线观看无码 | 亚洲精品一区二区三区在线观看 | 久久人妻内射无码一区三区 | 成人无码影片精品久久久 | 无码任你躁久久久久久久 | 网友自拍区视频精品 | 图片区 小说区 区 亚洲五月 | 国产精品99久久精品爆乳 | 日本熟妇浓毛 | 精品偷拍一区二区三区在线看 | 无码纯肉视频在线观看 | 国产午夜亚洲精品不卡 | 国产精品亚洲五月天高清 | 亚洲一区二区三区在线观看网站 | 国产艳妇av在线观看果冻传媒 | 国产成人精品优优av | 国产亚洲欧美日韩亚洲中文色 | 荫蒂被男人添的好舒服爽免费视频 | 精品厕所偷拍各类美女tp嘘嘘 | 老熟妇乱子伦牲交视频 | 欧美三级不卡在线观看 | 亚洲国产日韩a在线播放 | 久久亚洲国产成人精品性色 | 国产成人综合在线女婷五月99播放 | 午夜性刺激在线视频免费 | 色一情一乱一伦一区二区三欧美 | 色偷偷人人澡人人爽人人模 | 精品国精品国产自在久国产87 | 偷窥村妇洗澡毛毛多 | 狠狠色噜噜狠狠狠7777奇米 | 沈阳熟女露脸对白视频 | 亚洲欧洲无卡二区视頻 | 亚洲精品成人福利网站 | 成人欧美一区二区三区黑人 | 久激情内射婷内射蜜桃人妖 | 亚洲 日韩 欧美 成人 在线观看 | 久久精品国产一区二区三区 | 久久久精品人妻久久影视 | a在线观看免费网站大全 | 无套内谢的新婚少妇国语播放 | 丰满肥臀大屁股熟妇激情视频 | 性生交片免费无码看人 | 免费乱码人妻系列无码专区 | 日本一卡2卡3卡四卡精品网站 | 亚洲区小说区激情区图片区 | 亚洲春色在线视频 | 日日摸日日碰夜夜爽av | 无码人妻精品一区二区三区下载 | 女人被男人躁得好爽免费视频 | www国产精品内射老师 | 中文字幕无线码 | 亚洲va中文字幕无码久久不卡 | 色窝窝无码一区二区三区色欲 | 我要看www免费看插插视频 | 国产成人av免费观看 | 久久精品女人的天堂av | 国产精品毛片一区二区 | 国产精品沙发午睡系列 | 国产欧美亚洲精品a | 久久zyz资源站无码中文动漫 | 亚洲日韩av一区二区三区中文 | 精品无码一区二区三区的天堂 | 人妻互换免费中文字幕 | 中文字幕中文有码在线 | 人人澡人人妻人人爽人人蜜桃 | 综合激情五月综合激情五月激情1 | 亚洲精品一区三区三区在线观看 | 亚洲一区二区三区在线观看网站 | 国产美女极度色诱视频www | 波多野结衣aⅴ在线 | 亚洲精品一区二区三区在线 | 男女作爱免费网站 | 国内老熟妇对白xxxxhd | 中文字幕人妻无码一区二区三区 | 九月婷婷人人澡人人添人人爽 | 精品成在人线av无码免费看 | 久久久精品欧美一区二区免费 | 久久久久久av无码免费看大片 | 午夜肉伦伦影院 | 十八禁视频网站在线观看 | 精品久久久无码人妻字幂 | 欧美老熟妇乱xxxxx | 亚洲成色在线综合网站 | 亚洲天堂2017无码 | 水蜜桃色314在线观看 | 亚洲一区二区三区在线观看网站 | 欧美午夜特黄aaaaaa片 | 色 综合 欧美 亚洲 国产 | 久久精品女人天堂av免费观看 | 国产精品人妻一区二区三区四 | 久久久久久久久蜜桃 | 人妻熟女一区 | 亚洲精品国产品国语在线观看 | 国产精品理论片在线观看 | 久久这里只有精品视频9 | 亚洲日本va中文字幕 | 国产一区二区三区日韩精品 | 99久久婷婷国产综合精品青草免费 | 无套内射视频囯产 | 久久人人爽人人爽人人片av高清 | 人妻插b视频一区二区三区 | 四虎4hu永久免费 | 中文字幕日韩精品一区二区三区 | 国产精品久久国产三级国 | 亚洲狠狠婷婷综合久久 | 久久亚洲国产成人精品性色 | 图片区 小说区 区 亚洲五月 | 成人无码视频在线观看网站 | 久久亚洲精品成人无码 | www国产精品内射老师 | 亚洲中文字幕无码中文字在线 | 久久久亚洲欧洲日产国码αv | 亚洲色在线无码国产精品不卡 | 久久精品人人做人人综合试看 | 在线天堂新版最新版在线8 | 东京一本一道一二三区 | 亚洲熟悉妇女xxx妇女av | 久久久国产精品无码免费专区 | 伊人久久大香线焦av综合影院 | 九九久久精品国产免费看小说 | 亚洲成a人一区二区三区 | 成 人 免费观看网站 | 亚洲熟妇色xxxxx欧美老妇 | 大肉大捧一进一出视频出来呀 | 欧美黑人巨大xxxxx | 清纯唯美经典一区二区 | 欧美性黑人极品hd | 精品久久久无码人妻字幂 | 久9re热视频这里只有精品 | 亚洲精品国产a久久久久久 | 荫蒂被男人添的好舒服爽免费视频 | 成人精品视频一区二区 | 婷婷丁香五月天综合东京热 | 无码人妻精品一区二区三区不卡 | 亚洲精品中文字幕乱码 | 无人区乱码一区二区三区 | 亚洲精品国产精品乱码视色 | 丰满人妻一区二区三区免费视频 | 特级做a爰片毛片免费69 | 偷窥村妇洗澡毛毛多 | 亚洲爆乳大丰满无码专区 | 装睡被陌生人摸出水好爽 | 国产精品亚洲五月天高清 | 一本精品99久久精品77 | 久久五月精品中文字幕 | 免费无码av一区二区 | 亚洲天堂2017无码中文 | 亚洲综合伊人久久大杳蕉 | 99久久婷婷国产综合精品青草免费 | 国产激情艳情在线看视频 | 久久精品国产日本波多野结衣 | 中国大陆精品视频xxxx | 少妇高潮一区二区三区99 | 7777奇米四色成人眼影 | 中文字幕+乱码+中文字幕一区 | 老司机亚洲精品影院无码 | 色婷婷久久一区二区三区麻豆 | 美女毛片一区二区三区四区 | 欧洲熟妇色 欧美 | 久久久久人妻一区精品色欧美 | 一个人看的视频www在线 | 亚洲s色大片在线观看 | 熟妇人妻无乱码中文字幕 | 少妇性l交大片欧洲热妇乱xxx | 人妻无码αv中文字幕久久琪琪布 | 亚洲日韩av一区二区三区四区 | 欧美肥老太牲交大战 | 国产熟女一区二区三区四区五区 | 无码精品国产va在线观看dvd | 午夜精品久久久久久久 | 18禁黄网站男男禁片免费观看 | 婷婷六月久久综合丁香 | 丝袜美腿亚洲一区二区 | 久久精品丝袜高跟鞋 | 久久精品丝袜高跟鞋 | 高清无码午夜福利视频 | 亚洲欧美日韩成人高清在线一区 | 亚欧洲精品在线视频免费观看 | 岛国片人妻三上悠亚 | 日本一区二区三区免费高清 | 国产特级毛片aaaaaaa高清 | 99精品久久毛片a片 | 一本大道久久东京热无码av | 亚洲精品中文字幕久久久久 | 日韩精品无码免费一区二区三区 | 东京无码熟妇人妻av在线网址 | 国产成人无码区免费内射一片色欲 | 东京热无码av男人的天堂 | 欧美日韩人成综合在线播放 | 久久综合香蕉国产蜜臀av | 牛和人交xxxx欧美 | 日本熟妇大屁股人妻 | 无码人妻丰满熟妇区五十路百度 | 色欲人妻aaaaaaa无码 | 麻豆国产97在线 | 欧洲 | 成人三级无码视频在线观看 | 国产97人人超碰caoprom | 久久精品视频在线看15 | 鲁鲁鲁爽爽爽在线视频观看 | 免费看少妇作爱视频 | 国产精品二区一区二区aⅴ污介绍 | 一二三四在线观看免费视频 | 亚洲欧美国产精品专区久久 | 97久久超碰中文字幕 | 性欧美videos高清精品 | 国产精品亚洲专区无码不卡 | 亚洲va欧美va天堂v国产综合 | 精品亚洲成av人在线观看 | 少妇太爽了在线观看 | 亚洲色大成网站www | 日日碰狠狠丁香久燥 | 欧美日韩色另类综合 | 日本一区二区更新不卡 | a国产一区二区免费入口 | 久久97精品久久久久久久不卡 | 清纯唯美经典一区二区 | 四虎影视成人永久免费观看视频 | 正在播放东北夫妻内射 | 日日夜夜撸啊撸 | 国产麻豆精品精东影业av网站 | 久9re热视频这里只有精品 | 欧洲vodafone精品性 | 亚洲精品鲁一鲁一区二区三区 | 久久国产精品精品国产色婷婷 | 丝袜足控一区二区三区 | 欧美黑人巨大xxxxx | 欧美丰满熟妇xxxx性ppx人交 | 老熟妇乱子伦牲交视频 | 国产日产欧产精品精品app | 久久无码专区国产精品s | 亚拍精品一区二区三区探花 | 亚洲一区二区三区国产精华液 | 亚洲人亚洲人成电影网站色 | 中文字幕乱码人妻无码久久 | 无码人妻出轨黑人中文字幕 | 性欧美牲交xxxxx视频 | 青青草原综合久久大伊人精品 | 国产精品亚洲五月天高清 | 婷婷综合久久中文字幕蜜桃三电影 | 久久成人a毛片免费观看网站 | 国内少妇偷人精品视频免费 | 国产无遮挡又黄又爽又色 | 狂野欧美性猛交免费视频 | 久久久久se色偷偷亚洲精品av | 久久人人爽人人爽人人片ⅴ | 乱码av麻豆丝袜熟女系列 | 少妇厨房愉情理9仑片视频 | 99久久精品午夜一区二区 | 婷婷六月久久综合丁香 | 国产麻豆精品精东影业av网站 | 欧美第一黄网免费网站 | 国产成人人人97超碰超爽8 | 欧美日本免费一区二区三区 | 欧美 丝袜 自拍 制服 另类 | 人人妻人人澡人人爽人人精品浪潮 | 国产精品亚洲lv粉色 | 国产网红无码精品视频 | 国产成人无码午夜视频在线观看 | 97久久国产亚洲精品超碰热 | 奇米影视888欧美在线观看 | 九一九色国产 | 午夜精品一区二区三区的区别 | 亚洲日韩乱码中文无码蜜桃臀网站 | 欧美精品无码一区二区三区 | 亚洲男人av天堂午夜在 | 2020久久超碰国产精品最新 | 精品无码国产一区二区三区av | 中文字幕久久久久人妻 | 亚洲熟妇色xxxxx欧美老妇y | 国产亚洲tv在线观看 | 99久久久无码国产精品免费 | 精品久久久久久亚洲精品 | 国内老熟妇对白xxxxhd | 国内揄拍国内精品人妻 | 欧美日韩综合一区二区三区 | 帮老师解开蕾丝奶罩吸乳网站 | 熟妇人妻无乱码中文字幕 | 久久 国产 尿 小便 嘘嘘 | 国产人妻精品一区二区三区 | 国产成人午夜福利在线播放 | a片在线免费观看 | 久久婷婷五月综合色国产香蕉 | 日本熟妇人妻xxxxx人hd | 亚洲狠狠婷婷综合久久 | 日韩视频 中文字幕 视频一区 | 中文字幕无码人妻少妇免费 | 中文字幕日产无线码一区 | 精品无码国产一区二区三区av | 亚洲va欧美va天堂v国产综合 | 桃花色综合影院 | 激情国产av做激情国产爱 | 久久综合给合久久狠狠狠97色 | 精品一区二区不卡无码av | www国产精品内射老师 | 又大又硬又黄的免费视频 | 成年美女黄网站色大免费全看 | 男人的天堂av网站 | 99久久精品日本一区二区免费 | 色综合天天综合狠狠爱 | 国产偷抇久久精品a片69 | 国产精品99久久精品爆乳 | 在线成人www免费观看视频 | 精品少妇爆乳无码av无码专区 | 国产精品办公室沙发 | 丰满少妇人妻久久久久久 | 亚洲va欧美va天堂v国产综合 | 国产人妻人伦精品1国产丝袜 | 精品欧洲av无码一区二区三区 | 精品国产aⅴ无码一区二区 | 久久久久人妻一区精品色欧美 | 天天综合网天天综合色 | 国产小呦泬泬99精品 | 无码人妻黑人中文字幕 | 亚洲男人av天堂午夜在 | 国产午夜福利亚洲第一 | 国产成人综合美国十次 | 日本va欧美va欧美va精品 | 思思久久99热只有频精品66 | 荫蒂被男人添的好舒服爽免费视频 | 国产在线一区二区三区四区五区 | 18黄暴禁片在线观看 | 国产莉萝无码av在线播放 | 装睡被陌生人摸出水好爽 | 麻豆果冻传媒2021精品传媒一区下载 | 一本久久a久久精品亚洲 | 亚洲最大成人网站 | 性色欲网站人妻丰满中文久久不卡 | 亚洲爆乳大丰满无码专区 | 国产亚洲精品久久久久久久久动漫 | 亚洲成a人一区二区三区 | 欧美大屁股xxxxhd黑色 | 最近中文2019字幕第二页 | 久久久婷婷五月亚洲97号色 | 精品夜夜澡人妻无码av蜜桃 | 欧美日韩人成综合在线播放 | 无人区乱码一区二区三区 | 久久精品一区二区三区四区 | 学生妹亚洲一区二区 | 久久无码专区国产精品s | 小sao货水好多真紧h无码视频 | 麻豆国产97在线 | 欧洲 | 日日干夜夜干 | 欧美xxxxx精品 | 欧美日韩色另类综合 | 免费观看又污又黄的网站 | 亚洲综合在线一区二区三区 | 在线а√天堂中文官网 | 久久久久国色av免费观看性色 | 亚洲熟妇色xxxxx欧美老妇 | 中文字幕乱码亚洲无线三区 | 国产香蕉尹人视频在线 | 国产精品18久久久久久麻辣 | 国产亚洲视频中文字幕97精品 | 国产成人精品必看 | 久久久久se色偷偷亚洲精品av | 亚洲综合无码一区二区三区 | 欧美精品免费观看二区 | 东京热男人av天堂 | 国产无遮挡吃胸膜奶免费看 | 国产成人综合色在线观看网站 | 成人动漫在线观看 | 久热国产vs视频在线观看 | 欧美黑人性暴力猛交喷水 | 精品亚洲韩国一区二区三区 | 亚洲国产精品久久久久久 | 亚洲综合无码一区二区三区 | 波多野结衣一区二区三区av免费 | 国产av一区二区精品久久凹凸 | 欧美 日韩 人妻 高清 中文 | 精品厕所偷拍各类美女tp嘘嘘 | 成人免费视频在线观看 | 兔费看少妇性l交大片免费 | 色欲综合久久中文字幕网 | 亚洲熟妇色xxxxx欧美老妇 | 永久免费精品精品永久-夜色 | 亚洲精品中文字幕 | 中文字幕av无码一区二区三区电影 | 又黄又爽又色的视频 | 在线精品国产一区二区三区 | 天堂亚洲2017在线观看 | 波多野结衣aⅴ在线 | 无码国内精品人妻少妇 | 国产亚洲精品久久久久久 | 人人妻人人藻人人爽欧美一区 | 日韩精品乱码av一区二区 | 中文字幕中文有码在线 | 一本加勒比波多野结衣 | 国产精品丝袜黑色高跟鞋 | 牲交欧美兽交欧美 | 九九热爱视频精品 | 亚洲中文字幕乱码av波多ji | 无码成人精品区在线观看 | 色五月五月丁香亚洲综合网 | 熟女少妇人妻中文字幕 | 国产精品久久精品三级 | 少妇性俱乐部纵欲狂欢电影 | 装睡被陌生人摸出水好爽 | 乱人伦中文视频在线观看 | 午夜无码人妻av大片色欲 | 激情人妻另类人妻伦 | 成人免费无码大片a毛片 | 亚洲日韩一区二区三区 | 日韩精品无码免费一区二区三区 | 狠狠噜狠狠狠狠丁香五月 | 国产成人一区二区三区在线观看 | 无码av岛国片在线播放 | 久久综合狠狠综合久久综合88 | 亚洲精品一区二区三区在线观看 | 色五月丁香五月综合五月 | 国产精品亚洲一区二区三区喷水 | 色婷婷香蕉在线一区二区 | 国产精品高潮呻吟av久久 | 免费无码肉片在线观看 | 日韩人妻无码一区二区三区久久99 | 18无码粉嫩小泬无套在线观看 | 97精品国产97久久久久久免费 | 国产成人无码av一区二区 | 4hu四虎永久在线观看 | 精品久久综合1区2区3区激情 | 小泽玛莉亚一区二区视频在线 | 国色天香社区在线视频 | 久久久久免费看成人影片 | 日韩欧美成人免费观看 | 久久亚洲精品中文字幕无男同 | 免费人成在线视频无码 | 亚洲精品综合一区二区三区在线 | 青青青爽视频在线观看 | 国产色视频一区二区三区 | 99久久人妻精品免费一区 | 久久精品女人的天堂av | 精品偷拍一区二区三区在线看 | 亚洲人成人无码网www国产 | 人人妻人人澡人人爽欧美一区 | 成人试看120秒体验区 | 无码人妻少妇伦在线电影 | 清纯唯美经典一区二区 | 暴力强奷在线播放无码 | 欧美人与动性行为视频 | 久久亚洲日韩精品一区二区三区 | 亚洲色欲久久久综合网东京热 | 久久天天躁狠狠躁夜夜免费观看 | 国产精品无码一区二区三区不卡 | 成人三级无码视频在线观看 | 99re在线播放 | 麻豆av传媒蜜桃天美传媒 | 欧美丰满熟妇xxxx | 男女猛烈xx00免费视频试看 | 国产亚洲精品久久久久久 | 精品国产一区av天美传媒 | 福利一区二区三区视频在线观看 | 日韩少妇内射免费播放 | 欧美丰满熟妇xxxx | 男女超爽视频免费播放 | 欧美一区二区三区 | 九月婷婷人人澡人人添人人爽 | 无码人妻黑人中文字幕 | 国产乱子伦视频在线播放 | 老熟女重囗味hdxx69 | 国产精品无码一区二区三区不卡 | 激情内射日本一区二区三区 | 亚洲色欲色欲天天天www | 日产国产精品亚洲系列 | 久久午夜夜伦鲁鲁片无码免费 | 小泽玛莉亚一区二区视频在线 | 伊人久久大香线蕉av一区二区 | 丰满少妇弄高潮了www | 免费国产黄网站在线观看 | 久久亚洲精品中文字幕无男同 | 国产sm调教视频在线观看 | 九九综合va免费看 | 国产精品亚洲专区无码不卡 | 一本色道久久综合狠狠躁 | 狠狠色噜噜狠狠狠7777奇米 | 久久精品国产日本波多野结衣 | 青青青手机频在线观看 | 欧美阿v高清资源不卡在线播放 | 内射欧美老妇wbb | 亚洲成熟女人毛毛耸耸多 | 精品熟女少妇av免费观看 | 中文字幕久久久久人妻 | 亚洲理论电影在线观看 | 丁香啪啪综合成人亚洲 | 鲁大师影院在线观看 | 久9re热视频这里只有精品 | 久久久久亚洲精品男人的天堂 | 色综合天天综合狠狠爱 | 无码一区二区三区在线观看 | 九九热爱视频精品 | 内射后入在线观看一区 | 久久综合狠狠综合久久综合88 | 国产精品久久久久影院嫩草 | 美女黄网站人色视频免费国产 | 国产97在线 | 亚洲 | 久久久久久久久蜜桃 | 成人免费视频在线观看 | 小鲜肉自慰网站xnxx | 伊人久久婷婷五月综合97色 | 国产午夜精品一区二区三区嫩草 | 欧美猛少妇色xxxxx | 清纯唯美经典一区二区 | 久久精品人人做人人综合试看 | 好屌草这里只有精品 | 中文字幕无码视频专区 | 亚洲欧美色中文字幕在线 | 亚洲热妇无码av在线播放 | 免费人成在线观看网站 | 久久精品人妻少妇一区二区三区 | 少妇性荡欲午夜性开放视频剧场 | 少妇被黑人到高潮喷出白浆 | 亚洲熟妇自偷自拍另类 | 一本久道久久综合婷婷五月 | 乱人伦人妻中文字幕无码久久网 | 国产精品第一区揄拍无码 | 无码帝国www无码专区色综合 | 中文字幕无线码免费人妻 | 曰韩无码二三区中文字幕 | 亚洲 a v无 码免 费 成 人 a v | 激情内射亚州一区二区三区爱妻 | 综合网日日天干夜夜久久 | 国产亚洲美女精品久久久2020 | 国产精品99久久精品爆乳 | 成 人影片 免费观看 | 国内精品一区二区三区不卡 | 国产人成高清在线视频99最全资源 | 两性色午夜免费视频 | 十八禁视频网站在线观看 | 欧美日韩亚洲国产精品 | 天天摸天天透天天添 | 国产一区二区三区日韩精品 | 久久99精品久久久久婷婷 | 一区二区三区乱码在线 | 欧洲 | 无码吃奶揉捏奶头高潮视频 | 少妇的肉体aa片免费 | 精品久久久无码中文字幕 | 日韩精品成人一区二区三区 | 亚洲成av人影院在线观看 | av无码不卡在线观看免费 | 人妻少妇被猛烈进入中文字幕 | 久久综合九色综合欧美狠狠 | 成人性做爰aaa片免费看 | 精品欧美一区二区三区久久久 | 麻豆蜜桃av蜜臀av色欲av | 综合网日日天干夜夜久久 | 无码人妻精品一区二区三区不卡 | 国产午夜手机精彩视频 | 国产av人人夜夜澡人人爽麻豆 | 人妻中文无码久热丝袜 | 波多野结衣高清一区二区三区 | 无码人妻精品一区二区三区下载 | 国产农村妇女高潮大叫 | 久久 国产 尿 小便 嘘嘘 | 人人妻人人澡人人爽人人精品 | 一区二区三区乱码在线 | 欧洲 | 国产乱子伦视频在线播放 | 亚洲aⅴ无码成人网站国产app | 国产成人无码区免费内射一片色欲 | 真人与拘做受免费视频一 | 一本久道久久综合狠狠爱 | 国产熟妇另类久久久久 | 国内少妇偷人精品视频免费 | 国产精品亚洲综合色区韩国 | 性欧美牲交在线视频 | 图片小说视频一区二区 | 国产小呦泬泬99精品 | 亚洲区小说区激情区图片区 | 亚洲精品午夜国产va久久成人 | 中文字幕+乱码+中文字幕一区 | 成人免费视频视频在线观看 免费 | 东京无码熟妇人妻av在线网址 | 中国大陆精品视频xxxx | 给我免费的视频在线观看 | 亚洲 a v无 码免 费 成 人 a v | 最新版天堂资源中文官网 | 国产福利视频一区二区 | 性生交大片免费看女人按摩摩 | 成人试看120秒体验区 | 国产免费无码一区二区视频 | 强伦人妻一区二区三区视频18 | 免费国产成人高清在线观看网站 | 久久久国产一区二区三区 | 久久久亚洲欧洲日产国码αv | 一个人免费观看的www视频 | 久久亚洲中文字幕无码 | 日韩在线不卡免费视频一区 | 亚洲综合久久一区二区 | 天堂亚洲2017在线观看 | 欧美乱妇无乱码大黄a片 | 国产人妻人伦精品 | 精品久久8x国产免费观看 | 国产亚洲tv在线观看 | 亚洲乱码日产精品bd | 中文精品久久久久人妻不卡 | 亚洲小说图区综合在线 | 中文字幕乱码亚洲无线三区 | 最新版天堂资源中文官网 | 久久精品99久久香蕉国产色戒 | 亚洲а∨天堂久久精品2021 | 精品久久综合1区2区3区激情 | 精品久久久无码中文字幕 | 黑人粗大猛烈进出高潮视频 | 亚无码乱人伦一区二区 | 1000部啪啪未满十八勿入下载 | 久久久亚洲欧洲日产国码αv | 乌克兰少妇xxxx做受 | 亚洲综合无码久久精品综合 | 97色伦图片97综合影院 | 少女韩国电视剧在线观看完整 | 色欲久久久天天天综合网精品 | 精品无码一区二区三区爱欲 | 国产无套内射久久久国产 | 国产精品亚洲专区无码不卡 | 老子影院午夜精品无码 | 久久久成人毛片无码 | 国产成人av免费观看 | 成年美女黄网站色大免费视频 | 国产在线精品一区二区高清不卡 | 东京一本一道一二三区 | 日韩av无码一区二区三区不卡 | 内射巨臀欧美在线视频 | 久久精品女人天堂av免费观看 | 成人一区二区免费视频 | 国产人妻精品一区二区三区不卡 | 成人免费无码大片a毛片 | 亚洲国产精品久久久天堂 | 欧美人妻一区二区三区 | 国产精品福利视频导航 | 亚洲欧美日韩国产精品一区二区 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 精品国产一区二区三区四区 | 熟妇人妻无码xxx视频 | 精品欧美一区二区三区久久久 | 国产精品资源一区二区 | 在线a亚洲视频播放在线观看 | 成在人线av无码免费 | 无码任你躁久久久久久久 | 久久五月精品中文字幕 | 秋霞特色aa大片 | 国产绳艺sm调教室论坛 | 又湿又紧又大又爽a视频国产 | 国内少妇偷人精品视频免费 | 欧美精品一区二区精品久久 | 性欧美牲交xxxxx视频 | 高潮毛片无遮挡高清免费视频 | 久久久久久a亚洲欧洲av冫 | 国产精品99久久精品爆乳 | 精品一区二区三区无码免费视频 | 国产乱人偷精品人妻a片 | 我要看www免费看插插视频 | 日日摸夜夜摸狠狠摸婷婷 | 中文字幕色婷婷在线视频 | 亚洲精品中文字幕乱码 | 国产无套内射久久久国产 | 四虎影视成人永久免费观看视频 | 亚洲a无码综合a国产av中文 | 98国产精品综合一区二区三区 | 国产亚洲精品久久久久久久 | 亚洲欧美日韩成人高清在线一区 | 国产无遮挡又黄又爽免费视频 | 欧美一区二区三区 | 欧美熟妇另类久久久久久不卡 | 久久伊人色av天堂九九小黄鸭 | 天堂а√在线中文在线 | 性生交大片免费看女人按摩摩 | 中文字幕精品av一区二区五区 | 亚洲人成网站在线播放942 | 成人一在线视频日韩国产 | 无码人妻丰满熟妇区毛片18 | 国产精品18久久久久久麻辣 | 四虎永久在线精品免费网址 | 日本大乳高潮视频在线观看 | 免费无码av一区二区 | 欧美人妻一区二区三区 | 中文字幕日韩精品一区二区三区 | 亚洲无人区午夜福利码高清完整版 | 荫蒂被男人添的好舒服爽免费视频 | 国产免费久久精品国产传媒 | 亚洲国产精华液网站w | 日韩精品无码免费一区二区三区 | 日本一区二区三区免费播放 | 日韩欧美成人免费观看 | 精品无码一区二区三区爱欲 | 国产亚洲精品精品国产亚洲综合 | 久久久久成人片免费观看蜜芽 | 亚洲综合久久一区二区 | 欧美午夜特黄aaaaaa片 | 夫妻免费无码v看片 | 真人与拘做受免费视频一 | 性做久久久久久久免费看 | 免费人成在线视频无码 | 成年女人永久免费看片 | 久久熟妇人妻午夜寂寞影院 | 亚洲午夜福利在线观看 | 婷婷五月综合激情中文字幕 | 亚洲乱码中文字幕在线 | 中文字幕中文有码在线 | 少妇性l交大片欧洲热妇乱xxx | 欧美熟妇另类久久久久久多毛 | 国产成人无码一二三区视频 | 激情内射日本一区二区三区 | 成人欧美一区二区三区黑人免费 | 国产精品亚洲五月天高清 | 亚洲成av人在线观看网址 | www国产亚洲精品久久久日本 | 天天躁夜夜躁狠狠是什么心态 | 亚洲欧洲无卡二区视頻 | 激情综合激情五月俺也去 | 少妇性l交大片欧洲热妇乱xxx | 人人澡人人妻人人爽人人蜜桃 | 国产精品久免费的黄网站 | 99久久99久久免费精品蜜桃 | 少妇人妻av毛片在线看 | 日本一本二本三区免费 | 图片区 小说区 区 亚洲五月 | 亚洲成a人片在线观看无码3d | 娇妻被黑人粗大高潮白浆 | 欧美色就是色 | 中文无码成人免费视频在线观看 | 亚洲 另类 在线 欧美 制服 | 狠狠色欧美亚洲狠狠色www | 久久精品国产亚洲精品 | 一本加勒比波多野结衣 | 精品国产国产综合精品 | 久久国内精品自在自线 | 亚洲精品国产第一综合99久久 | 日韩av无码一区二区三区 | 人妻夜夜爽天天爽三区 | 亚洲精品www久久久 | 波多野结衣 黑人 | 国产亚洲精品久久久久久大师 | 一本久久a久久精品亚洲 | 四虎永久在线精品免费网址 | 无码国产激情在线观看 | 中文字幕久久久久人妻 | 99久久人妻精品免费一区 | 日日躁夜夜躁狠狠躁 | 99久久婷婷国产综合精品青草免费 | 台湾无码一区二区 | 亚洲欧美精品伊人久久 | 日本大香伊一区二区三区 | 久久亚洲中文字幕精品一区 | 成人精品视频一区二区 | 一本色道婷婷久久欧美 | 97se亚洲精品一区 | 一本精品99久久精品77 | 欧美黑人性暴力猛交喷水 | 在线播放无码字幕亚洲 | 国产激情无码一区二区app | 98国产精品综合一区二区三区 | 无码任你躁久久久久久久 | 99久久精品国产一区二区蜜芽 | 亚洲区小说区激情区图片区 | 亚洲爆乳精品无码一区二区三区 | 久久久久久a亚洲欧洲av冫 | 婷婷综合久久中文字幕蜜桃三电影 | 欧美日韩视频无码一区二区三 | 荫蒂被男人添的好舒服爽免费视频 | 久久综合给合久久狠狠狠97色 | 日韩人妻少妇一区二区三区 | 亚洲男人av天堂午夜在 | 成人免费无码大片a毛片 | 国产内射爽爽大片视频社区在线 | 成人免费视频视频在线观看 免费 | 亚洲毛片av日韩av无码 | 国产综合久久久久鬼色 | 国产精品99久久精品爆乳 | 国产成人精品一区二区在线小狼 | 亚洲爆乳精品无码一区二区三区 | 精品国产成人一区二区三区 | 图片区 小说区 区 亚洲五月 | 精品国产成人一区二区三区 | 久激情内射婷内射蜜桃人妖 | 在线天堂新版最新版在线8 | 国产熟女一区二区三区四区五区 | 亚洲精品美女久久久久久久 | 久久国产精品萌白酱免费 | 国产69精品久久久久app下载 | 丁香花在线影院观看在线播放 | 欧美亚洲国产一区二区三区 | 99久久精品日本一区二区免费 | 亚洲综合在线一区二区三区 | 无码人妻黑人中文字幕 | 天天拍夜夜添久久精品 | 日本熟妇人妻xxxxx人hd | 人妻无码αv中文字幕久久琪琪布 | 国产手机在线αⅴ片无码观看 | 玩弄人妻少妇500系列视频 | 国产亚洲精品久久久闺蜜 | 国产无遮挡又黄又爽又色 | 国产真实夫妇视频 | 成人av无码一区二区三区 | 亚洲熟熟妇xxxx | 麻豆国产人妻欲求不满谁演的 | 亚洲人交乣女bbw | 精品人妻中文字幕有码在线 | 人人妻人人澡人人爽欧美一区九九 | 国产日产欧产精品精品app | 亚洲国产一区二区三区在线观看 | 荫蒂添的好舒服视频囗交 | 久久综合色之久久综合 | 乱中年女人伦av三区 | 欧美喷潮久久久xxxxx | 亚洲日韩乱码中文无码蜜桃臀网站 | 无码国产乱人伦偷精品视频 | 玩弄中年熟妇正在播放 | 亚洲春色在线视频 | 熟女体下毛毛黑森林 | 亚洲欧美综合区丁香五月小说 | 亚洲国产av精品一区二区蜜芽 | 亚洲欧美综合区丁香五月小说 | 精品久久久中文字幕人妻 | 国产精品久久久久久亚洲毛片 | 国产精品二区一区二区aⅴ污介绍 | 亚洲の无码国产の无码步美 | 国产手机在线αⅴ片无码观看 | 又大又紧又粉嫩18p少妇 | 一本久道久久综合婷婷五月 | 窝窝午夜理论片影院 | 成人动漫在线观看 | 亚洲一区二区三区四区 | 久久99精品久久久久久动态图 | 亚洲国产精品久久人人爱 | 麻豆国产丝袜白领秘书在线观看 | 最近的中文字幕在线看视频 | 午夜成人1000部免费视频 | 国产精品亚洲а∨无码播放麻豆 | 伊人久久大香线蕉亚洲 | 成人免费视频一区二区 | 亚洲日韩乱码中文无码蜜桃臀网站 | 亚洲爆乳无码专区 | 久久久久久久人妻无码中文字幕爆 | 日本xxxx色视频在线观看免费 | 四十如虎的丰满熟妇啪啪 | 88国产精品欧美一区二区三区 | 高潮喷水的毛片 | 精品厕所偷拍各类美女tp嘘嘘 | 亚洲一区二区三区播放 | 正在播放老肥熟妇露脸 | 日本xxxx色视频在线观看免费 | 国精产品一区二区三区 | 亚洲小说图区综合在线 | 久久精品成人欧美大片 | 老子影院午夜伦不卡 | 国产精华av午夜在线观看 | 久久亚洲国产成人精品性色 | 爱做久久久久久 | 中文无码成人免费视频在线观看 | 国产av久久久久精东av | 日本精品少妇一区二区三区 | 免费观看黄网站 | 无码中文字幕色专区 | 丰满少妇高潮惨叫视频 | 无遮挡国产高潮视频免费观看 | 国产卡一卡二卡三 | 国产激情艳情在线看视频 | 一本色道久久综合亚洲精品不卡 | 国产午夜精品一区二区三区嫩草 | 综合网日日天干夜夜久久 | 内射爽无广熟女亚洲 | 国产综合久久久久鬼色 | 精品偷拍一区二区三区在线看 | 国产精品久久久久久久9999 | 亚洲熟妇色xxxxx欧美老妇 | 又粗又大又硬毛片免费看 | 国产精品亚洲а∨无码播放麻豆 | 精品午夜福利在线观看 | 蜜臀av在线播放 久久综合激激的五月天 | 久久亚洲日韩精品一区二区三区 | 一个人免费观看的www视频 | 国产精品久久久 | 国产精品亚洲综合色区韩国 | 欧美乱妇无乱码大黄a片 | 欧美高清在线精品一区 | 国产莉萝无码av在线播放 | 国产成人精品久久亚洲高清不卡 | 亚洲日本va午夜在线电影 | 国产精品久久久久久久9999 | 狠狠噜狠狠狠狠丁香五月 | 欧美freesex黑人又粗又大 | 久久久久se色偷偷亚洲精品av | 中文字幕无码人妻少妇免费 | 亚洲人成影院在线无码按摩店 | 亚洲国产精品无码久久久久高潮 | 日韩无码专区 | 免费看少妇作爱视频 | 久久久久亚洲精品中文字幕 | 99久久精品日本一区二区免费 | 免费网站看v片在线18禁无码 | 人妻熟女一区 | 亚洲伊人久久精品影院 | 波多野42部无码喷潮在线 | 伊人久久婷婷五月综合97色 | 无码乱肉视频免费大全合集 | 日韩亚洲欧美中文高清在线 | 久久亚洲中文字幕无码 | 亚洲中文字幕久久无码 | 国产网红无码精品视频 | 日日摸夜夜摸狠狠摸婷婷 | 国精产品一区二区三区 | 国产精品人妻一区二区三区四 | 国内揄拍国内精品人妻 | 成人免费无码大片a毛片 | 成人影院yy111111在线观看 | 亚洲男人av天堂午夜在 | 3d动漫精品啪啪一区二区中 | 丰满少妇熟乱xxxxx视频 | 99久久精品无码一区二区毛片 | 少妇性l交大片 | 色妞www精品免费视频 | 日日夜夜撸啊撸 | 激情五月综合色婷婷一区二区 | 人人爽人人澡人人高潮 | 亚洲国产精品成人久久蜜臀 | 亚洲小说图区综合在线 | 亚洲欧洲中文日韩av乱码 | 日本丰满熟妇videos | 男人和女人高潮免费网站 | 久久久久久久久888 | 久久精品国产一区二区三区肥胖 | 亚洲一区二区三区偷拍女厕 | 岛国片人妻三上悠亚 | 国产成人精品一区二区在线小狼 | 2019nv天堂香蕉在线观看 | 久久国产劲爆∧v内射 | 人人澡人人透人人爽 | 波多野结衣乳巨码无在线观看 | 国产网红无码精品视频 | 国产精品.xx视频.xxtv | 精品乱码久久久久久久 | 国内丰满熟女出轨videos | 国产sm调教视频在线观看 | 久久久无码中文字幕久... | 欧美怡红院免费全部视频 | 奇米影视888欧美在线观看 | 99久久精品午夜一区二区 | 亚洲中文字幕无码中文字在线 | 欧美黑人乱大交 | 乱人伦中文视频在线观看 | 激情爆乳一区二区三区 | 国产成人综合在线女婷五月99播放 | 国产成人无码av一区二区 | 熟女俱乐部五十路六十路av | 两性色午夜免费视频 | 日本www一道久久久免费榴莲 | a在线亚洲男人的天堂 | 国产精品久久精品三级 | 午夜成人1000部免费视频 | 国产精品久久久 | 中文毛片无遮挡高清免费 | 国产办公室秘书无码精品99 | 欧美35页视频在线观看 | 欧美熟妇另类久久久久久不卡 | 亚洲人成人无码网www国产 | 在线观看免费人成视频 | 99麻豆久久久国产精品免费 | 日产精品高潮呻吟av久久 | 精品 日韩 国产 欧美 视频 | 国产精品人人妻人人爽 | 久久成人a毛片免费观看网站 | 少妇一晚三次一区二区三区 | 亚洲欧美精品aaaaaa片 | 午夜肉伦伦影院 | 日韩av无码中文无码电影 | 色老头在线一区二区三区 | 国产精品久久久久影院嫩草 | 免费无码的av片在线观看 | 一二三四社区在线中文视频 | 领导边摸边吃奶边做爽在线观看 | 久久五月精品中文字幕 | 午夜无码人妻av大片色欲 | √天堂资源地址中文在线 | 无套内射视频囯产 | 国产欧美亚洲精品a | 欧美国产日韩亚洲中文 | 久久国产精品偷任你爽任你 | 欧美日韩色另类综合 | 精品人妻中文字幕有码在线 | 暴力强奷在线播放无码 | 国产精品第一区揄拍无码 | 亚洲一区二区三区偷拍女厕 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 无码播放一区二区三区 | 欧美国产日产一区二区 | 国产香蕉尹人视频在线 | 国产超级va在线观看视频 | 成人欧美一区二区三区黑人免费 | 国产在线精品一区二区三区直播 | 国产成人一区二区三区在线观看 | 日韩欧美中文字幕在线三区 | 欧美激情内射喷水高潮 | 亚洲码国产精品高潮在线 | 福利一区二区三区视频在线观看 | 无码人妻精品一区二区三区不卡 | 日韩人妻无码一区二区三区久久99 | 少妇被黑人到高潮喷出白浆 | 精品国产一区二区三区四区在线看 | v一区无码内射国产 | 丰满岳乱妇在线观看中字无码 | 亚洲成av人影院在线观看 | 亚洲色大成网站www国产 | 中文字幕人妻无码一区二区三区 | 亚洲成av人影院在线观看 | 国产精品无套呻吟在线 | 国产午夜无码视频在线观看 | 青青草原综合久久大伊人精品 | 欧美放荡的少妇 | 亚洲天堂2017无码中文 | 强开小婷嫩苞又嫩又紧视频 | 欧美老妇交乱视频在线观看 | 亚洲天堂2017无码中文 | 帮老师解开蕾丝奶罩吸乳网站 | 精品人妻av区 | 性欧美疯狂xxxxbbbb | 性做久久久久久久免费看 | 久久久国产精品无码免费专区 | 久久久久免费看成人影片 | 亚洲国产精品久久久久久 | 内射后入在线观看一区 | 少妇激情av一区二区 | 久久久久久九九精品久 | 色综合久久久无码中文字幕 | 18精品久久久无码午夜福利 | 在线视频网站www色 | 日日摸日日碰夜夜爽av | 日欧一片内射va在线影院 | 奇米影视888欧美在线观看 | 国产在线精品一区二区高清不卡 | 97精品国产97久久久久久免费 | 亚洲中文字幕无码一久久区 | 国产麻豆精品一区二区三区v视界 | 日本饥渴人妻欲求不满 | 欧美老熟妇乱xxxxx | 国产人妻久久精品二区三区老狼 | 国产精品亚洲专区无码不卡 | 夜先锋av资源网站 | 300部国产真实乱 | 无码av岛国片在线播放 | 亚洲成a人一区二区三区 | 中文字幕无码热在线视频 | 成人欧美一区二区三区黑人 | 双乳奶水饱满少妇呻吟 | 日本免费一区二区三区最新 | 人人妻人人澡人人爽人人精品浪潮 | 国精产品一品二品国精品69xx | 国产精品久久久一区二区三区 | 天干天干啦夜天干天2017 | 在线天堂新版最新版在线8 | 欧美日韩视频无码一区二区三 | 亚洲 a v无 码免 费 成 人 a v | 女人被男人躁得好爽免费视频 | 亚洲理论电影在线观看 | 国产欧美亚洲精品a | 国产精品亚洲一区二区三区喷水 | 日本丰满熟妇videos | 国产无遮挡又黄又爽免费视频 | 野狼第一精品社区 | 日产精品高潮呻吟av久久 | 牲欲强的熟妇农村老妇女视频 | 又湿又紧又大又爽a视频国产 | 国产成人一区二区三区在线观看 | 又色又爽又黄的美女裸体网站 | 久久综合九色综合欧美狠狠 | 久久久国产一区二区三区 | 亚洲精品综合五月久久小说 | 人人妻人人澡人人爽欧美一区九九 | 丰满岳乱妇在线观看中字无码 | 东北女人啪啪对白 | 夜先锋av资源网站 | 无码午夜成人1000部免费视频 | 女高中生第一次破苞av | 亚洲男女内射在线播放 | 少妇性荡欲午夜性开放视频剧场 | 狠狠噜狠狠狠狠丁香五月 | 97夜夜澡人人爽人人喊中国片 | 妺妺窝人体色www在线小说 | 波多野42部无码喷潮在线 | 亚洲成a人片在线观看无码3d | 亚洲va中文字幕无码久久不卡 | 亚洲综合久久一区二区 | 中文字幕无码热在线视频 | 丰满肥臀大屁股熟妇激情视频 | 亚洲熟熟妇xxxx | 日韩亚洲欧美精品综合 | 少妇人妻大乳在线视频 | av无码不卡在线观看免费 | 亚洲区欧美区综合区自拍区 | 亚洲va欧美va天堂v国产综合 | 亚洲第一无码av无码专区 | 免费网站看v片在线18禁无码 | 久久久av男人的天堂 | 性做久久久久久久免费看 | av人摸人人人澡人人超碰下载 | 精品久久久久久人妻无码中文字幕 | 人妻夜夜爽天天爽三区 | 亚洲国产成人a精品不卡在线 | 扒开双腿吃奶呻吟做受视频 | 国产精品亚洲五月天高清 |