天天看點

Datawhale OfficeAutomation Task05 爬蟲入門與綜合應用Task5 爬蟲入門與綜合應用

Task5 爬蟲入門與綜合應用

對于自動化辦公而言,網絡資料的批量擷取完資料可以節約相當的時間,是以爬蟲在自動化辦公中占據了一個比較重要的位置。

因而本節針對爬蟲項目進行一個介紹,力求最大程度還原實際的辦公場景。

1.Requests簡介

Requests是一款目前非常流行的http請求庫,使用python編寫,能非常友善的對網頁Requests進行爬取,也是爬蟲最常用的發起請求第三方庫。

安裝方法:

pip install requests
或者conda安裝
conda install requests
           
re.status_code 響應的HTTP狀态碼
re.text 響應内容的字元串形式
rs.content 響應内容的二進制形式
rs.encoding 響應内容的編碼
           

試一試對百度首頁進行資料請求:

項目難度:⭐

import requests
# 發出http請求
re=requests.get("https://www.baidu.com")
# 檢視響應狀态
print(re.status_code)
#輸出:200
#200就是響應的狀态碼,表示請求成功
#我們可以通過res.status_code的值來判斷請求是否成功。
           

res.text 傳回的是伺服器響應内容的字元串形式,也就是文本内容

例:用爬蟲下載下傳孔乙己的文章,網址是https://apiv3.shanbay.com/codetime/articles/mnvdu

我們打開這個網址 可以看到是魯迅的文章

我們嘗試着用爬蟲儲存文章的内容

項目難度:⭐

import requests
# 發出http請求
re = requests.get('https://apiv3.shanbay.com/codetime/articles/mnvdu')
# 檢視響應狀态
print('網頁的狀态碼為%s'%re.status_code)
with open('魯迅文章.txt', 'w') as file:
  # 将資料的字元串形式寫入檔案中
  print('正在爬取小說')
  file.write(re.text)
           

re.txt就是網頁中的内容,将内容儲存到txt檔案中

re.text用于文本内容的擷取、下載下傳

re.content用于圖檔、視訊、音頻等内容的擷取、下載下傳

項目難度:⭐⭐

import requests
# 發出http請求
#下載下傳圖檔
res=requests.get('https://img-blog.csdnimg.cn/20210424184053989.PNG')
# 以二進制寫入的方式打開一個名為 info.jpg 的檔案
with open('datawhale.png','wb') as ff:
    # 将資料的二進制形式寫入檔案中
    ff.write(res.content)
           

re.encoding 爬取内容的編碼形似,常見的編碼方式有 ASCII、GBK、UTF-8 等。如果用和檔案編碼不同的方式去解碼,我們就會得到一些亂碼。

2.HTML解析和提取

浏覽器工作原理:

向浏覽器中輸入某個網址,浏覽器回向伺服器送出請求,然後伺服器就會作出響應。其實,伺服器傳回給浏覽器的這個結果就是HTML代碼,浏覽器會根據這個HTML代碼将網頁解析成平時我們看到的那樣

比如我們來看看百度的html頁面

import requests
res=requests.get('https://baidu.com')
print(res.text)
           

将會看到很多帶有标簽的資訊

**HTML(Hyper Text Markup Language)**是一種超文本标記語言,是由一堆标記組成。

例如

<html>
  <head>
    <title>我的網頁</title>
  </head>
  <body>
    Hello,World
  </body>
</html>
           

上面即為一個最簡單的html,我們所需要的資訊就是夾在标簽中

想對html有根據深入的了解,可以html菜鳥教程

https://www.runoob.com/html/html-tutorial.html

那麼我們如何解析html頁面呢?

3.BeautifulSoup簡介

我們一般會使用BeautifulSoup這個第三方庫

安裝方法:

pip install bs4
或
conda install bs4
           

我們來解析豆瓣讀書 Top250

它的網址是:https://book.douban.com/top250

項目難度:⭐⭐

import io
import sys
import requests
from bs4 import BeautifulSoup
###運作出現亂碼時可以修改編碼方式
#sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
###
headers = {
  'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
}
res = requests.get('https://book.douban.com/top250', headers=headers)
soup = BeautifulSoup(res.text, 'lxml')
print(soup)
           

python 列印資訊時會有限制 我們将列印的編碼改成gb18030

headers表示我們的請求網頁的頭,對于沒有headers的請求可能會被伺服器判定為爬蟲而拒絕提供服務

通過 from bs4 import BeautifulSoup 語句導入 BeautifulSoup

