2017年8月19日 星期六

[Python] python google alert 爬蟲教學

目標網頁:Google Alert (https://www.google.com.tw/alerts?hl=zh-tw)
目標:透過爬蟲抓取google alert指定關鍵字,搜尋資料結果。

1.      分析目標網頁為靜態網頁還是動態網頁。靜態網頁是指資料就寫在一開始進入網頁的HTML原始碼裡,此種網頁比較好利用爬蟲去抓取,不用透過模擬瀏覽器的方式,就能取得網頁資料。但是google alert網頁是屬於動態網頁,就比較麻煩須先模擬網頁瀏覽器,執行至google alert畫面,將關鍵字輸入,才能取得結果資料。

2.      使用python套件Beautiful Soup來抓取網頁HTML DOM結構,Beautiful Soup是一個不錯的爬蟲工具,在網路上有很多人使用,其技術問題比較容易在網路上找到解答。Python2Python3有不同的安裝方法(請自行參考其官方網站),在windows上面可以用pip install beautifulsoup4來安裝套件。

3.      透過python模擬chrome並開啟google alert網頁,範例程式碼。
driver = webdriver.Chrome()
driver.get("https://www.google.com.tw/alerts")

4.      自動在google alert頁面輸入關鍵字。query_divgoogle alert網頁inputidsend_keys為模擬輸入值,keyword為想要查詢的關鍵字。輸入完畢後,網頁會顯示搜尋結果。
sbox = driver.find_element_by_id("query_div")
input = sbox.find_element_by_xpath("//input[1]")
input.send_keys(keyword)

5.      分析結果資料,並輸入進資料庫。
soup = BeautifulSoup(driver.page_source, "html.parser")
for obj in soup.find_all("li", attrs={'class': 'result'}):
    content = BeautifulSoup(str(obj), "html.parser")
    result_title_link = content.find("a",attrs={'class': 'result_title_link'})

    print(re.sub(SPACE_RE, '',
          result_title_link.text.encode("utf8"))) #title
    print result_title_link["href"] #url

    result_source_data = ''
    result_source = content.find("div",attrs={'class':    'result_source'})
    if(result_source != None):
        print(re.sub(SPACE_RE, '', result_source.text)) #source
        result_source_data = re.sub(SPACE_RE, '', result_source.text)

    img_data = ''
    img = content.find('img')
    if(img != None):
        print(img["src"])
        img_data = img["src"]
        snippet = content.find("span",attrs={'class': 'snippet'})

    if(snippet != None):
        print(re.sub(SPACE_RE, '', snippet.text.encode("utf8") ))
        snippet = re.sub(SPACE_RE, '', snippet.text.encode("utf8") )

其上面程式碼會顯示每一個結果的標題、網頁連結、來源、圖片與簡介。
再將資料存入資料庫就完成了。

6.      Python mysql資料庫範例
import mysql.connector
config = {
  'user': 'db_user',
  'password': 'db_password',
  'host': 'host_url',
  'database': 'your_database',
  'charset': 'utf8',
  'use_unicode': True,
}
cnx = mysql.connector.connect(**config)
cursor = cnx.cursor(buffered=True)

cursor.execute("select name from google_alert_keywords")
for keywords_obj in cursoro:
    keyword = keywords_obj[0] #即可抓取出資料庫的資料


/* 抓取結果…() */
/* 以下為存入資料庫 */
data_obj = {
'keyword': keyword,
'title': re.sub(SPACE_RE, '',result_title_link.text.encode("utf8")),
'source': result_source_data,
'img': img_data,
'url': result_title_link["href"],
'detail': snippet,
'time': datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
}

try:
    cursor.execute(("INSERT INTO google_alert_keywords_crawler (keyword, title, source, img, url, detail, time) VALUES (%(keyword)s, %(title)s, %(source)s, %(img)s, %(url)s, %(detail)s, %(time)s)"), data_obj)
except:
    print(cursor.statement)
    raise


沒有留言:

張貼留言

[CentOS] httpd port 9000 to 80

<VirtualHost *:80>     ServerName domain.name     ProxyRequests Off     ProxyVia Block     ProxyPreserveHost On     <Proxy *...