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
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,就是拿到了網頁的數據