然後使用 BeautifulSoup(res.text, lxmlr’) 語句将網頁源代碼的字元串形式解析成了 BeautifulSoup 對象

解析成了 BeautifulSoup 對象可以較為友善的提取我們需要的資訊

那麼如何提取資訊呢?

BeautifulSoup 為我們提供了一些方法

find()方法和find_all()方法:

  • find() 傳回符合條件的首個資料
  • find_all() 傳回符合條件的所有**資料
import io
import sys
import requests
from bs4 import BeautifulSoup
#如果出現了亂碼報錯,可以修改編碼形式
#sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
#
headers = {
  'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
}
res = requests.get('https://book.douban.com/top250', headers=headers)
soup = BeautifulSoup(res.text, 'lxml')
print(soup.find('a'))
#<a class="nav-login" href="https://accounts.douban.com/passport/login?source=book" target="_blank" rel="external nofollow"  rel="nofollow">登入/注冊</a>
print(soup.find_all('a'))
#傳回一個清單 包含了所有的<a>标簽
           

除了傳入 HTML 标簽名稱外,BeautifulSoup 還支援熟悉的定位

# 定位div開頭 同時id為'doubanapp-tip的标簽
soup.find('div', id='doubanapp-tip')
# 定位a擡頭 同時class為rating_nums的标簽
soup.find_all('span', class_='rating_nums')
#class是python中定義類的關鍵字,是以用class_表示HTML中的class
           

HTML定位方法:https://www.cnblogs.com/bosslv/p/8992410.html

理論看百遍,不如上手一練

4.實踐項目1:自如較高價的電梯大廈資料抓取

首先是先說一聲抱歉,在課程設計時,沒有想到自如較高價的電梯大廈在價格上增加一定程度的反爬措施,是以自如較高價的電梯大廈的價格在本節不讨論,在以後的課程中,我們會詳細講解相關的方法。

本節内容為作者原創的項目,整體爬取過程有4星的難度,建議讀者跟着課程一步一步的來,如果有不明白的地方,可以在群裡面與其他夥伴進行交流。

在輸出本節内容時,請注明來源,Datawhale自動化辦公課程,謝謝~

日前 , 國務院辦公廳印發《關于加快培育和發展住房租賃市場的若幹意見》,你是某新媒體公司的一名員工,老闆希望對武漢的租房情況進行深度調研與分析,你想調查自如較高價的電梯大廈的資料情況。根據工作的安排,你調研的是自如較高價的電梯大廈武漢房屋出租分析的任務。

項目難度:⭐⭐⭐⭐

自如較高價的電梯大廈官網:https://wh.ziroom.com/z/z/

通過觀察官網你發現

第1頁的網頁為:https://wh.ziroom.com/z/p1/

第2頁的網頁為:https://wh.ziroom.com/z/p2/

第3頁的網頁為:https://wh.ziroom.com/z/p3/

第50頁的網頁為:https://wh.ziroom.com/z/p50/

你繼續觀察,發現

房屋的資訊網頁為類似于:https://wh.ziroom.com/x/741955798.html

即:https://wh.ziroom.com/x/XXXX.html

是以你有了思路,通過通路自如較高價的電梯大廈的網站,擷取每個房間後面的數字号 然後通過數字号通路房屋的直接資訊,然後抓取房屋的資訊儲存在excel中

于是你通路了房屋的網頁:https://wh.ziroom.com/x/741955798.html

通過觀察房屋的網頁,你發現是這些資訊是你需要的

房屋的名稱,房屋的面積,房屋的朝向,房屋的戶型,房屋的位置,房屋的樓層,是否有電梯,房屋的年代,門鎖情況,綠化情況

但是你遇到了困難,不知道這些資訊的标簽資訊,不能用beautifulsoup對他們進行定位

通過百度查詢,浏覽器按F12時能進入源代碼模式 或者 點選右鍵進入審查元素

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-Bjlr2z0g-1624703354367)(.\圖檔\圖5.1.png)]

點選左上角的箭頭,可以定位到元素的位置

方法掌握後你開始寫代碼了

import requests
from bs4 import BeautifulSoup
import random
import time
import csv
           

寫到這裡的時候,你想到,我多次通路自如的官網,如果隻用一個UA頭豈不是很容易被反爬蟲識别

你想到,我可以做很多個UA頭,然後每次通路的時候可以随機選一個,想到這裡,你直呼自己是個天才

于是,你到網上找到了很多UA頭資訊

#這裡增加了很多user_agent
#能一定程度能保護爬蟲
user_agent = [
    "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
    "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
    "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0",
    "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko",
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
    "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
    "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
    "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11",
    "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)"]
           

