久しぶりにスクレイピングしたくなったのでrequestsでのプロキシ操作やヘッダー偽装や非同期処理など

# python + requestsを用いたスクレイピングでよく使うコード

忘れっぽいのでメモ

## ヘッダー偽装
```
pip install fake-useragent
```
```python
from fake_useragent import UserAgent
ua = UserAgent()
header = {'User-Agent': str(ua.chrome)}
res = requests.get('https://example.com/', headers=header)
```
[参考リンク](https://oshinko.org/%E3%83%98%E3%83%83%E3%83%80%E3%83%BC%E6%83%85%E5%A0%B1%E3%82%92%E5%81%BD%E8%A3%85%E3%81%97%E3%81%A6%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)

## プロキシ使用
```python
import requests

proxies = {
    'http' : 'http://user:pass@proxyip.0.0.1:80',
    'https' : 'http://user:pass@proxyip.0.0.1:80',
}

res = requests.get('https://google.com/', proxies=proxies)
```

### equests.exceptions.SSLErrorが発生する場合

```python
import requests

#警告無視
import urllib3
from urllib3.exceptions import InsecureRequestWarning
urllib3.disable_warnings(InsecureRequestWarning)

proxies = {
    'http' : 'http://user:pass@proxyip.0.0.1:80',
    'https' : 'http://user:pass@proxyip.0.0.1:80',
}

res = requests.get('https://google.com/', proxies=proxies, verify=False)
```
[参考リンク](https://odinseye.info/tech/python/requests-with-proxy/)


## プロキシをランダム使用

proxy.txtにプロキシを保存

```python
import random

#プロキシ読み込み
with open('proxy.txt') as f:
    proxies = f.readlines()
proxies = [pl.strip() for pl in proxies]

set_proxy = random.choice(proxies).split(":")
proxy = {
    'http' : f'http://{set_proxy[2]}:{set_proxy[3]}@{set_proxy[0]}:{set_proxy[1]}',
    'https' : f'http://{set_proxy[2]}:{set_proxy[3]}@{set_proxy[0]}:{set_proxy[1]}',
}
```

## プロキシを順番に使用

whileやforでタスクを複数回回したり、asyncで非同期処理する場合は割と便利

```python
import queue

#プロキシ読み込み
with open('proxy.txt') as f:
    proxies = f.readlines()
proxies = [pl.strip() for pl in proxies]

q = queue.Queue()

if q.empty():
    for i in proxies:
        q.put(i)

set_proxy = q.get().split(":")
proxy = {
    'http' : f'http://{set_proxy[2]}:{set_proxy[3]}@{set_proxy[0]}:{set_proxy[1]}',
    'https' : f'http://{set_proxy[2]}:{set_proxy[3]}@{set_proxy[0]}:{set_proxy[1]}',
}
```

## asyncioと組み合わせた例

あれ今ってasyncio.ensure_futureってないんだっけ...？
一応実行環境python 3.7.x
もし新しいバージョンの書き方あればどなたかコメントいただけると助かります。

```python
import asyncio
import aiohttp
import queue
from fake_useragent import UserAgent

#ヘッダー作成
ua = UserAgent()
header = {'User-Agent': str(ua.chrome)}

#プロキシ読み込み
with open('proxy.txt') as f:
    proxies = f.readlines()
proxies = [pl.strip() for pl in proxies]

#キュー作成
q = queue.Queue()

async def url_access(url):
    while True:
        if q.empty():
            for i in proxies:
                q.put(i)
    
        set_proxy = q.get().split(":")
        proxy = {
            'http' : f'http://{set_proxy[2]}:{set_proxy[3]}@{set_proxy[0]}:{set_proxy[1]}',
            'https' : f'http://{set_proxy[2]}:{set_proxy[3]}@{set_proxy[0]}:{set_proxy[1]}',
        }
        async with aiohttp.ClientSession(headers=header,connector=aiohttp.TCPConnector(verify_ssl=False)) as session:
                async with session.get(url,proxy=proxy,timeout=30) as response:
                    result = await response.text()

        await asyncio.sleep(30)

loop = asyncio.get_event_loop()
Urls = ["https://www.google.com/","https://www.yahoo.co.jp/","https://www.bing.com/"]
for u in Urls:
    asyncio.ensure_future(url_access(i))
loop.run_forever()
```

もっと効率よくかけるのかもしれないけどこんな感じでいけた。