質問編集履歴

4

ハイパーリンクの設定を編集

2020/08/18 09:28

投稿

yoshi-fim
yoshi-fim

スコア3

test CHANGED
File without changes
test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  解決するまで実際に利用しているコードを載せます。
4
4
 
5
- https://github.com/yoshi-fim/crawler
5
+ [https://github.com/yoshi-fim/crawler](https://github.com/yoshi-fim/crawler)
6
6
 
7
7
 
8
8
 

3

Githubを公開

2020/08/18 09:28

投稿

yoshi-fim
yoshi-fim

スコア3

test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,23 @@
1
+ ----追記----
2
+
3
+ 解決するまで実際に利用しているコードを載せます。
4
+
5
+ https://github.com/yoshi-fim/crawler
6
+
7
+
8
+
9
+ crawler/hellowork/spiders/crawler.py
10
+
11
+ のpage_parse関数内で問題が発生しております。
12
+
13
+
14
+
15
+ ※営利目的での利用ではないため、利用規約には抵触しておりません。
16
+
17
+
18
+
19
+
20
+
1
21
  表題の書き方がわかりにくくすみません。以下にコードも交えて問題の内容を書いていきます。
2
22
 
3
23
 

2

item変数に入る値の説明について大幅に書き直しました

2020/08/18 09:27

投稿

yoshi-fim
yoshi-fim

スコア3

test CHANGED
File without changes
test CHANGED
@@ -52,7 +52,7 @@
52
52
 
53
53
  というように、記録しています。(実際に記述しているコードはかなり行数が多いため省いて書いております)
54
54
 
55
- この場合、metaから取得できるデータはparse関数で取得した
55
+ この場合、next_parse関数のitem = response.meta['item']から取得できるデータはparse関数で取得した
56
56
 
57
57
  ```python
58
58
 
@@ -60,7 +60,7 @@
60
60
 
61
61
  ```
62
62
 
63
- ようなものになるはずなのですこれがまれに
63
+ ようなものになる設計です。そして最後のyield itemでは
64
64
 
65
65
  ```python
66
66
 
@@ -70,9 +70,59 @@
70
70
 
71
71
  ```
72
72
 
73
- のようなデータを取得しう場合があります。
73
+ のようなデータをoutputする設計になっます。
74
74
 
75
+ ※'xxxxxxxxxxxxx'や'yyyyyyyyyyyyyyy'の値はクローリング対象ページのデータによって異なります。
76
+
77
+
78
+
79
+ **問題になっているのは、next_parse関数のitem = response.meta['item']でitemを取得しようとすると、前回のnext_parse関数実行時にyieldしたitemデータを取得してしまう、ということです。**
80
+
81
+
82
+
83
+ itemのデータがおかしいことを調べるために
84
+
85
+ ```python
86
+
87
+ def next_parse(self, response):
88
+
89
+ item = response.meta['item']
90
+
91
+ import pdb; pdb.set_trace()
92
+
93
+ item['yyy'] = response.css(.........
94
+
95
+
96
+
97
+ yield item
98
+
99
+ ```
100
+
75
- 調べてみたところ、前回next_parse関数実行時にyieldしたitemの内容と全く同じものでした。
101
+ 上記ようにpdb.set_trace()を入れて、item変数中身を確認ました。
102
+
103
+ この確認により、
104
+
105
+ ```python
106
+
107
+ item = {'xxx': 'xxxxxxxxxxxxxxx'}
108
+
109
+ ```
110
+
111
+ という感じで正常にitemが格納されていることもあれば、
112
+
113
+ ```python
114
+
115
+ item = {'xxx': 'xxxxxxxxxxxxxx',
116
+
117
+ 'yyy': 'yyyyyyyyyyyyyy'}
118
+
119
+ ```
120
+
121
+ という感じで、この時点では取得できているはずのない'yyy'の値が入っている場合があることが判明しました。
122
+
123
+
124
+
125
+
76
126
 
77
127
  今まで何度かScrapyコードを書いてきましたが、こういったことは初めてでした。
78
128
 

1

parse関数の最後にyieldを付与した

2020/08/18 08:15

投稿

yoshi-fim
yoshi-fim

スコア3

test CHANGED
File without changes
test CHANGED
@@ -30,7 +30,7 @@
30
30
 
31
31
  item['xxx'] = response.css(.........
32
32
 
33
- scrapy.Request(next_url, callback=self.next_parse, meta={'item': item}
33
+ yield scrapy.Request(next_url, callback=self.next_parse, meta={'item': item}
34
34
 
35
35
 
36
36