現在開始正式開始爬取資料了

房屋的名稱,房屋的價格,房屋的面積,房屋的朝向,房屋的戶型,房屋的位置,房屋的樓層,是否有電梯,房屋的年代,門鎖情況,綠化情況

你思考爬取的資訊應該儲存到csv檔案中,于是你導入了csv包 并簡單的了解了CSV包的用法

第一步,是要擷取房屋的數字标簽

于是你打開了自如的官網,用浏覽器的元素進行定位

發現房屋的資訊标簽都是這個

< a href=“dd//wh.ziroom.com/x/741955798.html” target="_blank"> 房屋名稱< /a >

聰明的你,随手寫下了這個代碼,便能爬取自如前50頁

def get_info():
    csvheader=['名稱','面積','朝向','戶型','位置','樓層','是否有電梯','建成時間',' 門鎖','綠化']
    with open('wuhan_ziru.csv', 'a+', newline='') as csvfile:
        writer  = csv.writer(csvfile)
        writer.writerow(csvheader)
        for i in range(1,50):  #總共有50頁
            print('正在爬取自如第%s頁'%i)
            timelist=[1,2,3]
            print('有點累了,需要休息一下啦(¬㉨¬)')
            time.sleep(random.choice(timelist))   #休息1-3秒,防止給對方伺服器過大的壓力!!!
            url='https://wh.ziroom.com/z/p%s/'%i
            headers = {'User-Agent': random.choice(user_agent)}
            r = requests.get(url, headers=headers)
            r.encoding = r.apparent_encoding
            soup = BeautifulSoup(r.text, 'lxml')
            all_info = soup.find_all('div', class_='info-box')
            print('開始幹活咯(๑>؂<๑)')
            for info in all_info:
                href = info.find('a')
                if href !=None:
                    href='https:'+href['href']
                    try:
                        print('正在爬取%s'%href)
                        house_info=get_house_info(href)
                        writer.writerow(house_info)
                    except:
                        print('出錯啦,%s進不去啦( •̥́ ˍ •̀ू )'%href)
           

通過研究發現了你需要定位的資訊 通過标簽頭 h1 li span 和class的值對标簽進行定位

<h1 class="Z_name"><i class="status iconicon_sign"></i>自如友家·電建地産盛世江城·4房間-05卧</h1>
----
<div class="Z_home_info">
<div class="Z_home_b clearfix">
	<dl class="">
        <dd>8.4㎡</dd>
        <dt>使用面積</dt>
    </dl>
    <dl class="">
        <dd>朝南</dd>
        <dt>朝向</dt>
    </dl>
	<dl class="">
        <dd>4室1廳</dd>
        <dt>戶型</dt>
    </dl>
</div>
</div>
----
<ul class="Z_home_o">
    <li>
        <span class="la">位置</span><span class="va">
        <span class="ad">小區距2号線長港路站步行約231米</span>
     </li>
        <span class="la">樓層</span><span class="va">6/43</span>
    </li>
    <li>
        <span class="la">電梯</span><span class="va">有</span>
    </li>
    <li>
        <span class="la">年代</span><span class="va">2016年建成</span>
    </li>
    <li>
        <span class="la">門鎖</span><span class="va">智能門鎖</span>
    </li>
    <li>
        <span class="la">綠化</span><span class="va">35%</span>
    </li>          
</ul>
           

通過對上面标簽的研究你完成了所有的代碼

import requests
from bs4 import BeautifulSoup
import random
import time
import csv

#這裡增加了很多user_agent
#能一定程度能保護爬蟲
user_agent = [
    "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
    "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
    "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0",
    "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko",
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
    "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
    "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
    "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11",
    "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)"]

def get_info():
    csvheader=['名稱','面積','朝向','戶型','位置','樓層','是否有電梯','建成時間',' 門鎖','綠化']
    with open('wuhan_ziru.csv', 'a+', newline='') as csvfile:
        writer  = csv.writer(csvfile)
        writer.writerow(csvheader)
        for i in range(1,50):  #總共有50頁
            print('正在爬取自如第%s頁'%i)
            timelist=[1,2,3]
            print('有點累了,需要休息一下啦(¬㉨¬)')
            time.sleep(random.choice(timelist))   #休息1-3秒,防止給對方伺服器過大的壓力!!!
            url='https://wh.ziroom.com/z/p%s/'%i
            headers = {'User-Agent': random.choice(user_agent)}
            r = requests.get(url, headers=headers)
            r.encoding = r.apparent_encoding
            soup = BeautifulSoup(r.text, 'lxml')
            all_info = soup.find_all('div', class_='info-box')
            print('開始幹活咯(๑>؂<๑)')
            for info in all_info:
                href = info.find('a')
                if href !=None:
                    href='https:'+href['href']
                    try:
                        print('正在爬取%s'%href)
                        house_info=get_house_info(href)
                        writer.writerow(house_info)
                    except:
                        print('出錯啦,%s進不去啦( •̥́ ˍ •̀ू )'%href)

