安裝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
=========================================================================
一、發送請求
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) #響應的狀態碼
============================================================================
============================================================================
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 | 或,多條件選取 |
==========================================================================
=========================================================================
官方指定測試網址: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
spider--> Scheduler --> downloader(middlewares) ->> spiders ->> itemPipeline
屬性或方法 | 做用 |
---|---|
url | 當前返回數據所對應的頁面url |
status | http請求狀態碼 |
meta | 用於request與response之間的數據傳遞 |
body | 返回頁面html源碼,如用純正則表達式匹配數據須要得到頁面html源碼 |
xpath() | 使用xpath選擇器解析網頁 |
css() | 使用css選擇器解析網頁 |
有三種:
獲取選擇器中的網頁數據data
extract() 提取selector列表中的網頁數據 若是列表爲空,取下標爲0的網頁數據會拋出異常 extract_first() 提取selector列表中下標爲0的網頁數據 若是列表爲空,不會拋出異常,返回none
# -*- 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
設置用戶代理模擬瀏覽器,步驟:
一、使用瀏覽器打開一個網頁,進入控制檯--->Network --> Header -->拷貝最底部USER_Agent的值
二、scrapy工程中找到setting.py ,查找USER_AGENT 屬性,去掉註釋,粘貼賦值
設置COOKIE保持登陸狀態
一、本身使用瀏覽器登錄網頁,而後進入要爬取的域名,進入F12控制檯-->network->Doc -->域名同名文件
二、在文件中找到RequestHeader ,複製
三、在scrapt框架的settings.py文件中找到DEFAULT_REQUEST_HEADERS屬性,將複製的內容以json格式賦值給它
四、關於settings中的Cookies的設置規則:
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
一、重寫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類的實例