<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>利用規約 on Xainome Blog</title>
    <link>https://xainome-blog.pages.dev/tags/%E5%88%A9%E7%94%A8%E8%A6%8F%E7%B4%84/</link>
    <description>Recent content in 利用規約 on Xainome Blog</description>
    <generator>Hugo</generator>
    <language>ja-JP</language>
    <lastBuildDate>Fri, 30 Aug 2024 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://xainome-blog.pages.dev/tags/%E5%88%A9%E7%94%A8%E8%A6%8F%E7%B4%84/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>人間っぽいふるまいをするスクレイピングを検討した話</title>
      <link>https://xainome-blog.pages.dev/posts/2024/08/web-scraping/</link>
      <pubDate>Fri, 30 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://xainome-blog.pages.dev/posts/2024/08/web-scraping/</guid>
      <description>&lt;h2 id=&#34;前提利用規約に違反しないこと&#34;&gt;前提：利用規約に違反しないこと&lt;/h2&gt;
&lt;p&gt;前提として&lt;strong&gt;利用規約&lt;/strong&gt;に違反する行為はやめたほうが良いと考えています。&lt;/p&gt;
&lt;p&gt;法的に訴えられても文句は言えないですし。&lt;/p&gt;
&lt;p&gt;多くの人が利用している&lt;a href=&#34;https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=GLSBYFE9MGKKQXXM&#34;&gt;amazonなども利用規約&lt;/a&gt;で禁止しているので、スクレイピングをする際はしっかりと利用規約を読んだうえで行ってください。許可が下りれば問題ないとは思いますが。&lt;/p&gt;
&lt;h3 id=&#34;サイト側のスクレイピング対策&#34;&gt;サイト側のスクレイピング対策&lt;/h3&gt;
&lt;p&gt;本題に入ります。&lt;/p&gt;
&lt;p&gt;サイト側でスクレイピングを弾く設定がいくつか存在します。例えばユーザーっぽくないふるまいでサイトにアクセスした場合。あるいは特定のサイトを経由しないと見れないURLに直接アクセスした場合。ゆうまでもなく連続でいろんなURLにアクセスした場合。&lt;/p&gt;
&lt;p&gt;連続でアクセスされるとサーバーに負荷がかかるので、これが弾かれるのは想像に難くないと思います。&lt;/p&gt;
&lt;h3 id=&#34;スクレイピング対策を避ける方法&#34;&gt;スクレイピング対策を避ける方法&lt;/h3&gt;
&lt;p&gt;ただ、スクレイピングするされた場合、上記のような特徴が存在します。&lt;/p&gt;
&lt;p&gt;この辺はアクセスログを監視すると見れるかと思います。おそらくですが。&lt;/p&gt;
&lt;p&gt;では人間っぽくふるまうにはどうしたらよいか調べた中で書いてみます。&lt;/p&gt;
&lt;p&gt;一応言語はpythonを使います。他の言語でもできるかと思うので参考程度にはなるかと思います。&lt;/p&gt;
&lt;h3 id=&#34;pythonでのスクレイピング基礎&#34;&gt;Pythonでのスクレイピング基礎&lt;/h3&gt;
&lt;p&gt;一般的にpythonでのスクレイピングではrequestsモジュールを使います。他にもseleniumやpyppeteerなどがありますが、一旦requestsを使っていきます。&lt;/p&gt;
&lt;p&gt;インストールはpipを使います。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pip install requests
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;もしpythonのバージョンなどで分けてる場合はこちら&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;py -3.12 -m pip install requests
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;インストールが終わったらアクセスしてみましょう。今回は私のサイトにアクセスしてみます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import requests

response = requests.get(&amp;#39;https://xainome.blog/’)
print(response.text)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;こうするとHTMLの中身を取得することができます。&lt;/p&gt;
&lt;p&gt;そこから取得したい情報があればBeautifulSoupを使って要素を取り出してみましょう。まずはインストール&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pip install beautifulsoup4
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;実際のアクセスとhtmlの解析&#34;&gt;実際のアクセスとHTMLの解析&lt;/h3&gt;
&lt;p&gt;インストールができたらHTMLを解析します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;from bs4 import BeautifulSoup

soup = BeautifulSoup(html_parse, &amp;#39;html.parser&amp;#39;)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これで解析の準備ができました。解析の話は本題とそれますのでここまでにしようと思います。&lt;/p&gt;
&lt;p&gt;解析やHTMLの情報取得に興味があれば調べてもいいですし、生成AIに聞いてみるでもいいと思います。このようなコード、銘柄、市場などが一覧で取得することができます。もちろんAPIを使うという手もありますが。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;東京証券取引所_銘柄一覧_グロース&#34; loading=&#34;lazy&#34; src=&#34;https://xainome-blog.pages.dev/posts/2024/08/web-scraping/images/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-08-30-091809.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;リクエストヘッダーの設定&#34;&gt;リクエストヘッダーの設定&lt;/h3&gt;
&lt;p&gt;実は通常のリクエストを送る場合ユーザーではなく、言語別のリクエストを送っていることになります。&lt;/p&gt;
&lt;p&gt;リクエストにはRequests Headersというものが設定できます。これは私たちがPCやスマホでサイトにアクセスするときも送信されています。&lt;/p&gt;
&lt;p&gt;まずは設定してみます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;headers = {
    &amp;#39;User-agent&amp;#39; = &amp;#39;Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36&amp;#39;
}
response = requests.get(search_url, headers=headers)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;こんな感じで設定します。特に何も設定しなかった場合、&amp;lsquo;python-requests/2.25.1&amp;rsquo;という設定で送られるみたいです。恐らくjsやGoとかでも似たような設定になるかと思います。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