def get_house_info(href):
    #得到房屋的資訊
    time.sleep(1)
    headers = {'User-Agent': random.choice(user_agent)}
    response = requests.get(url=href, headers=headers)
    response=response.content.decode('utf-8', 'ignore')
    soup = BeautifulSoup(response, 'lxml')
    name = soup.find('h1', class_='Z_name').text
    sinfo=soup.find('div', class_='Z_home_b clearfix').find_all('dd')
    area=sinfo[0].text
    orien=sinfo[1].text
    area_type=sinfo[2].text
    dinfo=soup.find('ul',class_='Z_home_o').find_all('li')
    location=dinfo[0].find('span',class_='va').text
    loucen=dinfo[1].find('span',class_='va').text
    dianti=dinfo[2].find('span',class_='va').text
    niandai=dinfo[3].find('span',class_='va').text
    mensuo=dinfo[4].find('span',class_='va').text
    lvhua=dinfo[5].find('span',class_='va').text
    ['名稱','面積','朝向','戶型','位置','樓層','是否有電梯','建成時間',' 門鎖','綠化']
    room_info=[name,area,orien,area_type,location,loucen,dianti,niandai,mensuo,lvhua]
    return room_info

if __name__ == '__main__':
    get_info()
           

運作完成後,會在檔案夾中看到剛才爬取好的資訊儲存在wuhan_ziru.csv中

5.實踐項目2:36kr資訊抓取與郵件發送

本節内容為作者原創的項目,課程難度為5星,建議讀者跟着課程一步一步的來,如果有不明白的地方,可以在群裡面與其他夥伴進行交流。

在輸出本節内容時,請注明來源,Datawhale自動化辦公課程,謝謝~

項目難度:⭐⭐⭐⭐⭐

完成了上面的實踐項目1後,你膨脹到不行,覺得自己太厲害了。通過前面的學習,你了解到使用python進行電子郵件的收發,突然有一天你想到,如果我用A賬戶進行發送,同時用B賬戶進行接受,在手機上安裝一個郵件接受的軟體,這樣就能完成資訊從pc端投送到移動端。

在這樣的思想上,就可以對動态變化的資訊進行監控,一旦資訊觸發了發送的條件,可以将資訊通過郵件投送到手機上,進而讓自己最快感覺到。

具體路徑是:

python爬蟲–>通過郵件A發送–>伺服器—>通過郵件B接收

是以我們本節的内容就是爬取36kr的資訊然後通過郵件發送

36kr官網:https://36kr.com/newsflashes

通過python發送郵件需要獲得pop3的授權碼

具體擷取方式可參考:

https://blog.csdn.net/wateryouyo/article/details/51766345

接下來就爬取36Kr的網站

通過觀察我們發現 消息的标簽為

<a class="item-title" rel="noopener noreferrer" target="_blank" href="/newsflashes/1218249313424001" target="_blank" rel="external nofollow"  sensors_operation_list="page_flow">中國平安:推動新方正集團聚集醫療健康等核心業務發展</a>
           

是以我們爬取的代碼為

需要注意的是,郵箱發送消息用的HTML的模式,而HTML模式下換行符号為 < br>

def main(): 
    print('正在爬取資料')
    url = 'https://36kr.com/newsflashes'
    headers = {'User-Agent': random.choice(user_agent)}
    response = requests.get(url, headers=headers)
    response=response.content.decode('utf-8', 'ignore')
    soup = BeautifulSoup(response, 'lxml')
    news = soup.find_all('a', class_='item-title')  
    news_list=[]
    for i in news:
        title=i.get_text()
        href='https://36kr.com'+i['href']
        news_list.append(title+'<br>'+href)
    info='<br></br>'.join(news_list)
           

接下來就是配置郵箱的發送資訊

smtpserver = 'smtp.qq.com'

# 發送郵箱使用者名密碼
user = ''
password = ''

# 發送和接收郵箱
sender = ''
receive = ''

