実現したいこと
お世話になっております。
pythonで**『スクレイピングし、そのデータをKWに沿って、シート毎に格納する方法』**を探しております。
1つのKWをスクレイピングし、シートに格納するところまでは行けたのですが、2つ以上のKWを検索した際のURLをそれぞれのシートに記入するところで一週間近く作業が止まっております、、。
何卒、ご教授頂けますと幸いです。
以下が、試行錯誤したコードとなります。
ソースコード
前提:エクセル内に『Sheet1』というシートが存在する。
結果:『犬』『猫』でGoogle検索した際のURLが、『Sheet1』のシート内にA列・B列の間に列追加し、新しくできたB2以降に書き込みされる。
(『犬』『猫』のシートは作成されるも、そこに書き込みがされない。)
理想:検索したKWに応じて、『犬』『猫』の各シートにA列・B列の間に列追加し、新しくできたB2以降に書き込みされる。
python
1import openpyxl 2import datetime 3import os 4from urllib import request as req 5from urllib import error 6from urllib import parse 7import bs4 8from time import sleep 9 10#KWを入力すると、そのKWでのGoogleの文字検索結果を表示。range(0,50,10)で5ページ目までをスクレイピング。range(0,40,10)だと4ページ目までをスクレイピング。 11keyword = ["犬","猫"] 12urls = [] 13sleepCounter = 0 14for keywords in keyword: 15 if not os.path.exists(keywords): 16 os.mkdir(keywords) 17 urlKeyword = parse.quote(keywords) 18 x=0 19 for x in range(0,21,10): 20 url = "https://www.google.com/search?q="+ urlKeyword +"&rlz=1C1GCEA_enJP788JP788&ei=gI5NXN2uHYvBoATW1JPACQ&start="+ str(x) +"&sa=N&ved=0ahUKEwjd7p_d5o3gAhWLIIgKHVbqBJgQ8tMDCIEC&biw=1920&bih=969" 21 headers = {"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0",} 22 request = req.Request(url=url, headers=headers) 23 page = req.urlopen(request) 24#Google検索結果のタイトル直下にある緑色のURLを取得し、変数urlsに格納 25 html = page.read().decode('utf-8') 26 htmls = bs4.BeautifulSoup(html, "html.parser") 27 for k in htmls.find_all("cite",class_="iUh30"): 28 sleepCounter += 1 29 if sleepCounter > 1: 30 sleep(1) 31 sleepCounter = 0 32 urls.append(k.string) 33 34# ================================================================================================== 35 36# ブックを取得 37book = openpyxl.load_workbook('~~~Excel名~~~') 38# keywordを変数newsheetにコピー 39newsheet = keyword 40# シートを取得(現在、『犬』『猫』が存在している) 41removesheet = book.sheetnames 42# newsheetから、現在シートにあるシート名を削除する 43for a in removesheet: 44 try: 45 newsheet.remove(a) 46 except ValueError: 47 pass 48# newsheetにある要素のシート名を、エクセル内に作成する 49for b in newsheet: 50 book.create_sheet(str(b)) 51# シートを取得 52sheet = book['Sheet1'] 53# シートのA,B列の間に行を追加 54sheet.insert_cols(2,1) 55# シートのB1に書き込み 56sheet["B1"] = datetime.date.today() 57# シートのB2から書き込み 58for i,s in enumerate(urls): 59 cell = 'B{}'.format(i+2) 60 sheet[cell] = s 61# 保存する 62book.save('~~~Excel名~~~') 63
試したこと
◆スクレイピングしたURLの先頭にKWをつけて分別し、シート毎に記入
◆変数を動的生成にし、変数毎にデータを格納し、シート毎に記入
回答1件
あなたの回答
tips
プレビュー