redisを使ってクローラーとスクレイピング用の処理を分けています。
↓がクローラー側のソースコードです
Python
1import time 2import re 3 4import requests 5import lxml.html 6from redis import Redis 7from rq import Queue 8 9from mysql_test import MySQLQuery 10 11def main(): 12 """ 13 クローラーメイン処理 14 :return: 15 """ 16 17 q = Queue(connection=Redis) 18 db = MySQLQuery('ebook_htmls') 19 html_table = { 20 'urls': '', 21 'nums': '', 22 'htmls': '', 23 } 24 db.create_table(**html_table) 25 26 session = requests.Session() 27 response = session.get('https://gihyo.jp/dp') 28 urls = scrape_list_page(response) 29 for url in urls: 30 key = extract_key(url) 31 32 ebook_html = db.read(nums=str(key)) 33 if ebook_html is None: 34 time.sleep(1) 35 response = session.get(url) 36 37 html_table['urls'] = url 38 html_table['nums'] = key 39 html_table['htmls'] = response.content 40 41 q.enqueue('scraper_task.scrape', key, result_ttl=0) 42 43 db.close() 44 45 46 47def scrape_list_page(response): 48 """ 49 一覧ページのResponseから詳細ページのURLを抜き出す 50 :param response: 51 :return: 52 """ 53 root = lxml.html.fromstring(response.content) 54 root.make_links_absolute(response.url) 55 56 57 for a in root.cssselect('#listBook a[itemprop="url"]'): 58 url = a.get('href') 59 yield url 60 61def extract_key(url): 62 """ 63 URLからキーを抜き出す 64 :param url: 65 :return: 66 """ 67 68 m = re.search(r'/([^/]+)$', url) 69 return m.group(1) 70 71 72if __name__ == '__main__': 73 main()
これを実行すると↓のようにエラーがでます。
/tmp/pycharm_project_897/mysql_test.py:16: Warning: (1050, "Table 'ebook_htmls' already exists") self.cursor.execute('CREATE TABLE IF NOT EXISTS %s (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, %s)' % (self.table, key)) Traceback (most recent call last): File "/tmp/pycharm_project_897/crawl.py", line 73, in <module> main() File "/tmp/pycharm_project_897/crawl.py", line 41, in main q.enqueue('scraper_task.scrape', key, result_ttl=0) File "/home/tj/.conda/envs/menv_python3.6.6/lib/python3.6/site-packages/rq/queue.py", line 301, in enqueue job_id=job_id, at_front=at_front, meta=meta) File "/home/tj/.conda/envs/menv_python3.6.6/lib/python3.6/site-packages/rq/queue.py", line 253, in enqueue_call job = self.enqueue_job(job, at_front=at_front) File "/home/tj/.conda/envs/menv_python3.6.6/lib/python3.6/site-packages/rq/queue.py", line 308, in enqueue_job pipe = pipeline if pipeline is not None else self.connection._pipeline() TypeError: pipeline() missing 1 required positional argument: 'self'
エラーを出していると思われる場所enqueue_job関数内を見たのですが、さっぱりわかりません。@classmethodにして実行しましたが、エラーの出力は変わらず。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/23 15:46
2018/10/23 15:49 編集
2018/10/23 15:54