# Python 網路爬蟲 Web Crawler HTML ###### tags: `python` ## 基本流程 1. 連線到特定網址,抓取資料 2. 解析資料,取得實際想要的部分 ### 抓取資料 關鍵:讓程式模仿一個普通使用者的行為 ### 解析資料(JSON在另一篇) 格式:HTML ### HTML格式資料解析 使用第三方套件BeautifulSoup 安裝:pip install beautifulsoup4 ### 範例抓ptt電影版 用urllib內的request [ptt電影版](https://www.ptt.cc/bbs/movie/index.html) #### 抓資料 ```python= import urllib.request as req #連線 url = "https://www.ptt.cc/bbs/movie/index.html" with req.urlopen(url) as response: data=response.read().decode('utf-8') print(data) ``` >連線會被拒絕 開啟網頁network,找到連線細節,點選index.html 找到 user-agent ```python= import urllib.request as req #連線 url = "https://www.ptt.cc/bbs/movie/index.html" #建立一個Request物件,附加Request headers的資訊 request = req.Request(url, headers={ "User-Agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36" }) with req.urlopen(request) as response: data=response.read().decode('utf-8') print(data) ``` #### 解析資料(原始碼) 使用第三方套件:beautifulsoup > bs4.BeautifulSoup(要處理的原始碼,"格式") >> 格式可以放:html.parser >> [格式參考](https://blog.csdn.net/Winterto1990/article/details/47806175) | 解析器 | 說明 | | ----------- | ---- | | html parser | Python 3.2後開始內建,主要解析為HTML | | lxml | 以C語言編寫,解析速度快,支援性廣。主要解析為HTML | | lxml-xml | 以C語言編寫,解析速度快,支援性廣。主要解析為XML | | html5lib | 使用瀏覽器相同的方式進行解析,所以相容性相對的好,缺點是速度慢。 | 解析器安裝方式 pip install lxml pip install lxml-xml pip install html5lib >find("標籤",class_="class名") 找一個符合條件的 >find_all("標籤",class_="class名") 找到所有符合條件的 >.string 取文字 ```python= import bs4 #美化原始碼格式 root = bs4.BeautifulSoup(data,"html.parser") title=root.title #抓title標籤 stitle = root.title.string #抓標籤內的文字 t = root.find_all("div", class_="tiltle") #尋找class="title" 的div標籤 for title in t : if title.a != None: #如果標題包含a標籤(沒有被刪除),印出來 print(title.a.string) ``` ### 爬104 用requests ```python= import requests from bs4 import BeautifulSoup import lxml url = ( 'https://www.104.com.tw/jobs/search/?ro=0&keyword=Python&jobcatExpansionType=0&area=6001001005&order=15&asc=0&page=1&mode=s&jobsource=2018indexpoc') dom = requests.get(url).text soup = BeautifulSoup(dom, 'lxml') jobs = soup.find_all('article', class_="b-block--top-bord job-list-item b-clearfix js-job-item") # print(jobs[0].find('a',class_="js-job-link").text) for job in jobs: print(job.find('a',class_="js-job-link").text) print(job.get('data-cust-name')) print(job.find('p').text) print(job.find('span', class_="b-tag--default").text) print("----------------------------------------") ```