天天看點

#Python新征程34#自模組化塊BeautifulSoup,re,selenium的爬取應用

前面學習了基本的爬取理論,在pycharm虛拟環境下通過Python爬取網絡資料,可以通過BeautifulSoup、re正則和selenium三種基本方法。現在輪到了将三種基本方法融合到一起的時候,知識在小腦袋中彙集爆炸的時刻。

#Python新征程34#自模組化塊BeautifulSoup,re,selenium的爬取應用

1、自定義爬蟲子產品

跟随教材的講解步伐,首先自定義一個爬蟲子產品,将三種方法都融合在一起,代碼如下:

'''
自定義子產品,将BeautifulSoup,re和selenium組合在一起
'''
import requests, re, time
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By


class Spider():
    def __init__(self, url=None, headers=None):
        self.url = url
        self.headers=headers


    def requests_getHtmlSource(self):
        try:
            r = requests.get(self.url,headers=self.headers)
            r.raise_for_status()
            html=r.text
        except:
            html = "error"
        return html


    def beautifulsoup_getTarget(self,selector=None,attrs=None):
        soup = BeautifulSoup(self.requests_getHtmlSource(),'html.parser')
        resultset = soup.select(selector)
        res = [item.text for item in resultset]
        return res


    def re_getTarget(self, pattern=None, flag=None):
        targetPattern = re.compile(pattern, flags=flag)
        res = targetPattern.findall(self.requests_getHtmlSource)
        return res


    def selenium_scrapy(self, selector=None):
        chrome = webdriver.Chrome()
        chrome.implicitly_wait(3)
        chrome.get(self.url)
        target_elements = chrome.find_elements(By.CSS_SELECTOR, 'selector')
        res = [item.text for item in target_elements]
        return res           

代碼簡單解釋如下:

①引入requests、re、time、BeautifulSoup、selenium等各類庫資源;

②定義一個spider的類,類裡面包含了url解析器、以及Beautisoup、re和se三種方法。

③每種方法标明具體的解決步驟和路徑;

編寫代碼感悟與心得

①這是個相對比較長的代碼,整合了過去接近10天時間之内學習的各種方法,因為過去10天中學習的過程比較痛苦,是以心裡對這個代碼也是感覺比較痛苦

②不痛苦不提高,是以還是硬着頭皮敲下來,然後嘗試運作,針對出現的問題再去找對應的解決方法;

③有些問題現在還是解決不了的,是以期待後面的學習中越來越熟練,越來越深入了解,才能解決問題;

這次代碼編寫遇到的坑

①定義類之後,下面的def定義函數中,忘記縮進,導緻我無法引用這些功能,在記憶中沒有形成固定的習慣,是以耽誤了一些時間;

②類名的字元越多,越容易出錯,且在子產品中無法找到問題所在,需要在代碼和子產品之間來回轉換查找問題。

2、通過自定義子產品來爬取百度熱點搜尋資訊

#Python新征程34#自模組化塊BeautifulSoup,re,selenium的爬取應用

當自定義子產品編寫好并儲存後,在同一檔案夾下建立新的檔案,編寫百度熱點搜尋的爬取資料,代碼就變的很簡潔,輸入了url,header和cookie資訊,然後調用自定義子產品中的必要功能就可以實作快速爬取資料了。

遇到的困難還是在調試過程中,會出現前後編寫代碼不一緻的錯誤。

然後通過不同的selector路徑來看看可以爬取出來哪些資料,嗯~~~不一樣的體驗和感受

代碼如下:

import easySpider
url='https://top.baidu.com/board?tab=realtime'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36','Cookie':'BIDUPSID=41B961C6932938AE85BAE812C44E8D00; PSTM=1689907158; BAIDUID=41B961C6932938AE8CFD8399CFFF4CD0:FG=1; BAIDUID_BFESS=41B961C6932938AE8CFD8399CFFF4CD0:FG=1; ZFY=FbRdQaHa:AblVHbbvvAvODL4X9gn5JePCEFfA6:Bbi:Ad0:C'}
baiduHot=easySpider.Spider(url=url,headers=headers)
Hotlist=baiduHot.beautifulsoup_getTarget(selector='#sanRoot > main > div.container.right-container_2EFJr > div > div:nth-child(2)')
for item in Hotlist:
    print(item)           

3、通過自定義子產品來爬取京東每日特價資訊

又一個自定義子產品的運用,找到爬取内容的selector路徑之後,調用自定義子產品中的必要功能。具體代碼如下,就不再贅述了。

#Python新征程34#自模組化塊BeautifulSoup,re,selenium的爬取應用
import easySpider
url='https://miaosha.jd.com/'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36','Cookie':'__jdv=76161171|direct|-|none|-|1690083196765; __jdu=16900831967651748726393; 3AB9D23F7A4B3CSS=jdd03XUWL5YG35AVZC5CQ2FKMO3C5OWPRJL4CIBWBJNA74KPCWKD4LGJDKMSEPMZI52MC5IPYDIQ2CTXCP4W3XYD4Q2CM3AAAAAMJQDHQGZAAAAAADCPVLTZWR7TGFMX; _gia_d=1; areaId=19; ipLoc-djd=19-1666-0-0; PCSYCityID=CN_440000_440600_0; shshshfpa=76accaa1-2d7e-4146-a4f3-def1404bfda1-1690083198; shshshfpx=76accaa1-2d7e-4146-a4f3-def1404bfda1-1690083198; shshshsID=dc10b6304b6ae3d564b94177c4d9507f_1_1690083198586; shshshfpb=dk17sHozAiQSirtJ4itpJJA; __jda=122270672.16900831967651748726393.1690083197.1690083197.1690083197.1; __jdb=122270672.2.16900831967651748726393|1.1690083197; __jdc=122270672; 3AB9D23F7A4B3C9B=XUWL5YG35AVZC5CQ2FKMO3C5OWPRJL4CIBWBJNA74KPCWKD4LGJDKMSEPMZI52MC5IPYDIQ2CTXCP4W3XYD4Q2CM3A'}
jdSpecial=easySpider.Spider(url=url,headers=headers)
goodslist=jdSpecial.selenium_scrapy(selector='#J-superkillGoodslist > li:nth-child(1)')
pricelist=jdSpecial.selenium_scrapy(selector='#J-superkillGoodslist > li:nth-child(1) > div > span > span.seckill_mod_goods_price > i')
for goods,price in zip(goodslist,pricelist):
    print(goods,price)           

#加油!

#一點一滴的努力,未來都會有回報。

#歲月靜好,不去羨慕旁人,隻做好自己,花朵總會綻放。

#以上學習感悟來自于《網絡爬蟲進化論:從Excel爬蟲到Python爬蟲》(中國水利水電出版社2021年出版)