Python學習筆記(七)

Python爬蟲框架

  • 安裝Scrapy框架css

    一、命令行
    conda install scrapy
    
    二、PYcharm
    setting -> project interpreter ->  + 號,搜索scrapy ,install

 

爬蟲工做基本原理——數據採集

大數據數據採集有兩種:html

一、從網上爬取 crawlingnode

二、從本地收集 scrapingpython

 

流程步驟:mysql

一、模擬瀏覽器發送請求 : urllib,request,scrapy(框架)正則表達式

二、獲取瀏覽器的相應sql

三、解析響應內容 : lxml ,beautifulsoup數據庫

四、存儲所需數據 : CSV,JSON,RDBMS(pymysql),Mongodbjson

 

 

=========================================================================api

一、Request 的API

=========================================================================

一、發送請求

import  requests as req
#發送請求,獲取響應
reply=req.get("https://beijing.8684.cn/x_35b1e697")

 

二、獲取響應

print(reply.content)  #二進制的HTML ,用於xpath解析
print(reply.text)     #字符HTML,用於正則解析
print(reply.status_code) #響應的狀態碼

 

============================================================================

二、lxml 的API

============================================================================

1.導包

from lxml import etree as et

2.解析HTML(二進制文件)

root=et.HTML(reply.content)

#XPATH語法
root.Xpath('//book').tag

3.demo

#request獲取 + lxml解析

import  requests as req
from lxml import etree as et
#發送請求,獲取響應
reply=req.get("https://beijing.8684.cn/x_35b1e697")
#print(reply.content)
src=reply.content
root=et.HTML(src)
#非包裝類,直接返回一個字符串型的列表list
print(root.xpath("//div[@class='bus_site_layer']/div/a/text()"))

 

Xpath語法

表達式 描述
nodename 選取的節點名
/ 從根節點選取
// 選取全部符合條件的節點,而不考慮它們的位置
. 選取當前節點
.. 選取當前節點的父節點
@ 選取屬性
[@attrib] 選取全部包含指定屬性的節點
[@attrib='value'] 選取全部指定屬性值爲value的節點,也能夠是其餘邏輯運算符
[tag] 全部子節點包含指定節點名的節點
[position] 經過索引選取節點
/方法名() 調用結點方法獲取返回值list,不可直接在position後使用
* 匹配任何元素節點。
@* 匹配任何屬性節點。
node() 匹配任何類型的節點。
exp1|exp2 或,多條件選取

 

 

==========================================================================

三、 Scrapy 框架

=========================================================================

官方指定測試網址:http://quotes.toscrape.com/

建立一個爬蟲工程

一、建立一個目錄,cmd中cd到該目錄,而後建立工程scrapy startproject $youprojectname

二、建立一個Spider爬蟲文件,scrapy genspider $youspidername $start_url

start_url 不能加https

默認的parse()方法是空

工程目錄下的spider文件下生成$youspidername.py文件

導入到Pycharm 進行業務邏輯編寫

三、啓動爬蟲spider :

cmd啓動: scrapy crawl $youspidername

在py腳本中啓動:

from scrapy.cmdline import execute
execute('scrapy crawl $youspidername'.split())

 

框架組成

  • spiders文件夾

    • 定義爬蟲文件
  • items.py

    • 定義框架內數據傳輸格式
  • pipelines.py

    • 數據保存模塊
  • middlewares.py

    • 中間件模塊,代理服務
  • settings.py

    • 框架配置模塊

1565750916521

spider--> Scheduler --> downloader(middlewares) ->> spiders ->> itemPipeline

 

經過解析方法返回爬取頁面數據

  • parse()方法的response參數
  • response對象經常使用屬性和方法
  • 返回都是Selector選擇器類
屬性或方法 做用
url 當前返回數據所對應的頁面url
status http請求狀態碼
meta 用於request與response之間的數據傳遞
body 返回頁面html源碼,如用純正則表達式匹配數據須要得到頁面html源碼
xpath() 使用xpath選擇器解析網頁
css() 使用css選擇器解析網頁

關於選擇器

有三種:

  • xpath選擇器 基於lxml庫,用於選擇XML文檔中的節點的語言,能夠與HTML一塊兒使用
  • css選擇器 用於將樣式應用於HTML文檔的語言 將樣式與特定的HTML元素相關聯
  • 正則表達式 提取非標籤內容

