seleniumとpyppeteerでブラウザ操作

Selenium

from selenium import webdriver

driver = webdriver.Firefox()

url = 'https://www.yahoo.co.jp/'

driver.get("https://tool-taro.com/wget/")

elem = driver.find_element_by_name("value")
elem.clear()
elem.send_keys(url)

elem = driver.find_element_by_class_name("lockable")
elem.click()

elem = driver.find_element_by_name("title")
title = elem.get_attribute("value")

print(title)

elem = driver.find_element_by_name("result")
value = elem.get_attribute("value")

print(value)

Pyppeteer

import asyncio
from pyppeteer import launch


async def main():

    browser = await launch()
    page = await browser.newPage()

    await page.goto('https://tool-taro.com/wget/')

    # URL入力
    await page.type('div.box_whois_l.box_wget03 > input[type="text"]',
                    'https://www.yahoo.co.jp/')

    # 取得ボタンクリック
    await page.click('div.box_whois_r > div > input')

    # 3秒待機
    await page.waitFor(3000)

    # タイトル
    element = await page.querySelector('#new > div.box_wget01 > textarea')
    title = await page.evaluate('(element) => element.value', element)

    # 本文
    element = await page.querySelector('#new > div.box_wget02 > textarea')
    description = await page.evaluate('(element) => element.value', element)

    print(title)
    print(description)

    # 画面キャプション
    await page.screenshot({'path': 'example.png'})
    await browser.close()


asyncio.get_event_loop().run_until_complete(main())

Beautifulsoupでrowspan・colspanにデータ挿入

from bs4 import BeautifulSoup
import pprint

html = '''
<table border="1">
  <tr>
      <th>ホット/コールド</th>
      <th>種類</th>
      <th>サイズ</th>
      <th>価格(円)</th>
  </tr>
  <tr>
      <th rowspan="2">ホット</th>
      <td>コーヒー</td>
      <td>S,M</td>
      <td>150,200</td>
  </tr>
  <tr>
      <!-- 上のセルと結合して消えるセル -->
      <td>紅茶</td>
      <td>Sサイズのみ</td>
      <td>170</td>
  </tr>
  <tr>
      <th>コールド</th>
      <td>コーラ</td>
      <td colspan="2">検討中</td>
      <!-- 左のセルと結合して消えるセル -->
  </tr>
</table>
'''

soup = BeautifulSoup(html, 'html.parser')

data = []
span = []

# リスト作成
for y, trs in enumerate(soup.select('table > tr')):

    temp = []

    for x, td in enumerate(trs.find_all(['th', 'td'])):

        cell = td.get_text(strip=True)
        temp.append(cell)

        # spanリスト作成
        rowspan = td.get('rowspan')
        colspan = td.get('colspan')

        if rowspan or colspan:
            span.append({
                'x': x,
                'y': y,
                'row': int(rowspan) if rowspan else 0,
                'col': int(colspan) if colspan else 0,
                'data': cell
            })

    data.append(temp)

# リスト確認
pprint.pprint(data)
print('-' * 20)

# spanリスト確認
pprint.pprint(span)
print('-' * 20)

# 行の最大値
row_max = len(data)

# リストに挿入
for i in span:

    # rowspan
    if i['row'] > 1 and (i['y'] + i['row']) <= row_max:
        for n in range(1, i['row']):

            data[i['y'] + n].insert(i['x'], None)
            # data[i['y'] + n].insert(i['x'], i['data'])

    # colspan
    if i['col'] > 1:
        for n in range(1, i['col']):

            data[i['y']].insert(i['x'] + n, None)
            # data[i['y']].insert(i['x'] + n, i['data'])

# リスト確認
pprint.pprint(data)

Chrome book C223Nが起動不能、交換

imabari.hateblo.jp

Chrome book早速届いて起動したのですが電源ボタンを2・3回押してやっと起動

そのあとアップデートがかかり再起動

次はメールアドレスを入れるところで入力不能で再起動

メールアドレスはとおり、ログインできたのでアカウントを変えようとログアウトすると画面が真っ黒のまま起動不能になりました

開封後15分も経ってないかも

症状

電源ランプはついたままで画面が真っ黒

ESCと↻と電源でもダメ

↻と電源でもダメ

修理

18:30から19:00までASUSに電話したけどつながらなかったので次の日メールで日本で修理に可能とのことで郵送 + 12/3 日本ASUSに郵送 + 12/4 日本ASUSに到着 + 12/7 症状確認、C223NA-GJ0018に交換または返金

Scrapyでサイトマップからスクレイピング

スパイダー — Scrapy 1.2.2 ドキュメント

# -*- coding: utf-8 -*-
from scrapy.spiders import SitemapSpider


class MySpider(SitemapSpider):
    name = 'wired_sitemap'

    # XMLサイトマップのURLのリスト。
    # robots.txtのURLを指定すると、SitemapディレクティブからXMLサイトマップのURLを取得する。

    sitemap_urls = ['https://wired.jp/sitemap.xml']

    # サイトマップインデックスからたどるサイトマップURLの正規表現のリスト。
    # このリストの正規表現にマッチするURLのサイトマップのみをたどる。
    # sitemap_followを指定しない場合は、すべてのサイトマップをたどる。

    sitemap_follow = ['2018-10']

    # サイトマップに含まれるURLを処理するコールバック関数を指定するルールのリスト。
    # ルールは (正規表現, 正規表現にマッチするURLを処理するコールバック関数) という2要素のタプルで指定する。
    # sitemap_rulesを指定しない場合はすべてのURLのコールバック関数はparseメソッドとなる。

    sitemap_rules = [(r'/2018/10/', 'parse')]

    def parse(self, response):
        i = {}
        i['title'] = response.css(
            'article.article-detail > header > h1::text').extract_first()
        return i

本文抽出

kanji.hatenablog.jp

github.com

import time

import requests
from bs4 import BeautifulSoup
from extractcontent3 import ExtractContent

headers = {
    'User-Agent':
    'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko'
}


def scraping(url):

    r = requests.get(url, headers=headers)

    if r.status_code == requests.codes.ok:

        r.encoding = r.apparent_encoding

        extractor = ExtractContent()
        extractor.analyse(r.text)

        text, title = extractor.as_text()

        print(title)
        print(text)
        print('-' * 20)


# メイン
if __name__ == '__main__':

    url = 'https://www.city.imabari.ehime.jp/'

    r = requests.get(url, headers=headers)

    if r.status_code == requests.codes.ok:

        soup = BeautifulSoup(r.content, 'html5lib')

        for i in soup.select('div#top_osirse > dl > dd > a'):
            scraping(i.get('href'))