一、scrapy框架
(一)安裝
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scrapy
(二)步驟
1.創建項目
2.配置
不遵循robot協議
請求頭
3.編寫想要獲取的url,並測試
啓動命令
scrapy crawl maoyan --nolog
4.設置想要提取的字段
5.實例化item對象
6.提取數據
extract_first() # 提取出一個選擇器的data值
extract_first() # 提取出一個list中所有選擇器data值,返回值爲list
7.存入item對象
(三)目錄結構
一定要嚴格按照這個目錄結構,不然運行命令會發生找不到命令的情況。
二、scrapy框架圖及組件
三、scrapy發送二次請求
在scrapy項目中,我們想要在parse方法中繼續發送一個請求,請求其他url,可以通過yield一個scrapy.Requests()對象完成。這樣scrapy引擎就會將它加入調度隊列中進行下載,將下載好的結果傳給該對象的callback參數鎖對應的回調方法。
該對象還有一個meta參數,用來傳遞參數
四、保存數據
將提取完全的item,保存到MongoDB中。
1.傳遞
將提取完全的item,使用yield item傳遞給pipelines.py中的process_item(self, item, spider)函數處理。
2.配置
要想使用pipelines.py中的類來存儲item,必須將該類配置到settings.py中。
3.存儲
因爲這個爬蟲程序不止要執行一次,不能每次執行都重新獲取一遍,要去重,即增量爬蟲。
增量爬蟲:讓我們爬蟲程序每次運行後,都能保證讓數據庫中數據穩定增長,不會出現重複。
所以給item增加一個datail_hash字段,保存detail_url的hash值。操作數據庫時,使用update就可以使用這個字段快速查找是否存在該數據,有的話就更新,沒有就插入。
五、自定義下載
即selenium+phantomjs
(一)步驟
1.創建一個MyMiddlerWare.py文件
2.創建一個類
這個類就是我們的下載中間件。當一個request在被下載器下載之前,使用這個中間件捕捉到它,可以提前對這個request做一些操作。當我們自己進行了下載之後,下載器發現就不會再下載了。
使用中間件的process_request方法。
def process_request(self, request, spider)
import time
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from scrapy.http import HtmlResponse
class MyMiddleWare(object):
def __init__(self):
self.driver = webdriver.PhantomJS()
self.wait = WebDriverWait(self.driver,10)
def process_request(self, request, spider):
xpath = request.meta.get('xpath')
self.driver.get(request.url)
if xpath:
self.wait.until(EC.presence_of_element_located((By.XPATH,xpath)))
else:
time.sleep(3)
html = self.driver.page_source
return HtmlResponse(url=request.url,body=html,encoding='utf-8',request=request)
3.配置
想要這個下載中間件生效,就要在settings.py中配置如下內容
六、scrapy設置初始請求的方法
(一)通過start_url
(二)通過start_requests()方法
這種方法的優點是可以手動設置url的一些request信息,比如可以自帶meta參數,比如可以給它設置一些請求頭。
七、scrapy中使用cookie
將cookie信息添加到請求頭中。
scrapy默認會自己定義cookie信息,所以只將cookie設置到請求頭中是不會生效的。
還需要設置禁用默認的cookie
八、LinkExtractor類
LinkExtractor類,能幫我們快速找到頁面指定位置處的所有鏈接,且會將相關信息也獲取到。
1.導包
from scrapy.linkextractors import LinkExtractor
2.創建一個le對象
對象接收的參數就是你想篩選鏈接的xpath,他會將你所傳入xpath的頁面元素中的所有鏈接及相關信息都篩選出來,這個參數是一個list,可以一次性接收多個xpath。
3.使用extract_links()方法取出
le = LinkExtractor(restrict_xpaths = ['//div[@class="l"]/ul/li/span[1]'])
links = le.extract_links(response)
4.取出url
for link in links循環這個links,使用link.url就能獲取到url了。
九、日誌
配置
LOG_FILE= 'biquge.log' # 日誌文件的名稱
LOG_ENABLE =True # 開啓日誌
LGO_LEVEL = 'DEBUG' # 日誌等級
LOG_ENCODING = 'utf-8' # 編碼
5種日誌等級
- CRITICAL:嚴重錯誤
- ERROR:一般錯誤
- WARNING:警告信息
- INFO:一般信息
- DEBUG:調試信息
十、編寫啓動文件
from scrapy import cmdline
cmdline.execute('scrapy crawl biquge_spider --nolog'.split())
不用再輸入命令,可以直接運行main.py文件運行項目。