1. 程式人生 > >132 scrapy框架的認識, 移動端資料爬取, 多執行緒

132 scrapy框架的認識, 移動端資料爬取, 多執行緒

主要內容:

spider: 寫的特別好https://www.cnblogs.com/x-pyue/p/7795315.html

1 多執行緒資料爬取

import requests
from lxml import etree 
import random
import re
from multiprocessing.dummy import Pool
pool = Pool(5)

def saveVideo(data):
    file_path = str(random.randint(0,1000)) + ".mp4"
    with open(file_path, "
wb") as f: f.write(data) print(file_path+"下載成功") headers = { "User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36', } url = 'https://www.pearvideo.com/' page_text = requests.get(url=url, headers=headers).text tree
= etree.HTML(page_text) li_list = tree.xpath("//div[@class='vervideo-tlist-bd clearfix']/ul/li") video_url_list = [] for li in li_list: detail_url = "https://www.pearvideo.com/" + li.xpath(".//a/@href")[0] detail_name = li.xpath(".//a//div[@class='vervideo-name']/text()")[0] detail_text = requests.get(url = detail_url, headers=headers).text open_addr
= re.findall('srcUrl="(.*?)"',detail_text, re.S )[0] video_url_list.append(open_addr) #併發下載視訊 downloadVideo = lambda link:requests.get(url=link,headers=headers).content #map返回的列表中儲存的就是下載完畢的視訊二進位制的資料值 video_data_list = pool.map(downloadVideo,video_url_list) pool.map(saveVideo,video_data_list) pool.close() pool.join()
View Code

2  selenium

  a selenium的認識

selenium介紹:是用來載入頁面中動態的資料
    Selenium是一個Web的自動化測試工具,最初是為網站自動化測試而開發的,最初是為網站自動化測試而開發的,型別像我們玩遊戲用的按鍵精靈,
    可以按指定的命令自動化操作,不同是Selenium可以直接執行在瀏覽器上,它支援所有主流的瀏覽器(包括PhantomJS這些無介面的瀏覽器)。Selenium可以根據我們的指令,讓瀏覽器自動載入頁面,獲取需要的頁面,甚至頁面截圖,或者判斷網站上某些動作是否發生。
    Selenium自己不帶瀏覽器,不支援瀏覽器的功能,它需要與第三方瀏覽器結合在一起才能使用。但是我們有時候需要讓它內嵌在程式碼中執行,
所有我們而已用一個叫PhantomJS的工具代替真實的瀏覽器。

  b  PhantomJS的簡單介紹 

PhantomJS是一個基於Webkit的"無介面"(headless)瀏覽器,它會把網站載入到記憶體並執行頁面上的JavaScript,因為不會展示圖形介面,所以執行起來比完整的瀏覽器更高效。
如果我們把Selenium和PhantomJS結合在一起,就可以執行一個非常強大的網路爬蟲了,這個爬蟲可以處理JavaScript、Cookie、headers,以及任何我們真實使用者需要做的事情。

  c 爬蟲例項

# 谷歌無頭瀏覽器, 新增option引數也可以無介面.
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
from time import sleep
bro = webdriver.Chrome(executable_path=r"C:\Users\26897\Desktop\爬蟲\day 05 多執行緒 selenium\chromedriver.exe",chrome_options=chrome_options)
bro.get(url="https://www.baidu.com")
# 獲取input框
my_input = bro.find_element_by_id("kw")
my_input.send_keys("陽光很好, 眼睛眯著")
button = bro.find_element_by_id("su")
button.click()
sleep(1)
#獲取當前瀏覽器顯示的頁面的頁面原始碼
page_text = bro.page_source
bro.quit()
View Code

     爬取豆瓣電影: 

import requests
from selenium import webdriver
from time import sleep
bro = webdriver.Chrome(executable_path=r"C:\Users\26897\Desktop\爬蟲\day 05 多執行緒 selenium\chromedriver.exe")

bro.get(url="https://movie.douban.com/typerank?type_name=%E5%96%9C%E5%89%A7&type=24&interval_id=100:90&action=")

js = 'window.scrollTo(0,document.body.scrollHeight)'
bro.execute_script(js)
sleep(2)
bro.execute_script(js)
sleep(2)

page_text = bro.page_source
with open("./dianying.html", "w", encoding='utf-8') as f:
    f.write(page_text)
    
bro.quit()
View Code

 

    爬取qq空間:

# qq空間
import requests
from lxml import etree
from selenium import webdriver
from time import sleep
bro = webdriver.Chrome(executable_path=r"C:\Users\26897\Desktop\爬蟲\day 05 多執行緒 selenium\chromedriver.exe")
bro.get(url="https://qzone.qq.com/")
# 定位到frame
bro.switch_to.frame("login_frame")
bro.find_element_by_id("switcher_plogin").click()
sleep(1)
u_input = bro.find_element_by_id('u')
p_input = bro.find_element_by_id('p')
u_input.send_keys("2689709108")
p_input.send_keys("gyh412724")
sleep(1)
button = bro.find_element_by_id('login_button')
button.click()
sleep(1)


js = 'window.scrollTo(0,document.body.scrollHeight)'
bro.execute_script(js)
sleep(1)
bro.execute_script(js)
sleep(1)

page_text = bro.page_source
sleep(5)
tree = etree.HTML(page_text)
div_list = tree.xpath('//div[@class="f-info"]')
for div in div_list:
    print(div)
    title = div.xpath(".//text()")
#     print(title)
    title = ''.join(title)
bro.quit()
View Code

 

3 : 移動端資料爬取:https://www.cnblogs.com/bobo-zhang/p/10068994.html

4: scrapy框架初始

  0 scrapy的概念:

    scrapy 是一個為了爬取網站資料,提取結構性資料而編寫的應用框架,我們只需要實現少量程式碼,就能夠快速的抓取到資料內容。Scrapy 使用了 Twisted['twɪstɪd](其主要對手是Tornado)非同步網路框架來處理網路通訊,可以加快我們的下載速度,不用自己去實現非同步框架,並且包含了各種中介軟體介面,可以靈活的完成各種需求。

  a 安裝scrapy流程:

    1 下載: https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted, 在對應的路徑中開啟cmd, 然後安裝, pip install 下載名

    2  安裝pywin32,    pip install  pywin32

    3  安裝scrapy        pip install  pywin32

  b 使用scrapy建立專案

    1 進入到指定的專案路徑下, 安裝scrapy, 然後建立專案, scrapy  startproject  專案名

    2 進入到專案中,  cmd  中直接cd  檔名

    3 建立爬蟲檔案, scrapy genspider 檔名  起始的url

    4  進入到pycharm中進行編輯

    5  在cmd中執行專案,   scrapy crawl 爬蟲檔名    --nolog (無log檔案)

  c  scrapy框架工作流程:

    1.首先Spiders(爬蟲)將需要傳送請求的url(requests)經ScrapyEngine(引擎)交給Scheduler(排程器)。

    2.Scheduler(排序,入隊)處理後,經ScrapyEngine,DownloaderMiddlewares(可選,主要有User_Agent, Proxy代理)交給Downloader。

    3.Downloader向網際網路傳送請求,並接收下載響應(response)。將響應(response)經ScrapyEngine,SpiderMiddlewares(可選)交給Spiders。

    4.Spiders處理response,提取資料並將資料經ScrapyEngine交給ItemPipeline儲存(可以是本地,可以是資料庫)。

              5. 提取url重新經ScrapyEngine交給Scheduler進行下一個迴圈。直到無Url請求程式停止結束。