關於提取器

獲取選擇器中的網頁數據data

extract() 提取selector列表中的網頁數據 若是列表爲空,取下標爲0的網頁數據會拋出異常 extract_first() 提取selector列表中下標爲0的網頁數據 若是列表爲空,不會拋出異常,返回none

業務模塊spiders.demo
# -*- coding: utf-8 -*-
import scrapy
from scrapy.cmdline import execute


class FirstscSpider(scrapy.Spider):
    name = 'firstsc'
    allowed_domains = ['www.kgc.cn']
    start_urls = ['http://www.kgc.cn/']

    def parse(self, response):
        print('---------------------')
        res=response.xpath('//p[@class="orientation"]/text()')
        for item in res:
            print(item)
        print('---------------------')


execute('scrapy crawl firstsc'.split())  #py腳本執行scrapy

 

關於反爬蟲(User_Agent 和 Cookies)

設置用戶代理模擬瀏覽器,步驟:

一、使用瀏覽器打開一個網頁,進入控制檯--->Network --> Header -->拷貝最底部USER_Agent的值

二、scrapy工程中找到setting.py ,查找USER_AGENT 屬性,去掉註釋,粘貼賦值

 

設置COOKIE保持登陸狀態

一、本身使用瀏覽器登錄網頁,而後進入要爬取的域名,進入F12控制檯-->network->Doc -->域名同名文件

二、在文件中找到RequestHeader ,複製

三、在scrapt框架的settings.py文件中找到DEFAULT_REQUEST_HEADERS屬性,將複製的內容以json格式賦值給它

四、關於settings中的Cookies的設置規則

  • 當COOKIES_ENABLED是註釋的時候scrapy默認沒有開啓cookie
  • 當COOKIES_ENABLED沒有註釋設置爲False的時候scrapy默認使用了settings裏面的cookie
  • 當COOKIES_ENABLED設置爲True的時候scrapy就會把settings的cookie關掉,使用自定義cookie

 

Tips:這樣作有一個缺點是,默認全部Request都會使用該Cookies。能不能

關於翻頁爬取的管理

在parse方法中使用yield方法,根據獲取的url生成Request類,並指定這個Request的回調方法

 

關於詳情頁的獲取

即子頁面的獲取

核心功能: 生成器、回調函數、meta

生成器:經過yied語法生成多個Request,調用Schedular獲取頁面的響應,

回調函數:指定該Request的回調函數,即處理這個Request的方法

meta:指定Request與Response的映射字典,使回調函數的Response可以得到對應Request對象

 

 

關於數據保存

一、在item模塊中定義數據結構的字段,在spider中進行賦值

#item的定義方式
name = scrapy.Field()
age = scrapy.Field()

#賦值方式
obj=$youspidername+Item()
obj['name']="huyang"

二、在pipeline模塊中過濾處理並將數據存儲到倉庫

命令行模式:-o filename

IDE模式:在爬蟲模塊的回調方法中使用生成器yield返回一個item類的實例對象,在settings.py中設置FEED_FORMAT='CSV' FEED_URI='d:/python.csv'

保存到CSV

保存到MySQL

一、重寫pipelins.py

import pymysql


class ScrapydemoPipeline(object):
    # 定義構造器,初始化要寫入的文件
    def __init__(self):
        self.db = pymysql.connect(host="192.168.137.137", user="root", passwd="rw", db="scrapy", port=3306,
                                  charset='utf8')
        self.cur = self.db.cursor()

    # 重寫close_spider回調方法,用於關閉數據庫資源
    def close_spider(self, spider):
        print('----------關閉數據庫資源-----------')
        # 關閉遊標
        self.cur.close()
        # 關閉鏈接
        self.db.close()

    def process_item(self, item, spider):
        #SQL語句
        sql = """
        insert into bus_line_site(`name`,`dicts`,`sites`) values(%s,%s,%s)
        """
        self.cur.execute(sql, (item['name'], item['dicts'], item['sites']))
        self.db.commit()

 

二、setting.py中關於ITEM_PIPELINE屬性去掉註釋,而後添加FEED_EXPORT_ENCODING = 'utf-8'

三、設置MYSQL表和數據的字符集爲utf8

四、回調函數中要使用yield返回一個item類的實例

動態頁面爬取???

相關文章
相關標籤/搜索