def send_email(content):
    # 通過QQ郵箱發送
    title='36kr快訊'
    subject = title
    msg = MIMEText(content, 'html', 'utf-8')
    msg['Subject'] = Header(subject, 'utf-8')
    msg['From'] = sender
    msg['To'] = receive
    # SSL協定端口号要使用465
    smtp = smtplib.SMTP_SSL(smtpserver, 465)  # 這裡是伺服器端口!
    # HELO 向伺服器辨別使用者身份
    smtp.helo(smtpserver)
    # 伺服器傳回結果确認
    smtp.ehlo(smtpserver)
    # 登入郵箱伺服器使用者名和密碼
    smtp.login(user, password)
    smtp.sendmail(sender, receive, msg.as_string())
    smtp.quit()
           

最後我們的整個代碼檔案為

import requests
import random
from bs4 import BeautifulSoup
import smtplib  # 發送郵件子產品
from email.mime.text import MIMEText  # 定義郵件内容
from email.header import Header  # 定義郵件标題

smtpserver = 'smtp.qq.com'

# 發送郵箱使用者名密碼
user = ''
password = ''

# 發送和接收郵箱
sender = ''
receive = ''

user_agent = [
    "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
    "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
    "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0",
    "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko",
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
    "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
    "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
    "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11",
    "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)"]

def main():
    print('正在爬取資料')
    url = 'https://36kr.com/newsflashes'
    headers = {'User-Agent': random.choice(user_agent)}
    response = requests.get(url, headers=headers)
    response=response.content.decode('utf-8', 'ignore')
    soup = BeautifulSoup(response, 'lxml')
    news = soup.find_all('a', class_='item-title')  
    news_list=[]
    for i in news:
        title=i.get_text()
        href='https://36kr.com'+i['href']
        news_list.append(title+'<br>'+href)
    info='<br></br>'.join(news_list)
    print('正在發送資訊')
    send_email(info)

def send_email(content):
    # 通過QQ郵箱發送
    title='36kr快訊'
    subject = title
    msg = MIMEText(content, 'html', 'utf-8')
    msg['Subject'] = Header(subject, 'utf-8')
    msg['From'] = sender
    msg['To'] = receive
    # SSL協定端口号要使用465
    smtp = smtplib.SMTP_SSL(smtpserver, 465)  # 這裡是伺服器端口!
    # HELO 向伺服器辨別使用者身份
    smtp.helo(smtpserver)
    # 伺服器傳回結果确認
    smtp.ehlo(smtpserver)
    # 登入郵箱伺服器使用者名和密碼
    smtp.login(user, password)
    smtp.sendmail(sender, receive, msg.as_string())
    smtp.quit()

if __name__ == '__main__':
    main()
           

Task5 END.

小結,學習了這一章,個人平時用beautifulsoup比較少,使用Xpath比較熟練。另外對于工程項目來講,scrap也會更友善一些。

— By: 牧小熊

華中農業大學研究所學生,Datawhale成員, Datawhale優秀原創作者

知乎:https://www.zhihu.com/people/muxiaoxiong

關于Datawhale: Datawhale是一個專注于資料科學與AI領域的開源組織,彙集了衆多領域院校和知名企業的優秀學習者,聚合了一群有開源精神和探索精神的團隊成員。Datawhale 以“for the learner,和學習者一起成長”為願景,鼓勵真實地展現自我、開放包容、互信互助、敢于試錯和勇于擔當。同時 Datawhale 用開源的理念去探索開源内容、開源學習和開源方案,賦能人才培養,助力人才成長,建立起人與人,人與知識,人與企業和人與未來的聯結。 本次資料挖掘路徑學習,專題知識将在天池分享,詳情可關注Datawhale:

Datawhale OfficeAutomation Task05 爬蟲入門與綜合應用Task5 爬蟲入門與綜合應用

END.**

— By: 牧小熊

華中農業大學研究所學生,Datawhale成員, Datawhale優秀原創作者

知乎:https://www.zhihu.com/people/muxiaoxiong

關于Datawhale: Datawhale是一個專注于資料科學與AI領域的開源組織,彙集了衆多領域院校和知名企業的優秀學習者,聚合了一群有開源精神和探索精神的團隊成員。Datawhale 以“for the learner,和學習者一起成長”為願景,鼓勵真實地展現自我、開放包容、互信互助、敢于試錯和勇于擔當。同時 Datawhale 用開源的理念去探索開源内容、開源學習和開源方案,賦能人才培養,助力人才成長,建立起人與人,人與知識,人與企業和人與未來的聯結。 本次資料挖掘路徑學習,專題知識将在天池分享,詳情可關注Datawhale:

[外鍊圖檔轉存中…(img-X5DvNF4z-1624703354369)]